背景:
rsa作為數(shù)字簽名和數(shù)據(jù)加密來說是通常都會使用的朱巨,而不免有些是不同語言來做的落恼,這里主要是用于數(shù)據(jù)加密。
java客戶端使用的rsa加密padding方式為RSA/ECB/OAEPWithSHA256AndMGF1Padding方式(這里要說明一下:RSA/ECB/OAEPWithSHA256AndMGF1Padding和RSA/ECB/OAEPWithSHA-256AndMGF1Padding是由Bouncy Castle和SUN JCE提供的持际,這兩者通常情況可能java可以兼容突想,但有時基于硬件和軟件區(qū)別編譯會有不可預(yù)測的報(bào)錯)殴蹄。查看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)來后對文本內(nèi)容做加解密計(jì)算,通過base64或者h(yuǎn)ex進(jìn)行格式化輸出箱歧。查看源代碼文件看算法實(shí)現(xiàn)矾飞,一個具體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庫中新版本存在一個問題就是必須要使用到libc庫的新版本,原因是輔助向量(auxiliary vector)呀邢,這個一直以來都是開放管理的洒沦,glibc庫在2.6之后對這個變量增加了新的庫函數(shù)getauxval(),獲取到需要的glibc庫价淌,匯編器as該版本也不能兼容老版申眼,需要更新binutils瞒津。
4.botan庫的最終結(jié)果做base64或者h(yuǎn)ex轉(zhuǎn)為明文即我們所需要的string輸出格式,但是私鑰的pkcs1的格式是不支持的括尸,翻閱源碼你會發(fā)現(xiàn)根本沒有pkcs1格式的私鑰巷蚪,需要用上述方法轉(zhuǎn)換為對應(yīng)的pkcs8格式,再做傳入
如果看完覺得有所收獲的話濒翻,記得點(diǎn)贊關(guān)注哦