Java和C+之间的RSA#u NO#u填充不同+;?
在Java中,我使用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++中,
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的结果是合理的,我的问题是:
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,因此除了基本的互操作问题之外,我没有多少帮助)。