Python与Ruby的匹配签名

Python与Ruby的匹配签名,python,ruby,openssl,cryptography,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

几天来,我一直在尝试验证一些用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)
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())
红宝石:

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包含相同的值,但它们没有。有人能解释一下我遗漏了什么吗?

这两个代码片段实际上都没有生成正确的签名

在Ruby OpenSSL库中,您希望使用的是
sign
方法,而不是
private\u encrypt
方法,这是一种低级操作,不会执行生成有效签名所需的所有操作

在这两个库中,
sign
操作为您执行哈希运算,您无需事先执行此操作。事实上,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)
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代码相同的输出:

需要“openssl”
需要“base64”
string_to_encrypt=“aaaaa bbbbbbb aaaaa bbbbb aaaaaaa bbbbbbb cc”
#签字
private\u key\u file=file.join(file.dirname(\u\u file\u),'license.pem')
rsa=OpenSSL::PKey::rsa.new(File.read(private_key_File))
signed_key=rsa.sign('sha1',字符串要加密)
#使用它更新许可证字符串
x=Base64.严格编码64(签名密钥)
放x

Yep,谢谢,尽管我还不清楚如何在python/@dibus2中重现private_encrypt的输出,但我认为python OpenSSL库不会公开您需要的低级函数(这是有道理的,Ruby绑定公开它们可能是个错误)。谢谢您的帮助。