我使用rsa使用我的公钥-e(对应的私钥-d)加密小邮件。但如果我用另一个私钥d'解密它,它会给出一个bad padding exception
。
它如何知道我使用了错误的密钥?
答案 0 :(得分:3)
使用填充方案确实为解密器提供了一个好主意,即他正在使用错误的密钥或正在处理损坏的数据。
填充方案具有明确定义的明文最终字节集。如果您使用错误的密钥进行解密,则生成的“明文”基本上是随机垃圾,因此绝对不可能以有效的填充序列结束。
答案 1 :(得分:2)
大多数RSA库默认为PKCS#1 block type 2填充以进行公钥加密。在这种情况下,数据必须至少比模数大小小11个字节,并且明文填充如下:
00 02 r 1 r 2 r 3 r 4 ... r M < / sub> ... 00 [你的明文字节]
其中M> = 8且r i 是随机正字节:它们都是非零的。
这是提高到e th 功率模数的实际值。因此,在解密时,解密器可以检查结果是否如此,即
答案 2 :(得分:0)
这种机制实际上就像它很聪明一样简单。
想象一个块密码加密正好8个字节的块:它将每个明文消息分成8个字节的组,并将每个组加密为单个块。说到最后一个块,有两种可能性:
该块短于8个字节,必须填充到8个字节。在这种情况下,必须将一些字节数 n 附加到块中。每个字节都具有相同的二进制值 n 。所以最后一个块看起来就像其中之一,其中d
是数据的一个字节:
d d d d d d 1
d d d d d 2 2
d d d d d 3 3 3
。 。 。
d 7 7 7 7 7 7 7
该块正好是8个字节长。在这种情况下,整个块会附加到消息中,因此最后2个块看起来像这样:
d d d d d d d 8 8 8 8 8 8 8 8
现在,当消息被解密时,解密器可以明确地告诉要删除多少字节的填充。如果最后一个块没有以n
个字符结尾,每个字符都带有二进制值n
,则它知道该消息已被破坏或使用错误的密钥解密。
不要将此填充与用于修改消息的开头的初始化向量或IV混淆。填充的目的是确保消息仅包含完整的块,并允许解密器验证密钥。 IV是一个随机的字节序列,可以确保同一个明文可以使用相同的密钥多次加密,但每次都会生成不同的密文。