-
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<BUFFER));
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<BUFFER));
if(!CryptVerifySignature(hHash,pSignature,dSignatureLen,hPublicKey,NULL,0))
{
if(GetLastError()==NTE—BAD—SIGNATURE)
ShowMessage(″文件已被修改″);
}
else
{
ShowMessage(″文件没被修改″);
}
以上是一个数字签名的简单实现,得到的签名数据可以单独保存,也可以分开保存。
一、程序原理
数字签名的工作原理还是比较简单的,它是根据你所提供的原始数据,经过复杂的算法,产生特定的数据签名,对方通过同样的过程也产生签名,如果数据已被修改,那么就不可能得到两份一模一样的签名,从而就可判断数据已被他人修改。编程人员利用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<BUFFER));
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<BUFFER));
if(!CryptVerifySignature(hHash,pSignature,dSignatureLen,hPublicKey,NULL,0))
{
if(GetLastError()==NTE—BAD—SIGNATURE)
ShowMessage(″文件已被修改″);
}
else
{
ShowMessage(″文件没被修改″);
}
以上是一个数字签名的简单实现,得到的签名数据可以单独保存,也可以分开保存。
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式