由于填充检查失败,Ruby OpenSSL RSA解密失败

时间:2017-03-30 17:20:16

标签: python ruby encryption cryptography rsa

我试图在ruby中复制以下python代码。 python代码工作正常,ruby代码由于"填充检查失败而失败"。我可以加密一个字符串并使用Ruby中的私钥解密它,但我需要处理的加密数据是从其他地方检索的。我不确定库甚至用于加密它的语言,但Python代码可以工作。

使用Python代码:

def decrypt_secret(encrypted_base64, private_key):
  key = RSA.importKey(open(private_key, "r").read())
  pkey = PKCS1_OAEP.new(key, hashAlgo=SHA256)
  encrypted_blob = base64.urlsafe_b64decode(encrypted_base64)
  decrypted_string = pkey.decrypt(encrypted_blob)
  return decrypted_string

Ruby代码失败"填充检查失败"

def decrypt_secret(encrypted_base64, private_key)
  key = File.read(private_key)
  pkey = OpenSSL::PKey::RSA.new(key)
  encrypted_blob = Base64.urlsafe_decode64(encrypted_base64)
  decrypted_string = pkey.private_decrypt(encrypted_blob, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING)
  return decrypted_string
end 

2 个答案:

答案 0 :(得分:3)

我找到了JOSE gem中包含的所需功能,以支持SHA256 OAEP。以下代码完成了这项工作:

require 'jose'
def decrypt_secret(encrypted_base64, private_key)
  key = File.read(private_key)
  pkey = OpenSSL::PKey::RSA.new(key)
  encrypted_blob = Base64.urlsafe_decode64(encrypted_base64)
  decrypted_string = JOSE::JWA::PKCS1::rsaes_oaep_decrypt(OpenSSL::Digest::SHA256, encrypted_blob, pkey)
  return decrypted_string
end

答案 1 :(得分:1)

它看起来不像Ruby的OpenSSL包装器公开了更改OAEP的哈希函数的选项。您需要更改Python代码以使用SHA-1(默认值):

pkey = PKCS1_OAEP.new(key)