我试图在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
答案 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)