我已经在谷歌搜索了如何在phpseclib PHP库中实现“openssl dgst -sha1 -sign”的等价物而没有取得多大成功。
我需要在PHP中实现以下openssl命令行
openssl dgst -sha1 -sign private.rsa.pem -out signature.out.bin data.in.txt
我明白“dgst -sha1 -sign”会 1)创建一个哈希 2)ASN1对哈希进行编码 3)使用私钥对ASN1编码的哈希进行签名,
使用phpseclib~2.0,我已经达到了
use phpseclib\Crypt\RSA;
use phpseclib\Crypt\Hash;
use phpseclib\File\ASN1;
$rsa = new RSA();
$hash = new Hash();
$asn1 = new ASN1();
$rsa->loadKey(file_get_contents($this->privateKeyFile));
$sha1Hash = $hash->hash($data);
$privatekey = $rsa->getPrivateKey();
$encodedsha1Hash = $asn1->encodeDER($privatekey, ???? );
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
$dataSignature = $rsa->sign($encodedsha1Hash);
$rsa->verify($encodedsha1Hash, $dataSignature);
我是加密新手,但我很惊讶这是一个难以找到答案的主题。有人可以帮忙吗?
答案 0 :(得分:1)
查看http://phpseclib.sourceforge.net/interop.html#rsasigpkcs1,p1openssl,p2phpseclib。
在您的代码中,您正在执行此操作:
$sha1Hash = $hash->hash($data);
$privatekey = $rsa->getPrivateKey();
$encodedsha1Hash = $asn1->encodeDER($privatekey, ???? );
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
$dataSignature = $rsa->sign($encodedsha1Hash);
将所有内容替换为:
$dataSignature = $rsa->sign($data);
另外,不要这样做:
$rsa->verify($encodedsha1Hash, $dataSignature);
这样做:
$rsa->verify($data, $dataSignature);