Php openssl标志不同于python PKCS1_v1_5标志

Php openssl标志不同于python PKCS1_v1_5标志,php,Php,首先,我是新来的,英语不是我的第一语言,所以我很抱歉有任何错误。我需要在php制作的web系统中复制python制作的算法。该算法生成一个密钥以在另一个系统中注册模块。python代码如下所示 def _sign(pc_id, owner_id, product_id): key_file = open('private_key.pem', 'rb') private_key = RSA.importKey(key_file.read()) message = '{0},{1},{2}'.for

首先,我是新来的,英语不是我的第一语言,所以我很抱歉有任何错误。我需要在php制作的web系统中复制python制作的算法。该算法生成一个密钥以在另一个系统中注册模块。python代码如下所示

def _sign(pc_id, owner_id, product_id):
key_file = open('private_key.pem', 'rb')
private_key = RSA.importKey(key_file.read())
message = '{0},{1},{2}'.format(pc_id, owner_id, product_id)
message_hash = SHA256.new(base64.b64encode(message.encode('ascii')))
signer = PKCS1_v1_5.new(private_key)
signature = signer.sign(message_hash)
return signature
php就是这样:

        $fp = fopen("docs/private_key.pem", "r");
        $priv_key = fread($fp, 8192);
        fclose($fp);
        $pkeyid =  openssl_get_privatekey($priv_key);
        $encoding = mb_detect_encoding($codapp,"auto");
        $message_hash = hash("sha256",mb_convert_encoding($codapp,   "ASCII",$encoding));            
        openssl_sign($message_hash, $signature, $pkeyid);           
        openssl_free_key($pkeyid);
        $temp_return= base64_encode($signature);
        $return = mb_convert_encoding($temp_return, $encoding);
        return $return;

直到符号全部确定,散列是一样的,但是,当我尝试使用python代码中相同的私钥进行签名时,$signature会给我一个不同的结果和一个以黑色问号形式充满胡言乱语的字符串,当我使用base64_对该字符串进行编码时,如果结果字符串与python中的不同,则对其进行编码。第一次签任何东西。我在谷歌上搜索了几篇关于签名的帖子,但没有一篇能帮到我。非常感谢。

我想出了一个解决办法。首先,字符串是'nt come in howle',因为视图中的字段限制,因此签名是不同的:(我的错。无论如何,我设法更改了代码并对其进行了改进,结果就是这样

        $fpr = fopen("docs/private_key.pem", "r");
        $fpu = fopen("docs/public_key.pem", "r");
        $priv_key = fread($fpr, 8192); 
        $pub_key = fread($fpu, 8192);

        fclose($fpr); 
        fclose($fpu);
        $pkeyid = openssl_get_privatekey($priv_key);

        openssl_sign($codapp, $signature, $priv_key,"sha256WithRSAEncryption");
        $ok = openssl_verify($codapp, $signature, $pub_key,"sha256WithRSAEncryption" );
        $return = base64_encode($signature);
        return $return; 

现在python和php签名是一样的。感谢回复的人。

不要比较签名。只需验证每个签名。感谢你的回答,我使用两个签名注册产品,因为它的目的是python签名,但php签名没有问题。我想在签名时存在一些编码问题,beca在那之后使用“我会胡言乱语”,就像在文件与浏览器之间消除差异一样……所有openssl函数都有返回码。始终检查此返回码,如果返回码不是您需要的,则不要继续。此外,如果openssl失败,请调用openssl\u error\u string()。