在python中使用SHA256 encrypyion和.p12文件创建签名

2024-09-29 19:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

任何人都可以用Python编写相同的代码吗

<?php
        $payload = '{"amount":205.16,"currency":"AED","language":"en","merchant_code":"O8Ryrfvy8aUb","merchant_order":"931","redirect_urls":{"cancel":"http://127.0.0.1:8000/api/pointspay-cancel","fail":"http://127.0.0.1:8000/api/pointspay-failed","success":"http://127.0.0.1:8000/api/pointspay-success"},"timestamp":1604722764987,"type":"direct"}';
        echo x509_fingerprint($payload, '/home/tmt/Documents/Protect4less/LoyLogic/pointspay_certificate.p12', 'Protect4Less@123', 'sha256') . "\n\n";
    
    
        function x509_fingerprint($payload, $cert_path, $cert_pass, $algorithm = 'sha256')
        {
            $algorithm = in_array($algorithm, array(
                'sha1',
                'md5',
                'sha256'
            )) ? $algorithm : 'sha1';
            
            // 1. Capture the private key from certificate
            if (!$cert_store = file_get_contents($cert_path)) {
                echo "Error: Unable to read the cert file\n";
                exit;
            }
            
            if (openssl_pkcs12_read($cert_store, $cert_info, $cert_pass)) {
            } else {
                echo "Error: Unable to read the cert store.\n";
                exit;
            }
    
            
            $privateKey = $cert_info['pkey'];
            print_r($privateKey);
    
            // 2. create message digest
            $messageDigest = openssl_digest($payload, $algorithm, true);
            
            // 3. Sign the message digest using private key
            openssl_private_encrypt($messageDigest, $encryptedData, $privateKey);
            return base64_encode($encryptedData);
    }
    
    ?>

这是PHP代码,我想在PYTHON中执行相同的步骤,任何人都可以帮助我这样做。 我在python中尝试了很多东西,但都没能做到

下面是我尝试过的Python代码,但最终签名与PHP签名不匹配

from OpenSSL import crypto
import hashlib
from base64 import b64encode

str1 = b'{"amount":205.16,"currency":"AED","language":"en","merchant_code":"O8Ryrfvy8aUb","merchant_order":"931","redirect_urls":{"cancel":"http://127.0.0.1:8000/api/pointspay-cancel","fail":"http://127.0.0.1:8000/api/pointspay-failed","success":"http://127.0.0.1:8000/api/pointspay-success"},"timestamp":1604722764987,"type":"direct"}'

psw = 'Protect4Less@123'
p12 = crypto.load_pkcs12(open("/home/tmt/Documents/Protect4less/LoyLogic/pointspay_certificate.p12", 'rb').read(), psw)


pkey = p12.get_privatekey()

my_hash2 = hashlib.sha256() #Choose SHA256 and update with same bytes
my_hash2.update(str1)
hash_digest = my_hash2.hexdigest()
print("Result after digesting: " + str(my_hash2.hexdigest()))


# data = str1
my_signature = crypto.sign(pkey, str1, 'sha256')
signature_b64 = b64encode(my_signature)
print(signature_b64)

Tags: theapihttpreadcertmymerchantalgorithm

热门问题