Java和C+之间的RSA#u NO#u填充不同+;?

Java和C+之间的RSA#u NO#u填充不同+;?,java,c++,encryption,openssl,bouncycastle,Java,C++,Encryption,Openssl,Bouncycastle,在Java中,我使用Bouncy Castle使用填充加密数据: Cipher cipher = Cipher.getInstance("RSA/ECB/NOPADDING"); Base64编码的结果是: AAAAAAAAAAAAAAAAA.....H6hBDxOrCI0K8fd13vOYtsKdo4SI3VZTa3... bxeeBPfFRJsLOzJLMS/qGKtDe1zPw8H491QsE+uuRRay6/ep69fqv386j8... Ant it不会每次都改变 和在C++中,

在Java中,我使用
Bouncy Castle
使用填充加密数据:

Cipher cipher = Cipher.getInstance("RSA/ECB/NOPADDING");
Base64编码的结果是:

AAAAAAAAAAAAAAAAA.....H6hBDxOrCI0K8fd13vOYtsKdo4SI3VZTa3...
bxeeBPfFRJsLOzJLMS/qGKtDe1zPw8H491QsE+uuRRay6/ep69fqv386j8...
Ant it不会每次都改变

<>和在C++中,我使用<代码> OpenSSL
RSA_public_encrypt(rsa_len, (unsigned char *)str, (unsigned char*)p_en, p_rsa, RSA_NO_PADDING);
Base64编码的结果是:

AAAAAAAAAAAAAAAAA.....H6hBDxOrCI0K8fd13vOYtsKdo4SI3VZTa3...
bxeeBPfFRJsLOzJLMS/qGKtDe1zPw8H491QsE+uuRRay6/ep69fqv386j8...
每次我运行代码时,它都会改变

我读过维基并且知道

所以java的结果是合理的,我的问题是:

  • “aaaaaa…”填充是否正确不填充java
  • openssl在C++代码中做了什么导致结果似乎有填充和时变
  • 更新

    我发现我的java代码是正确的。 在我将输入填充到256字节后,openssl可以对java加密结果进行解密

    因此,问题变成了:

    openssl做了什么来填充输入以达到所需的长度

    更新

    最后,我没有太多的时间来研究openssl中的OAEP,而且由于历史问题,服务器使用了这种不安全的方式。所以我用字节0填充输入。就像:

    This is input                         //<-----following many ASCII 0 char to reach 256 bytes length
    
    这是输入//
    每次我运行代码时,它都会改变

    对。那是因为

    如果你两次发送相同的信息,比如黎明攻击,你观察信息的对手在再次看到信息时将无法学到任何东西(或做出有根据的猜测)。该属性称为语义安全或

    下面是马特·格林博士关于PKCS填充和OAEP填充的相关演讲。很平易近人


    “AAAAAAAA…”填充是否正确用于不填充java

    可能吧。我相信它只是一个前导0x00字节的字符串,已经被Base64编码


    < OpenSL在C++代码中做了什么,导致结果看起来有填充和时变?

    它使用OAEP


    因此,问题变成:
    openssl做了什么来填充输入以达到所需的长度

    它使用OAEP


    问题可能会变成:为什么Java不使用它,因为缺少OAEP意味着您可能会泄露每个加密消息的信息。

    初始化
    密码
    实例是一回事,您如何使用它?许多错误源于对此类的误用,尤其是C/C++程序员(无意冒犯,我是认真的),他们没有理解Java中
    char
    byte
    之间的区别。显示更多的代码,请。它帮助我很多!!!由于历史问题,现在服务器使用OAEP。我应该在java中使用哪个OAEP填充来匹配openssl?@zzy-尝试字符串“RSA/ECB/OAEPWithSHA1AndMGF1Padding”或“RSA/None/OAEPWithSHA1AndMGF1Padding”。如果这不起作用,请参见(我并不真正使用Java或Boubcy Castle,因此除了基本的互操作问题之外,我没有多少帮助)。