openssl rsa公鑰驗簽名

2021-08-04 12:10:03 字數 3706 閱讀 2611

**  : 

場景:只有公鑰字串(base64編碼),需驗證簽名。

環境:c++ + openssl

step1 從記憶體讀取公鑰

[cpp]view plain

copy

static

rsa* getpublickeyrsa(string strpublickey)  

i++;  

}  strpublickey.insert(0, "-----begin public key-----\n"

);  

);  

bio *bio = null;   

rsa *rsa = null;   

char

*chpublickey = 

const_cast

<

char

*>(strpublickey.c_str());  

if((bio = bio_new_mem_buf(chpublickey, -1)) == null)       

//從字串讀取rsa公鑰

rsa = pem_read_bio_rsa_pubkey(bio, null, null, null);   //從bio結構中得到rsa結構

if(null == rsa)  

;  char

*ptmp = null;  

ptmp = err_error_string(ulerr,szerrmsg); // 格式:error:errid:庫:函式:原因

cout << szerrmsg;  

cout << "load public key fail error="

<" msg="

<< szerrmsg;  

}  else

return

rsa;   

}  

step2 開始驗證啦

[cpp]view plain

copy

static

bool

verify( string sign, string content )  

// 將原串經過sha256摘要(摘要演算法根據實際使用來,此處以sha256為例)

string hash = sha256(content.c_str(),false

);   

// 將待驗證簽名用base64解碼(一般給的簽名是經過base64編碼的)

string sign = base64decode((char

*)gameauthsign.c_str(), strlen(gameauthsign.c_str()));  

// 此處簽名長度根據實際使用來,最好不要直接strlen(sign),可能發生截斷

intsign_len = 256;   

intres = rsa_verify(nid_sha256, (

const

unsigned 

char

*)hash.c_str(), strlen(hash.c_str()), (unsigned 

char

*)sign.c_str(),sign_len, rsa);    

if(res == 1)  

else

;  char

*ptmp = null;  

ptmp = err_error_string(ulerr,szerrmsg); // 格式:error:errid:庫:函式:原因

cout << szerrmsg;  

gdebugstream("verify error:"

<< szerrmsg);  

}  return

res == 1;    

}  

ps base64解碼,編碼 sha256摘要 都能過openssl實現 

base64解碼

[cpp]view plain

copy

static

string base64decode(

char

* input, 

intlength)    

;  if

(null == input || length <= 0 || length >= 1024)  

intlen = evp_decodeblock((unsigned 

char

*)decode, (

const

unsigned 

char

*)input, length);    

if(len >= 1024 || len <= 0)  

decode[len] = '\0'

;  result.resize(len);  

for(

inti = 0; i < len; i++)   

return

result;  

}  

base64編碼

[cpp]view plain

copy

static

string base64encode(

char

* input, 

intlength)  

;  string result;  

if(null == input || length <= 0 || length >= 1024)  

intlen = evp_encodeblock((unsigned 

char

*)encoded, (

const

unsigned 

char

*)input, length);      

if(len >= 1024 || len <= 0)  

encoded[len] = '\0'

;  result = string(encoded);  

return

result;  

}  

sha256

[cpp]view plain

copy

static

string sha256(

const

char

* data, 

bool

bhex = 

true

)  ;  

sha256((const

unsigned 

char

*)data, strlen(data), md);    

if(!bhex)  

return

s;  

}  else

return

s;  

}  }  

另外,嘗試過php來驗證

但是讀取公鑰時總用報錯 $openssl_public_key = @openssl_get_publickey($pubkey);

error:0906d06c:pem routines:pem_read_bio:no start line

似乎是openssl_get_publickey這個api不支援只用公鑰的字串,應該讀取的是證書,但是只有公鑰字串,我也不知道如何生成證書。。

最後~希望你順利驗證通過~~~~

openssl RSA簽名和驗籤

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

公鑰 私鑰 公鑰 私鑰 簽名 驗籤 說的啥?

公鑰加密,私鑰解密 私鑰簽名,公鑰驗籤 雜湊演算法,也叫做雜湊函式,是從乙個任何一種資料中建立小的數字方法,雜湊函式把訊息或者資料壓縮成摘要,有時候也叫做摘要演算法。把資料量變小,將資料的格式固定下來。常用的演算法有 md5 sha1 md5 不是一種加密演算法,是一種摘要演算法,無論多長的輸入,m...

公鑰 私鑰 公鑰 私鑰 簽名 驗籤 說的啥?

公鑰加密,私鑰解密 私鑰簽名,公鑰驗籤雜湊演算法,也叫做雜湊函式,是從乙個任何一種資料中建立小的數字方法,雜湊函式把訊息或者資料壓縮成摘要,有時候也叫做摘要演算法。把資料量變小,將資料的格式固定下來。常用的演算法有 md5 sha1 md5 不是一種加密演算法,是一種摘要演算法,無論多長的輸入,md...