使用phpseclib PHP库等效“openssl dgst -sha1 -sign”

时间:2018-03-07 21:31:22

标签: openssl rsa sha1 sign phpseclib

我已经在谷歌搜索了如何在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);

我是加密新手,但我很惊讶这是一个难以找到答案的主题。有人可以帮忙吗?

1 个答案:

答案 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);