Python和Ruby之间的匹配签名

时间:2019-04-04 19:16:50

标签: python ruby openssl cryptography

我已经尝试了几天,以验证一些使用python中的私钥签名的消息。请注意,该消息已使用Ruby签名。

当我在python中签名相同的消息时,我可以验证它没有问题。请注意,我已经验证了哈希值是相同的。

Python代码:

string_to_encrypt = b"aaaaabbbbbaaaaabbbbbaaaaabbbbbCC"
sha1 = SHA.new()
sha1.update(string_to_encrypt)

# load private key
pkey = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open('./license.pem', 'rb').read())
sign_ssl = OpenSSL.crypto.sign(pkey, sha1.digest(), 'RSA-SHA1')
b64_ssl = base64.b64encode(sign_ssl)

Ruby:

string_to_encrypt = "aaaaabbbbbaaaaabbbbbaaaaabbbbbCC"

sha1 = Digest::SHA1.digest(string_to_encrypt)

#sign it
private_key_file = File.join(File.dirname(__FILE__), 'license.pem')
rsa = OpenSSL::PKey::RSA.new(File.read(private_key_file))

signed_key = rsa.private_encrypt(sha1)

#update the license string with it
x = Base64.strict_encode64(signed_key)

我希望b64_ssl和x包含相同的值,而它们不会相同。有人可以告诉我我在那儿想念什么吗?

1 个答案:

答案 0 :(得分:2)

这些代码片段均未​​产生正确的签名。

在Ruby OpenSSL库中,您要使用sign方法,而不是private_encrypt方法,该方法是一种低级操作,不能执行产生有效签名所需的所有操作。 / p>

在两个库中,sign操作都会为您执行哈希处理,您无需事先执行此操作。实际上,您的Python代码实际上是对数据进行了两次 哈希处理。

尝试以下Python代码:

import OpenSSL
import base64

string_to_encrypt = b"aaaaabbbbbaaaaabbbbbaaaaabbbbbCC"

# load private key
pkey = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open('./license.pem', 'rb').read())
sign_ssl = OpenSSL.crypto.sign(pkey, string_to_encrypt, 'SHA1')

b64_ssl = base64.b64encode(sign_ssl)

print(b64_ssl.decode())

产生与此Ruby代码相同的输出:

require 'openssl'
require 'base64'

string_to_encrypt = "aaaaabbbbbaaaaabbbbbaaaaabbbbbCC"

#sign it
private_key_file = File.join(File.dirname(__FILE__), 'license.pem')
rsa = OpenSSL::PKey::RSA.new(File.read(private_key_file))

signed_key = rsa.sign('sha1', string_to_encrypt)

#update the license string with it
x = Base64.strict_encode64(signed_key)

puts x