用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(″文件没被修改″);
}
以上是一个数字签名的简朴实现,获得的签名数据可以单独生存,也可以分隔生存。