Ни один из этих фрагментов кода на самом деле не производит правильную подпись.
В библиотеке Ruby OpenSSL вы хотите использовать метод sign
, а не метод private_encrypt
, который является операцией низкого уровня, которая не делает все необходимое для создания действительной подписи.
В обеих библиотеках операция 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