`public_decrypt':填充检查失败(OpenSSL :: PKey :: RSAError)

时间:2015-05-01 03:57:50

标签: ruby openssl

我试图使用公钥解密。

bob = TCPSocket.open(host, port)

cs_public_key = OpenSSL::PKey::RSA.new File.read 'c_public_key.pem'

puts "Alice is connected to bob"

bobs_public_key = ""
while line = bob.gets # Read lines from socket
  bobs_public_key = bobs_public_key + line   # and build them
end

bobs_public_key = JSON.parse(bobs_public_key)

puts "Alice recieved Bob's Public Key:"
puts bobs_public_key["key"]

#Error is on this line.
decypted = cs_public_key.public_decrypt(Base64.decode64(bobs_public_key["digest"])) 

puts decypted

我收到错误:'public_decrypt': padding check failed (OpenSSL::PKey::RSAError)

有人可以解释这个错误意味着什么,以及如何避免它?

3 个答案:

答案 0 :(得分:1)

原来我使用错误的私钥加密摘要,因此公钥无法解密并抛出该错误。

答案 1 :(得分:1)

我最近遇到此错误,并使用填充算法进行了跟踪,OpenSSL::PKey::RSA默认为RSA_PKCS1_PADDING,但是消息是在另一个系统中生成的,默认情况下使用推荐的{{1 }}。公共/私有加密/解密方法都采用可选的第二个参数来设置填充,这为我解决了这个问题。

RSA_PKCS1_OAEP_PADDING

答案 2 :(得分:0)

请确保您尝试使用公钥解密的数据应为加密数据。从代码中看起来,您传递纯文本而不是加密数据。

确保bobs_public_key["digest"]已加密。通常,它是加密并且要传递的数据的签名。检查您的数据是否有签名。

你得到填充错误,因为在RSA加密中,数据被视为一个大数字,无论二进制是什么,然后它的功率被提高并且有一些填充。对于纯文本或略微修改的数据,该填充检查可能会失败。