rsa加密⽅式padding⽅式...
背景:
rsa作为数字签名和数据加密来说是通常都会使⽤的,⽽不免有些是不同语⾔来做的,这⾥主要是⽤于数据加密。
java客户端使⽤的rsa加密padding⽅式为RSA/ECB/OAEPWithSHA256AndMGF1Padding⽅式(这⾥要说明⼀下:
RSA/ECB/OAEPWithSHA256AndMGF1Padding和RSA/ECB/OAEPWithSHA-256AndMGF1Padding是由Bouncy Castle和SUN JCE 提供的,这两者通常情况可能java可以兼容,但有时基于硬件和软件区别编译会有不可预测的报错)。查看c++的openssl标准库没有这种加密⽅式
问题:
1.openssl现在的padding⽅式为RSA_PKCS1_PADDING, RSA_PKCS1_OAEP_PADDING, RSA_NO_PADDING,这三种都是常见的padding⽅式,每种的使⽤注意事项现在⽹络上由这⼤量的资源做参考,但是java所使⽤的RSA/ECB/OAEPWithSHA256AndMGF1Padding ⽅式是不同的,在openssl标准库中并没有这⼀算法的接⼝。
2.查阅各种资料,最后显⽰在botan库中实现了这⼀加密⽅式,并查看了其实现源码,⼤体思路为⾸先读⽂件或者是读取字符串的公钥私钥,做加解密,注意公钥⽅式⼀定是X509格式的,⽽私钥⼀定是PKCS8格式,密钥格式的转换还是推荐使⽤openssl的来做转换。
openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem
java加密方式有哪些读取进来后对⽂本内容做加解密计算,通过base64或者hex进⾏格式化输出。查看源代码⽂件看算法实现,⼀个具体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,*()));
Botan::PK_Decryptor_EME dec(*pk,*(), “EME1(SHA-256)”);
std::cout <<“dec:”<< Botan::hex_encode(dec.decrypt(pt));
3.botan库中新版本存在⼀个问题就是必须要使⽤到libc库的新版本,原因是辅助向量(auxiliary vector),这个⼀直以来都是开放管理的,glibc库在2.6之后对这个变量增加了新的库函数getauxval(),获取到需要的glibc库,汇编器as该版本也不能兼容⽼版,需要更新binutils。
4.botan库的最终结果做base64或者hex转为明⽂即我们所需要的string输出格式,但是私钥的pkcs1的格式是不⽀持的,翻阅源码你会发现根本没有pkcs1格式的私钥,需要⽤上述⽅法转换为对应的pkcs8格式,再做传⼊
如果看完觉得有所收获的话,记得点赞关注哦

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。