java - 在 Ruby 中加密的字符串给出 : 'BadPaddingException' when decrypted in Java

标签 java ruby encryption rsa public-key-encryption

我正在使用以下 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 方面的更多信息,我们所能做的就是列出一些可能性:

  1. 键不匹配

您使用的公钥必须与 Java 端使用的私钥相对应。否则,您可能会收到 BadPadding 异常。

  1. 格式问题

显然,您传输的内容(带有嵌入换行符的 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/

相关文章:

java - TestNG 测试套件执行时间

ruby-on-rails - authlogic 电子邮件作为用户名

ruby-on-rails - Rails 4 用户之间的积分交换

reactjs - 如何在 React Native 中加密数据(使用 Expo)

java - 从 Java 运行时与在终端中运行时的 SVN Info 命令不同

java - Android 中获取 UTF-16 字节数组最有效的 getBytes 是哪个

java - 如何反编译带有加密类的.jar程序

asp.net - bcrypt/Bcrypt.net 的优势和替代方案

java - 如何使用 Java 在 Selenium WebDriver 中禁用 Chrome 插件

ruby - Prawn - 将图像放在每页的页脚中