日期:2011-03-22 13:55:00 来源:本站整理
<b>用C++ Builder成立数字签名</b>[VC/C++编程]
本文“<b>用C++ Builder成立数字签名</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
假如你在网络上传送一份数据,但却存在着各种不安全的因素,使你对数据可否原封不动地到达目的地而心存迷惑,这时,你便可以给数据加上数字签名,从而使对方可以通过考证签名来查抄你所传过去的数据能否已被他人改正.
1、程序原理
数字签名的工作原理还是对比简单的,它是按照你所供应的原始数据,经过复杂的算法,产生特定的数据签名,对方通过一样的历程也产生签名,假如数据已被改正,那么就不大概得到两份一模一样的签名,从而便可判断数据已被他人改正.编程人员操纵Windows的CAPI接口,便可以实现数据的加密、解密和数字签名.
2、程序清单
下面用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(″文件没被改正″);
}
以上是一个数字签名的简单实现,得到的签名数据可以单独保存,也可以脱离保存.
以上是“<b>用C++ Builder成立数字签名</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论