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,结果是一些整数c0<=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加密输出大小的主要内容,如果未能解决你的问题,请参考以下文章

RSA 加密返回不同的输出

加密大于 RSA 密钥(模数)大小的数据。将拆分的数据加密成块,似乎不起作用。有任何想法吗?

对于加密的总结(AES,RSA)

RSA加密

C# BouncyCastle RSA 加密和解密

RSA 加密 C#