【问题标题】:String encrypted in Ruby gives: 'BadPaddingException' when decrypted in Java在 Ruby 中加密的字符串给出:在 Java 中解密时出现“BadPaddingException”
【发布时间】:2017-11-07 23:16:14
【问题描述】:

我正在使用以下 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 解密时,就会出现问题。

【问题讨论】:

  • 在 Ruby 和 Java 中将模数输出为 BigInteger 并检查它们是否相同。应该可以帮助您确定您是否在 Java 中正确加载了私钥。还要检查每个使用的填充。如果您使用的是 PKCS#1Padding 或 OAEP,您的 Ruby 代码并不明显。
  • 好吧,我的代码使用的是 PKCS1 填充。
  • 那么 Java 端期望什么填充?
  • @EbbeM.Pedersen 它需要 PKCS1。
  • 您的问题中需要包含API的Java代码,包括解密部分,加载私钥和解码客户端发送的数据

标签: java ruby encryption rsa public-key-encryption


【解决方案1】:

我编写了一个非常简单的 Java 程序来解密这个非常简单的 Ruby 程序的输出,它运行良好。因此,ruby openssl 模块和标准 Java 密码学之间没有固有不兼容,这并不奇怪。没有更多关于 Java 方面的信息,我们所能做的就是列出一些可能性:

  1. 键不匹配

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

  1. 格式问题

显然,您传输的内容(带有嵌入换行符的 base64 编码字符串)必须在 Java 端正确解析和解码。获取单个字节错误可能会导致您看到的错误。大多数 base64 解码器要么阻塞换行并抛出异常,要么忽略它们。这两种解释都不会导致 BadPaddingException。也许 Java 方面期待Base64URL instead of Base64如果 Java 端期待 base64url 编码,而 if 它会忽略无效字符,那么这可能是问题所在。值得尝试从 base64 输出中删除包括换行符在内的空格,如果这不起作用,请尝试使用 base64url 编码器进行编码(同样,从输出中删除任何空格)。

【讨论】:

    【解决方案2】:

    根据the openJdk source code,BadPaddingException 表示“如果此密码处于解密模式,并且已请求(取消)填充,但解密的数据不受适当的填充字节的限制”。这意味着此异常有两个不同的可能原因 - 其名称可能具有误导性,而在最低级别在技术上是正确的 - 填充错误或解密与加密不匹配。在后一种情况下,解密的结果将是乱码,因此 - 解释源代码的技术语言 - 不适合填充方案。

    【讨论】:

      【解决方案3】:

      来自Cryptography book

      'PKCS1 填充将 11 个字节添加到您的原始数据。'

      所以你应该使用大小为公钥长度的缓冲区加密 - 11 并使用实际公钥大小进行解密

      对于 1024 位 RSA 密钥,加密大小通常为 117,解密缓冲区大小为 128。

      【讨论】:

        猜你喜欢
        • 2021-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2018-08-30
        • 2015-08-04
        • 1970-01-01
        • 2017-10-29
        相关资源
        最近更新 更多