在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版本中所看到的那样?
发布于 2019-05-23 22:54:27
我和你有同样的需求,但在2019年(我假设我们现在有更好的库;)
正如您已经发现的,方法是使用phpseclib,它现在是Debian Stretch的2.0版本。
签名生成
这是我用来签署一些二进制数据的代码,使用8192RSA密钥,使用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是一个二进制字符串(或在C/C++/C#中称为字节数组)。它没有任何编码,可能包含空字节。这是你想要的签名。
附注:安装php-gmp几乎是必需的,否则你会得到非常慢的签名时间。Here有一些基准测试。
基于OpenSSL的签名验证
openssl dgst -sha512 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 -verify 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);发布于 2011-12-13 08:11:33
为了不成为“那个人”,我想我应该给这个问题一个答案,考虑到这个问题在Google和其他地方是如何显示的;)
到目前为止,我可以通过http://phpseclib.sourceforge.net/获得PSS填充,我还没有让它与OpenSSL或LibTomCrypt互操作,但是..我可能只是配置错了。
我相信你会有更好的运气,未来的人!
-CPD
https://stackoverflow.com/questions/8469909
复制相似问题