rsa加密方式padding方式OAEPWithSHA256AndMGF1Padding(java端與c++端的協(xié)調(diào))

背景:

rsa作為數(shù)字簽名和數(shù)據(jù)加密來說是通常都會(huì)使用的,而不免有些是不同語言來做的,這里主要是用于數(shù)據(jù)加密。

java客戶端使用的rsa加密padding方式為RSA/ECB/OAEPWithSHA256AndMGF1Padding方式(這里要說明一下:RSA/ECB/OAEPWithSHA256AndMGF1Padding和RSA/ECB/OAEPWithSHA-256AndMGF1Padding是由Bouncy Castle和SUN JCE提供的,這兩者通常情況可能java可以兼容,但有時(shí)基于硬件和軟件區(qū)別編譯會(huì)有不可預(yù)測(cè)的報(bào)錯(cuò))。查看c++的openssl標(biāo)準(zhǔn)庫沒有這種加密方式

問題:

1.openssl現(xiàn)在的padding方式為RSA_PKCS1_PADDING, RSA_PKCS1_OAEP_PADDING, RSA_NO_PADDING,這三種都是常見的padding方式,每種的使用注意事項(xiàng)現(xiàn)在網(wǎng)絡(luò)上由這大量的資源做參考,但是java所使用的RSA/ECB/OAEPWithSHA256AndMGF1Padding方式是不同的,在openssl標(biāo)準(zhǔn)庫中并沒有這一算法的接口。

2.查閱各種資料,最后顯示在botan庫中實(shí)現(xiàn)了這一加密方式,并查看了其實(shí)現(xiàn)源碼,大體思路為首先讀文件或者是讀取字符串的公鑰私鑰,做加解密,注意公鑰方式一定是X509格式的,而私鑰一定是PKCS8格式,密鑰格式的轉(zhuǎn)換還是推薦使用openssl的來做轉(zhuǎn)換。

? ? ? ? ? ? ? ? openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem

讀取進(jìn)來后對(duì)文本內(nèi)容做加解密計(jì)算,通過base64或者h(yuǎn)ex進(jìn)行格式化輸出。查看源代碼文件看算法實(shí)現(xiàn),一個(gè)具體demo如下:

//text to decrypt

std::vector<uint8_t> pt(plaintext.data(),plaintext.data()+plaintext.length());

std::unique_ptr<Botan::RandomNumberGenerator> rng(new Botan::AutoSeeded_RNG);

//load pri key

Botan::DataSource_Memory key_in(fixed_rsa_key);

//go decrypt

std::unique_ptr<Botan::Private_Key> pk(Botan::PKCS8::load_key(key_in,*rng.get()));

Botan::PK_Decryptor_EME dec(*pk,*rng.get(), “EME1(SHA-256)”);

std::cout <<“dec:”<< Botan::hex_encode(dec.decrypt(pt));

3.botan庫中新版本存在一個(gè)問題就是必須要使用到libc庫的新版本,原因是輔助向量(auxiliary vector),這個(gè)一直以來都是開放管理的,glibc庫在2.6之后對(duì)這個(gè)變量增加了新的庫函數(shù)getauxval(),獲取到需要的glibc庫,匯編器as該版本也不能兼容老版,需要更新binutils。

4.botan庫的最終結(jié)果做base64或者h(yuǎn)ex轉(zhuǎn)為明文即我們所需要的string輸出格式,但是私鑰的pkcs1的格式是不支持的,翻閱源碼你會(huì)發(fā)現(xiàn)根本沒有pkcs1格式的私鑰,需要用上述方法轉(zhuǎn)換為對(duì)應(yīng)的pkcs8格式,再做傳入

如果看完覺得有所收獲的話,記得點(diǎn)贊關(guān)注哦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容