我正在使用以下 Ruby 代码来加密字符串
require 'openssl'
require 'base64'
public_key = OpenSSL::PKey::RSA.new(File.read('public_key'))
Base64.encode64(public_key.public_encrypt('Some random string that I want to encrypt.'))
我需要将请求中的加密文本传递给 API,在 API 端,我收到以下错误(阅读 API 日志):
javax.crypto.BadPaddingException: Decryption error
现在,我已经在 Stackoverflow 上解决了无数问题,但考虑到我的 Ruby 代码,我做错了什么,加密文本无法在 API 端解密。很明显,API端使用的是Java。
在加密方面我完全是菜鸟,但是通过在Ruby 中进行加密和解密,我确保了在Ruby 中的实现是正确的。当通过Ruby语言加密的文本在API端通过Java解密时,问题就出现了。
最佳答案
我编写了一个非常简单的 Java 程序来解密这个非常简单的 Ruby 程序的输出,并且运行良好。因此,毫不奇怪,在 ruby openssl 模块和标准 Java 密码学之间没有固有的不兼容性。没有关于 Java 方面的更多信息,我们所能做的就是列出一些可能性:
- 键不匹配
您使用的公钥必须与 Java 端使用的私钥相对应。否则,您可能会收到 BadPadding 异常。
- 格式问题
显然,您传输的内容(带有嵌入换行符的 base64 编码字符串)必须在 Java 端正确解析和解码。获取单个字节错误可能会导致您看到的错误。大多数 base64 解码器要么在换行符处阻塞并抛出异常,要么忽略它们。这两种解释都不会导致 BadPaddingException。也许 Java 方面期待 Base64URL instead of Base64 ? 如果 Java 端需要 base64url 编码,如果它忽略了无效字符,那么这可能就是问题所在。值得尝试从 base64 输出中删除包括换行符在内的空格,如果这不起作用,则尝试使用 base64url 编码器进行编码(同样,从输出中删除任何空格)。
关于java - 在 Ruby 中加密的字符串给出 : 'BadPaddingException' when decrypted in Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47168986/