Java 密码库如何确定您是否使用了正确的密钥来解密消息?

Java 密码库如何确定您是否使用了正确的密钥来解密消息?,java,encryption,cryptography,rsa,Java,Encryption,Cryptography,Rsa,我已经使用rsa使用我的公钥-e(对应的私钥-d)加密了一条小消息。但是如果我用另一个私钥d'解密它,它会给出一个错误的填充异常它如何知道我使用了错误的密钥?使用填充方案确实会让解密者知道他使用了错误的密钥或正在处理损坏的数据 填充方案有一组定义良好的明文最终字节。如果使用错误的密钥进行解密,则生成的“明文”基本上是随机垃圾,因此极不可能以有效的填充序列结束。使用填充方案确实会让解密者知道他使用了错误的密钥或正在处理损坏的数据 填充方案有一组定义良好的明文最终字节。如果使用错误的密钥进行解密,则

我已经使用rsa使用我的公钥-e(对应的私钥-d)加密了一条小消息。但是如果我用另一个私钥d'解密它,它会给出一个
错误的填充异常

它如何知道我使用了错误的密钥?

使用填充方案确实会让解密者知道他使用了错误的密钥或正在处理损坏的数据


填充方案有一组定义良好的明文最终字节。如果使用错误的密钥进行解密,则生成的“明文”基本上是随机垃圾,因此极不可能以有效的填充序列结束。

使用填充方案确实会让解密者知道他使用了错误的密钥或正在处理损坏的数据


填充方案有一组定义良好的明文最终字节。如果使用错误的密钥进行解密,则生成的“明文”基本上是随机垃圾,因此极不可能以有效的填充序列结束。

大多数RSA库默认为公钥加密填充。在这种情况下,数据必须至少比模大小小11字节,并且明文填充如下:

00 02 r1 r2 r3 r4。。。rM。。。00[您的明文字节]

其中M>=8和ri是随机的正字节:它们都是非零的

这是将模数提高到eth幂模的实际值。因此,解密后,解密程序可以检查结果是否如下所示,即

  • 高位字节为0
  • 高阶字节旁边的是2
  • 至少接下来的8个字节是非零的
  • 零字节出现在这之后的某个地方

  • 大多数RSA库默认使用填充进行公钥加密。在这种情况下,数据必须至少比模大小小11字节,并且明文填充如下:

    00 02 r1 r2 r3 r4。。。rM。。。00[您的明文字节]

    其中M>=8和ri是随机的正字节:它们都是非零的

    这是将模数提高到eth幂模的实际值。因此,解密后,解密程序可以检查结果是否如下所示,即

  • 高位字节为0
  • 高阶字节旁边的是2
  • 至少接下来的8个字节是非零的
  • 零字节出现在这之后的某个地方

  • 这个机制实际上既简单又聪明

    想象一个加密8字节块的分组密码:它将每个明文消息分成8字节的组,并将每个组作为单个块进行加密。当谈到最后一个区块时,有两种可能性:

  • 该块小于8字节,必须填充到正好8字节。在这种情况下,必须将一定数量的字节n追加到块中。每个字节都有相同的二进制值n。最后一个块看起来像其中一个,其中
    d
    是一个字节的数据:

    d 1
    d 2 2
    d d d 3 3
    . . .
    d 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是一个随机的字节序列,可以确保相同的明文可以使用相同的密钥多次加密,但每次仍然生成不同的密文。

    该机制实际上非常简单,也非常聪明

    想象一个加密8字节块的分组密码:它将每个明文消息分成8字节的组,并将每个组作为单个块进行加密。当谈到最后一个区块时,有两种可能性:

  • 该块小于8字节,必须填充到正好8字节。在这种情况下,必须将一定数量的字节n追加到块中。每个字节都有相同的二进制值n。最后一个块看起来像其中一个,其中
    d
    是一个字节的数据:

    d 1
    d 2 2
    d d d 3 3
    . . .
    d 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是一个随机的字节序列,可以确保相同的明文可以用相同的密钥多次加密,但每次仍会生成不同的密文。

    每个密钥都会“解密”消息,但只有正确的密钥才会生成原始输入。很多库都会在明文中嵌入已知的签名。如果你解密了密码文本并得到了已知的签名,那么很肯定