频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

用C++ Builder创建数字签名

来源:yesky 作者:何根花 出处:巧巧读书 2005-11-27 进入讨论组
如果你在网络上传递一份数据,但却存在着种种不安全的因素,使你对数据能否原封不动地到达目的地而心存疑惑,这时,你就可以给数据加上数字签名,从而使对方可以通过验证签名来检查你所传过去的数据是否已被他人修改。

  一、程序原理

  数字签名的工作原理还是比较简单的,它是根据你所提供的原始数据,经过复杂的算法,产生特定的数据签名,对方通过同样的过程也产生签名,如果数据已被修改,那么就不可能得到两份一模一样的签名,从而就可判断数据已被他人修改。编程人员利用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(″文件没被修改″);

  }

  以上是一个数字签名的简单实现,得到的签名数据可以单独保存,也可以分开保存。转载保留:http://www.qqread.com/bcb/d720994050.html 更多文章 更多内容请看QQ个性签名汇总C/C++技术专题专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
较早的文章:TrayIcon组件的使用

较新的文章:C++ Builder VCL库函数简介
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章