有没有办法在PHP中生成PSS填充签名?

时间:2011-12-12 04:23:03

标签: php encryption openssl rsa signing

在PHP中,我想用PSS的填充和SHA512的摘要签署一些文档。

根据文档,在http://www.php.net/manual/en/function.openssl-sign.php,我可以通过使用字符串来设置我需要的摘要,例如

openssl_sign($text-to-sign,$binary_signature,$privkey,"sha512");

但是,我没有看到任何设置填充的方法。

任何人都可以帮助我理解如何使用RSA-PSS填充样式签署文本,如PKCS#1版本2.1中所示?

2 个答案:

答案 0 :(得分:0)

为了不成为"那家伙",我想我会留下一个问题的答案,考虑到这一点在Google及其所有内容中的显示;)

我可以通过http://phpseclib.sourceforge.net/获取PSS填充 到目前为止,我还没有与OpenSSL或LibTomCrypt进行互操作,但.. 我可能只是错误地配置它。

我相信你会有更好的运气,未来的人!

-CPD

答案 1 :(得分:0)

我和您有同样的需求,但是在2019年(我想现在我们有了更好的图书馆;)

您已经发现,方法是使用phpseclib,它现在在Debian Stretch中的版本为2.0。

签名生成

这是我用于使用8192 RSA密钥,PSS填充和SHA512哈希函数对一些二进制数据进行签名的代码:

require "/usr/share/php/phpseclib/autoload.php";
use phpseclib\Crypt\RSA;

// INPUT DATA
$privkey = "...";   // I used a RSA private key in PEM format, generated by openssl, but phpseclib supports many formats...
$mydata = "...";    // I generated some binary bytes here...

// SIGNING
$rsa = new RSA();
if ($rsa->loadKey($privkey) != TRUE) {
    echo "Error loading private key";
    return;
}
$rsa->setHash("sha512");
$rsa->setMGFHash("sha512"); // This NEEDS to be set, or the default will be used
$rsa->setSignatureMode(RSA::SIGNATURE_PSS); // This doesn't need to be set, as it is already the default value
$signatureBytes = $rsa->sign($mydata);

$signatureBytes是一个 binary 字符串(或一个字节数组,正如您在C / C ++ / C#中所称的)。它没有任何编码,并且可能包含NULL字节。这是您想要的签名。

侧面说明:几乎需要安装php-gmp,否则您的签名时间会很痛苦。 Here有一些基准。

使用OpenSSL进行签名验证

  

openssl dgst -sha512 -sigopt rsa_padding_mode:pss -sigopt   rsa_pss_saltlen:-1-验证pubkey.pem -signature signature.bin   plaintextdata.dat

详细地,-sigopt rsa_pss_saltlen:-1告诉openssl使用与哈希算法大小匹配的盐长度。 (this is what the Microsoft APIs do, and there's no way to change that behavior

使用C ++ / CLI(.NET)进行签名验证

为了能够在.NET世界中使用RSA公钥而不使用任何其他库,您需要首先使用openssl将其以BLOB格式导出:

  

openssl rsa -pubin -inform PEM -in pubkey.pem -outform“ MS PUBLICKEYBLOB” -out pubkey.blob

然后,您需要使用新的RSACng CryptoProvider的.NET 4.6。

这就是代码:

// Import the public key (as BLOBDATA)
RSACryptoServiceProvider^ rsaCsp = gcnew RSACryptoServiceProvider();
rsaCsp->ImportCspBlob(pubkey);
RSAParameters rsaParams = rsaCsp->ExportParameters(false);

RSA^ rsa = gcnew RSACng();
rsa->ImportParameters(rsaParams);
array<Byte>^ dataBytes = ...;
array<Byte>^ signatureBytes = ...;
bool signIsValid = rsa->VerifyData(dataBytes, signatureBytes, HashAlgorithmName::SHA512, RSASignaturePadding::Pss);
相关问题