- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用CBuilder创建数字签名
用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(!(dReadLenBUFFER)); 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)) // 根据文件的内容计算散列值 { // 错误处理
文档评论(0)