Ruby 由于填充检查失败,OpenSSL RSA 解密失败
Ruby OpenSSL RSA decryption failing due to padding check failed
我正在尝试在 ruby 中复制以下 python 代码。 python 代码工作正常,ruby 代码由于 "padding check failed" 而失败。我可以加密一个字符串并使用 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 代码失败 "padding check failed"
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
Ruby 的 OpenSSL 包装器似乎没有公开更改 OAEP 哈希函数的选项。您需要更改 Python 代码以使用 SHA-1(默认):
pkey = PKCS1_OAEP.new(key)
我发现 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
我正在尝试在 ruby 中复制以下 python 代码。 python 代码工作正常,ruby 代码由于 "padding check failed" 而失败。我可以加密一个字符串并使用 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 代码失败 "padding check failed"
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
Ruby 的 OpenSSL 包装器似乎没有公开更改 OAEP 哈希函数的选项。您需要更改 Python 代码以使用 SHA-1(默认):
pkey = PKCS1_OAEP.new(key)
我发现 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