Open SSL 常用函數——簽名與驗證

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網絡安全論證技術與編程實現》一書。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章