首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> C# >> 正文

用C++ Builder创建数字签名

  如果你在网络上传递一份数据,但却存在着种种不安全的因素,使你对数据能否原封不动地到达目的地而心存疑惑,这时,你就可以给数据加上数字签名,从而使对方可以通过验证签名来检查你所传过去的数据是否已被他人修改。

  一、程序原理

  数字签名的工作原理还是比较简单的,它是根据你所提供的原始数据,经过复杂的算法,产生特定的数据签名,对方通过同样的过程也产生签名,如果数据已被修改,那么就不可能得到两份一模一样的签名,从而就可判断数据已被他人修改。编程人员利用Windows的CAPI接口,就可以实现数据的加密、解密和数字签名。  

  二、程序清单

  下面用C++ Builder的语句来看一下它的具体实现过程。

  先来创建数字签名,假定其数据来自于一个文件。

  

 //变量声明:

  HCRYPTPROV hProv;
  
// CSP的句柄

  HCRYPTHASH hHash;
  
// 散列的句柄

  
const int BUFFER=4096;
  
// 缓冲区大小常数

  BYTE pBuffer[BUFFER];    
  
// 存放读文件内容的缓冲区

  BYTE pSignature[
256];
  
// 存放签名的缓冲区

  DWORD dSignatureLen
=256;
  
// 签名的长度

  TFileStream *sourceFile;
  
// 一个文件流

  
if(!CryptAcquireContext(&hProv,NULL,NULL,PROV—RSA—FULL,0))
  
// 连接默认的CSP,接受它的句柄放入hProv

  {    
    
// 错误处理

  }
  
if(!CryptCreateHash(hProv,CALG—MD5,0,0,&hHash))
  
// 创建一个散列对象,得到它的句柄放入hHash

  {
    
// 错误处理

  }
  
do
  {
   dReadLen
=sourceFile-Read(pBuffer,BUFFER);
  
if(!CryptHashData(hHash,pBuffer,dReadLen,0))
  
// 根据文件的内容计算散列值

   {
    
// 错误处理

   }
  }
while(!(dReadLen
  
if(!CryptSignHash(hHash,AT—SIGNATURE,NULL,0,pSignature,&dSignatureLen))
  
//使用私人密钥对散列值进行数字签名
  
//签名数据放入pSignature,长度放入dSignatureLen
    
// 错误处理

  }
  对基于文件的数据签名进行检验。
  
//变量声明:

  HCRYPTPROV hProv;
  
// CSP的句柄

  HCRYPTHASH hHash;
  
// 散列的句柄

  HCRYPTKEY hPublicKey;    
  
// 公共密钥的句柄

  
const int BUFFER=4096;  
  
// 缓冲区大小常数

  BYTE pBuffer[BUFFER];    
  
// 存放读文件内容的缓冲区

  TFileStream *sourceFile;
// 一个文件流

  BYTE pSignature[
256];    
  
// 上一段得到的签名的缓冲区

  DWORD dSignatureLen;    
  
// 上一段得到的签名的长度

  
if(!CryptAcquireContext(&hProv,NULL,NULL,PROV—RSA—FULL,0))
  
// 连接默认的CSP,接受它的句柄放入hProv

  {
    
// 错误处理

  }
  
if(!CryptGetUserKey(hProv,AT_SIGNATURE,&hPublicKey); // 得到公共密钥的句柄

  {
    
// 错误处理

  }
  
if(!CryptCreateHash(hProv,CALG—MD5,0,0,&hHash)) // 创建一个散列对象,得到它的句柄放入hHash

  {
    
// 错误处理

  }
  
do
  {
   dReadLen
=sourceFile-Read(pBuffer,BUFFER);
  
if(!CryptHashData(hHash,pBuffer,dReadLen,0))
  
// 根据文件的内容计算散列值

   {
    
// 错误处理

   }
  }
while(!(dReadLen
  
if(!CryptVerifySignature(hHash,pSignature,dSignatureLen,hPublicKey,NULL,0))
  {
    
if(GetLastError()==NTE—BAD—SIGNATURE) ShowMessage(″文件已被修改″);
  }
  
else
  {
   ShowMessage(″文件没被修改″);
  }

  
  以上是一个数字签名的简单实现,得到的签名数据可以单独保存,也可以分开保存。

【责编:Zenghui】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·WEB程序开发--ASP.NET和PHP、JSP究竟学哪个?
 ·五步带你入门XML
 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航