在Ruby中加密的字符串给出:在Java

时间:2017-11-07 23:16:14

标签: 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解密时,就会出现问题。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

来自Cryptography book

  

' PKCS1填充为原始数据增加了11个字节。'

因此,您应使用大小公钥长度为11的缓冲区进行加密,并使用实际公钥大小进行解密

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