RSA加密输出大小
Posted
技术标签:
【中文标题】RSA加密输出大小【英文标题】:RSA encryption output size 【发布时间】:2014-10-31 04:37:42 【问题描述】:使用 2048 位密钥和 pkcs1padding 时 RSA 加密输出大小是多少。
是否总是 256 字节,与输入大小无关?
我如何计算其他密钥大小?
【问题讨论】:
你注意到 256*8=2048 了吗? @Perseids。是的,但我不确定输出总是 256 字节。是吗? 来自RSA_size
:"RSA_size() 以字节为单位返回 RSA 模数大小。它可用于确定必须为 RSA 加密值分配多少内存。"(消息大小取决于模数大小)。
【参考方案1】:
RSAEP (RSA encryption primitive) 的输出(整数形式)始终介于 0 和 n 之间:
如果消息代表 m 不在 0 和 n-1 之间,则输出 消息代表超出范围并停止。
令 c = m^e mod n.
输出 c。
当然,c
是一个数字。因此,您必须将其转换为字节才能使用。关于c
,唯一已知的是它小于n
,因为m
的值很大。即使m
很大,c
也可能会小几个字节。
您提到了PKCS1Padding,它是RSAES-PKCS1-V1_5-ENCRYPT 加密方案的一部分。填充将确保m
总是很大且随机的; RSA 加密的安全要求。
你会发现c
的编码是在里面指定的:
...
第四步:将密文代表c转换为密文C 长度 k 个八位字节:C = I2OSP (c, k)
...
其中 k 是以八位字节(字节)为单位的模数大小。
所以是的,答案总是k
,以字节为单位的模数大小。仅仅是因为标准要求它这样。它是一个编码为无符号大端数字的值,前缀为所需的零字节。
注意事项:
模数大小定义密钥大小。因此 RSA 加密的输出与密钥大小相同:ceil(keySize / 8.0)
使用浮点数或 (keySize + 8 - 1) / 8
使用整数。
带有 OAEP 填充的 RSA 使用相同的技术,因此对于 OAEP(以及大多数其他鲜为人知的方案,例如 RSA-KEM)来说,答案也是正确的。
许多执行“原始”RSA(只是使用公共指数对消息进行模幂运算)的库例程仍然执行 I2OSP 功能 - 但最好检查以确保。
【讨论】:
如果不确定,请阅读标准!它们通常比人们预期的更具可读性。 使用二进制逻辑获取最终缓冲区大小:needed = (size + (keySize >> 3) - 1) & ~((keySize >> 3) - 1))
你为什么要使用班次来掩盖计算?为什么不让编译器弄清楚呢?对于这种计算,可读性无疑更为重要。
为什么要使用浮点数来计算,根据定义,浮点数是不精确的?这只是为了演示另一种方法,仅此而已:)。【参考方案2】:
普通 RSA 的输出大小(使用一些填充方案,但没有 hybrid encryption)始终是密钥大小。原因是对于一些公钥n
,结果是一些整数c
和0<=c<n
。有很多关于 RSA 的介绍,例如http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-045j-automata-computability-and-complexity-spring-2011/lecture-notes/MIT6_045JS11_rsa.pdf
【讨论】:
【参考方案3】:是的,是的。
output-size 应该总是等于Modulus
(键的一部分)的大小,所以:
2048 bit Modulus -> 2048 bit output
1024 bit Modulus -> 1024 bit output
...
如果不是,则存在对 RSA 的大量攻击,有关基本信息,请参阅 here。
因此,即使要加密的 输入 是 7
,为了保证 输出 是 2048 bit
,必须有填充总是被应用!
【讨论】:
情况有点复杂。有点迂腐,我可以争辩说,如果模数对于它的位大小来说很小(比如它从位 100 开始),那么你就有机会获得一个实际上比模数短一点的密文。但更重要的是,不是大的输入值,而是健全的填充方案使 RSA 安全。例如,如果您使用小指数(例如 3),attack by John Hastad 可以与任何确定性填充方案一起使用。 输出与模数相同的原因是因为它明确地适合模数的大小。 不是是因为应用了填充。即使应用了填充 moduluar 求幂也会在 zero 和模数之间产生一个随机的值,并且这个值可以用 比模数更少的字节进行编码。请参阅my answer 为什么结果仍然与模数相同。这个答案没有解释为什么结果与以字节为单位的模数大小相同。以上是关于RSA加密输出大小的主要内容,如果未能解决你的问题,请参考以下文章