我试图使用公钥解密。
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)
有人可以解释这个错误意味着什么,以及如何避免它?
答案 0 :(得分:1)
原来我使用错误的私钥加密摘要,因此公钥无法解密并抛出该错误。
答案 1 :(得分:1)
我最近遇到此错误,并使用填充算法进行了跟踪,OpenSSL::PKey::RSA
默认为RSA_PKCS1_PADDING
,但是消息是在另一个系统中生成的,默认情况下使用推荐的{{1 }}。公共/私有加密/解密方法都采用可选的第二个参数来设置填充,这为我解决了这个问题。
RSA_PKCS1_OAEP_PADDING
答案 2 :(得分:0)
请确保您尝试使用公钥解密的数据应为加密数据。从代码中看起来,您传递纯文本而不是加密数据。
确保bobs_public_key["digest"]
已加密。通常,它是加密并且要传递的数据的签名。检查您的数据是否有签名。
你得到填充错误,因为在RSA加密中,数据被视为一个大数字,无论二进制是什么,然后它的功率被提高并且有一些填充。对于纯文本或略微修改的数据,该填充检查可能会失败。