用VB6.0實現數字簽名
如果你在網絡上傳遞一份數據,但卻存在著種種不安全的因素,使你對數據能否原封不動地到達目的地而心存疑惑,這時,你就可以給數據加上數字簽名,使對方可以通過驗證簽名來檢查你所傳過去的數據是否已被他人修改。
數據簽名原理
----使用公共密鑰加密算法對信息進行加密是非常耗時的,因此加密人員想出了一種辦法來快速地生成一個代表你的消息的簡短的、獨特的消息摘要,這個摘要可以被加密并作為你的數字簽名。
----通常,產生消息摘要的快速加密算法被稱為單向雜湊函數。一種單向雜湊函數不使用密鑰,它只是一個簡單的公式,把任何長度的一個消息轉化為一個叫做消息摘要的簡單的字符串。當使用一個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 |