当前位置:Gxlcms > PHP教程 > 为什么rsa加密时我把密钥长度设成256位,太长的字符串加密就会出错?

为什么rsa加密时我把密钥长度设成256位,太长的字符串加密就会出错?

时间:2021-07-01 10:21:17 帮助过:26人阅读

加密的字符串大概30位时就会出错,不知道为什么,生成的密钥长度是256位的

回复内容:

明文长度(Bytes) <= 密钥长度(Bytes)- 11

256bits = 32bytes
最长明文长度 = 32 - 11 = 21bytes = 168bits 感谢@钟宇腾的回答,没有padding的RSA称为Textbook RSA,是在教科书中所教的基于数学原理的RSA,如Wikipedia页面的RSA定义:
这里所说的M指的是要加密的数据,但在实际应用的时候却不一定为明文本身。
如果明文不加以处理则有可能受到攻击。
举个简单的例子:
e选择很小的值,如e=3;而且m<n^{\frac{1}{3} } ,这时加密后的数据就会变成:
c=m^{3}\mod n=m^{3}
只需要计算一个开三次根号就可以得到原文。

在PKCS #1 v2.1标准里面有定义这个padding RFC 3447 - Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1
   Steps:

   1. Length checking: If mLen > k - 11, output "message too long" and
      stop.

   2. EME-PKCS1-v1_5 encoding:

      a. Generate an octet string PS of length k - mLen - 3 consisting
         of pseudo-randomly generated nonzero octets.  The length of PS
         will be at least eight octets.

      b. Concatenate PS, the message M, and other padding to form an
         encoded message EM of length k octets as

            EM = 0x00 || 0x02 || PS || 0x00 || M.
RSA的标准里面是没有padding的。
但根据RSADSI颁布的RSA加密解密标准PKCS#1(为了避免RSA算法的一些漏洞),在加密的时候,会在data前面加入至少11bytes的padding
第一byte全置0
第二byte为格式位,全置2时为加密,全置1时为签名
接着是至少八byte的padding,random nonzero。
最后一byte全置0
因此padding总长至少为11byte。

人气教程排行