openssl RSA簽名和驗籤

2021-10-02 04:35:56 字數 2741 閱讀 4684

1、近期除錯的乙個客戶端,為了防止介面請求被劫持、 篡改, 需通過證書對請求資料進行簽名操作, 來確保請求資料的完整性;要用私鑰對資料進行rsa簽名,用的sha256withrsa, 然後使用 base64 封裝簽名結果,將資料傳送到伺服器,伺服器對資料進行驗籤。

2、針對伺服器返回結果資料, 客戶端需要進行驗籤操作來確保接收到的資料的完整性, 要用公鑰驗證簽名,用的sha1withrsa。

3、不論是計算簽名還是進行資料驗籤,主要是看計算摘要的介面。

4、使用到的證書格式為pem格式的。

//私鑰簽名 sha256withrsa

/** @param [in] filename 證書路徑

* @param [in] src 待簽名源資料

* @param [in] srclen 待簽名源資料

* @param [out] sign 簽名

* @param [out] signlen 簽名長度

* @return -

*/static

intmy_rsa_prikeysign

(char

*filename,

unsigned

char

*src,

int srclen,

unsigned

char

*sign,

int*signlen)

;//計算的摘要

if(filename ==

null

|| src ==

null

|| sign ==

null

)

rsa *rsa_pri_key =

rsa_new()

; file *fp =

null

;//開啟檔案

fp =

fopen

(filename,

"rt");

if( fp ==

null

)//讀取pem證書檔案if(

pem_read_rsaprivatekey

(fp,

&rsa_pri_key,0,

0)==null

)//關閉控制代碼

fclose

( fp )

;//使用的sha256計算摘要,若是sha1則替換成對應的函式

sha256

(src, srclen, uchash)

;//print_hex("hash", uchash, 32);

//計算簽名,前三個引數傳入sha256對應的引數

iret =

rsa_sign

(nid_sha256, uchash,

32, sign, signlen, rsa_pri_key);if

(1!= iret)

printf

("rsa_sign ok\n");

rsa_free

(rsa_pri_key)

;return0;

}//公鑰簽名驗證 sha1withrsa

/** @param [in] filename 證書路徑

* @param [in] src 待驗籤源資料

* @param [in] srclen 待驗籤源資料

* @param [in] sign 簽名

* @param [in] signlen 簽名長度

* @return - 返回0成功,非0失敗

*/static

intmy_rsa_publicverify

(char

*filename,

unsigned

char

*src,

int srclen,

unsigned

char

*sign,

int signlen)

;//計算的摘要

if(filename ==

null

|| src ==

null

|| sign ==

null)

rsa *rsa_pub_key =

rsa_new()

; file *fp =

null

; fp =

fopen

(filename,

"rt");

if( fp ==

null)if

(!pem_read_rsa_pubkey

(fp,

&rsa_pub_key,0,

0))fclose

( fp )

;//使用的sha1計算摘要,若是其他演算法則替換成對應的函式

sha1

(src, srclen, uchash)

;//print_hex("hash", uchash, 20);

//計算簽名,前三個引數傳入sha1對應的引數

iret =

rsa_verify

(nid_sha1, uchash,

20, sign, signlen, rsa_pub_key);if

(1!= iret)

printf

("rsa_verify ok\n");

rsa_free

(rsa_pub_key)

;return0;

}

openssl rsa公鑰驗簽名

場景 只有公鑰字串 base64編碼 需驗證簽名。環境 c openssl step1 從記憶體讀取公鑰 cpp view plain copy static rsa getpublickeyrsa string strpublickey i strpublickey.insert 0,begin ...

ECDSA簽名 驗籤

ecdsa簽名每次結果不同。原因 ecdsa簽名過程中混入隨機值,生成簽名結果不同。公鑰證書驗籤沒問題。1.簽名過程 假設要簽名的訊息是乙個字串 hello world dsa簽名的第乙個步驟是對待簽名的訊息生成乙個訊息摘要。不同的簽名演算法使用不同的訊息摘要演算法。比如,dss使用sha1來生成1...

數字簽名和驗籤

數字簽名使用了公鑰加密領域的技術 通常定義兩種互補的運算,乙個用於簽名,另乙個用於驗證。數字簽名是只有資訊的傳送者才能產生的別人無法偽造的一段數字串,這段數字串標明這段資訊是傳送者傳送的。數字簽名是非對稱金鑰加密技術與數字摘要技術的應用。數字簽名的作用 保證資訊傳輸的完整性 數字摘要 確認傳送者的身...