RSA加密输出大小

hyd*_*yda 18 encryption rsa public-key-encryption

使用2048位密钥时使用的是什么是RSA加密输出大小(使用pkcs1padding).是否总是256字节独立于输入大小?我如何计算其他关键尺寸?

i_t*_*uro 16

是的,确实如此.

输出尺寸 应该总是等于大小Modulus(键的一部分),那么:

2048 bit Modulus -> 2048 bit output
1024 bit Modulus -> 1024 bit output
...
Run Code Online (Sandbox Code Playgroud)

如果不是,则存在大量针对RSA的攻击,请参阅此处以获取有关该基础的基本信息.

因此,为了保证在加密输入输出2048 bit均匀的,比方说,必须始终应用填充!7

  • 输出与模数相同的原因是因为**它是明确地适合模数的大小**。是不是因为应用了填充?即使应用填充**模**幂运算也会导致**零**和模数之间的随机值,并且该值可以用**比模数**更少的字节进行编码。请参阅[我的答案](/sf/answers/1799074511/)为什么结果仍然与模数相同。这个答案没有解释为什么结果与字节模数的大小相同。 (2认同)

Maa*_*wes 7

RSAEP(RSA 加密原语)的输出(作为整数)始终在 0 和 n 之间:

  1. 如果消息代表m不在0和n-1之间,则输出消息代表超出范围并停止。

  2. 令 c = m^e mod n。

  3. 输出 C.

当然c一个数字。因此,您必须将其转换为字节才能使用。唯一已知的c是,它比n的较大值要小m。即使很大,也可能会c小几个字节m


您提到了PKCS1Padding ,它是RSAES-PKCS1-V1_5-ENCRYPT加密方案的一部分。填充将确保它m始终很大且随机;RSA 加密的安全性要求。

c您会发现其中指定了编码:

...

步骤4:将密文代表c转换为长度为k个八位字节的密文C:C= I2OSP(c,k)

...

其中 k 是模数的大小,以八位位组(字节)为单位。

所以是的,答案始终是k模数的大小(以字节为单位)。仅仅是因为标准要求这样做。它是一个编码为无符号大端数字的值,并根据需要添加了尽可能多的零字节前缀。


笔记:

  • 模数大小定义密钥大小。因此 RSA 加密的输出与密钥大小相同:ceil(keySize / 8.0)使用浮点数或(keySize + 8 - 1) / 8使用整数。

  • 具有 OAEP 填充的 RSA 使用相同的技术,因此答案对于 OAEP 也是正确的(以及大多数其他不太知名的方案,例如 RSA-KEM)。

  • 许多执行“原始”RSA(只是消息与公共指数的模幂)的库例程仍然执行 I2OSP 函数 - 但最好检查以确保。

  • 如果不确定,请阅读标准!它们的可读性往往比人们预期的要高得多。 (3认同)