如果你在网络上传递一份数据,但却存在着种种不安全的因素,使你对数据能否原封不动地到达目的地而心存疑惑,这时,你就可以给数据加上数字签名,使对方可以通过验证签名来检查你所传过去的数据是否已被他人修改。
数据签名原理
----使用公共密钥加密算法对信息进行加密是非常耗时的,因此加密人员想出了一种办法来快速地生成一个代表你的消息的简短的、独特的消息摘要,这个摘要可以被加密并作为你的数字签名。
----通常,产生消息摘要的快速加密算法被称为单向杂凑函数。一种单向杂凑函数不使用密钥,它只是一个简单的公式,把任何长度的一个消息转化为一个叫做消息摘要的简单的字符串。当使用一个16位的杂凑函数时,杂凑函数处理的文本将产生一个16位的输出。例如,一个消息可能产生一个像 CBBV235ndsAG3D67 的字符串。每一个消息产生一个随机的消息摘要,用你的私有密钥对摘要进行加密就生成了一个数字签名。
----举一个例子:
----假设发送者A对他的消息计算一个消息摘要,然后用他的私有密钥对消息摘要进行加密,并把数字签名和原文一起发送给B。
----当B使用A的公开密钥解密数字签名,他就得到了A计算的消息摘要的一个备份。因为他能够用A的公开密钥对数字签名进行解密,他知道是A 产生的,这样就验证了发送者的身份。B然后使用相同的杂凑函数(在先前就协商好的)来计算A发送来的明文的消息摘要。如果他计算出来的摘要和A发送给他的摘要是相同的,这样他就可以确认数字签名是正确的,这不仅意味着是A发送的消息,而且消息在发送的过程中没有发生改变。一个相同的消息摘要意味着消息没有被改变,这种方法的一个问题是消息本身是作为明文的形式发送的,因此没有达到保密的要求。但编程人员可以采用一种使用秘密密钥的对称加密算法来加密消息的明文部分。
----编程人员利用Windows的CAPI接口,就可以实现数据的加密、解密和数字签名。
----数据签名的流程如下图所示:
程序原理
----数据签名主要使用以下两个函数:
#include
BOOL WINAPI CryptSignHash(
HCRYPTHASH hHash, // in
DWORD dwKeySpec, // in
LPCTSTR sDescription,//in
DWORD dwFlags, // in
BYTE *pbSignature, // out
DWORD *pdwSigLen // in/out
);
#include
BOOL WINAPI CryptVerifySignature(
BYTE *pbSignature, // in
DWORD dwSigLen, // in
HCRYPTKEY hPubKey, // in
LPCTSTR sDescription, // in
DWORD dwFlags // in
);
----由于这两个函数是C语言的定义,其中的pbSignature变量是用户数据(二进制类型)的缓冲区的指针,而在VB中是没有指针这个定义的,因此,笔者通过利用VB的BYTE数组实现了C语言的指针。
----以上两个函数在VB中的定义如下:
Private Declare Function CryptSignHashA Lib “advapi32.dll" (ByVal hHash As Long, _
ByVal dwKeySpec As Long, ByVal sDescription As String, ByVal dwFlags As Long, _
ByRef pbSignature As Byte, pdwSigLen As Long) As Long
Private Declare Function CryptVerifySignatureA Lib “advapi32.dll" (ByVal hHash As Long, _
ByRef pbSignature As Byte, ByVal dwSigLen As Long, ByVal hPubKey As Long, _
ByVal sDescription As String, ByVal dwFlags As Long) As Long