RSA加密 -- 选择padding模式需要注意的问题

点击打开原文链接       RSA - 原理、特点(加解密及签名验签)及公钥和私钥的生成

RSA加密常用的填充方式有下面3种:

1、RSA_PKCS1_PADDING 填充模式(最常用的模式)

输入:必须 比 RSA 钥模长(modulus) 短至少11个字节, 也就是 RSA_size(rsa) – 11
如果输入的明文过长,必须切割, 然后填充

输出:和modulus一样长

根据这个要求,对于512bit的密钥, block length = 512/8 – 11 = 53 字节

int rsa_len = RSA_size(pkey);
  
char* tData = new char[rsa_len];

int ret =  RSA_public_encrypt(rsa_len, (unsigned char *)strInput(需要加密的数据), (unsigned char *)tData(加密后的数据), pkey(密钥),  RSA_PKCS1_PADDING);  

2、RSA_PKCS1_OAEP_PADDING

输入:RSA_size(rsa) – 41

输出:和modulus一样长

3、RSA_NO_PADDING(不填充)

输入:可以和RSA钥模长一样长,如果输入的明文过长,必须切割, 然后填充

输出:和modulus一样长

int rsa_len = RSA_size(pkey);
  
char* tData = new char[rsa_len];

int ret =  RSA_public_encrypt(rsa_len, (unsigned char *)strInput(需要加密的数据), (unsigned char *)tData(加密后的数据), pkey(密钥),  RSA_NO_PADDING);  

RSA是一个块加密算法( block cipher algorithm),总是在一个固定长度的块上进行操作。RSA的block length是跟key length有关的。

注:每次RSA加密的明文的长度是受RSA填充模式限制的(如上所列),但是RSA每次加密的块长度就是key length

补充:

1、RSA256,RSA512,RSA1024,RSA2048

假如选择的秘钥长度为1024bit共128个byte:

2、当你在客户端选择RSA_NO_PADDING填充模式时,如果你的明文不够128字节,加密的时候会在你的明文前面,前向的填充零。解密后的明文也会包括前面填充的零,这是服务器需要注意把解密后的字段前向填充的零去掉,才是真正之前加密的明文。

3、当你选择RSA_PKCS1_PADDING填充模式时,如果你的明文不够128字节加密的时候会在你的明文中随机填充一些数据,所以会导致对同样的明文每次加密后的结果都不一样。对加密后的密文,服务器使用相同的填充方式都能解密。解密后的明文也就是之前加密的明文。

4、RSA_PKCS1_OAEP_PADDING填充模式是PKCS#1推出的新的填充方式,安全性是最高的,和前面RSA_PKCS1_PADDING的区别就是加密前的编码方式不一样。

猜你喜欢

转载自blog.csdn.net/mpp_king/article/details/88855571
今日推荐