在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中所示?
答案 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 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)
为了能够在.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);