OpenSSL中的驗證是先對原始數據計算摘要, 再對摘要進行私鑰加密. 驗證的過程是對原始消息計算摘要,解密驗證值, 和摘要對比是否一致.如果一致, 說明驗證有效:否則,則認爲原文或驗證值已經被篡改.
函數介紹:
因爲要先對原始數據計算摘要, 所以在計算摘要時用的函數是計算摘要的函數一樣. 最後在結束函數中進行驗證或驗證. 爲了方便描述,OpenSSL對計算摘要函數進行了宏定義封裝.下邊是函數定義:
1、 簽名初始化函數
#defineEVP_SignInit_ex(a, b,c) EVP_DigestInit_ex(a,b, c)
IntEVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE*imp1);
2、 簽名更新函數
#defineEVP_SignUpdate(a, b,c) EVP_DigestUpdate(a,b, c)
IntEVP_DigestUpdate(EVP_MD_CTX *ctx, const *d, size_t cnt);
3、 簽名結束函數
IntEVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s,EVP_PKey pkey);
功能:計算簽名結束, 輸出簽名值。
參數說明:
Ctx:[IN]上下文變量
Md:[OUT] 簽名結果輸出值的指針 s:[OUT] 簽名的長度
Pkey:[IN] 簽名的私鑰。(*後面有私鑰的計算過程)
4、 驗證初始化函數 (* 跟簽名調用同一個函數)
#defineEVP_VerifyInit_ex(a, b,c) EVP_DigestInit_ex(a,b, c)
IntEVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE*imp1);
5、 驗證更新函數(* 跟簽名調用同一個函數)
#defineEVP_VerifyUpdate(a, b,c) EVP_DigestUpdate(a,b, c)
IntEVP_DigestUpdate(EVP_MD_CTX *ctx, const *d, size_t cnt);
6、 驗證結束函數
IntEVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf,unsigned int siglen, EVP_PKey pkey);
功能:計算驗證結束, 輸出驗證值。
參數說明:
Ctx:[IN]上下文變量
sigbuf:[IN] 簽名值 siglen:[IN] 簽名的長度
Pkey:[IN] 驗證簽名的公鑰。
計算私鑰過程: 直接寫代碼出來(*下面的代碼如果按百分算的話,最多隻能得三十分, 所以不要照搬, 我這麼寫只是想把過程說得簡單清楚點)
RSArsa = RSA_generate_key(1024, RSA_F4, NULL,NULL);//產生一個1024位的RSA密鑰
EVP_PKEY *evpKey = EVP_PKEY_new();//新建一個EVP_PKEY變量
EVP_PKEY_set1_RSA(evpKey,rsa); //保存RSA結構體到EVP_PKEY結構體
//完成任務後面就可以用evpKey來簽名了。
注:上面資源大多源自《精通PKI網絡安全論證技術與編程實現》一書。