首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在PHP中生成PSS填充签名?

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

Stack Overflow用户
提问于 2011-12-12 12:23:03
回答 2查看 1.3K关注 0票数 2

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

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

代码语言:javascript
复制
openssl_sign($text-to-sign,$binary_signature,$privkey,"sha512");

然而,我看不到任何方法来设置填充。

谁能帮助我理解如何使用RSA-PSS填充样式来签署文本,就像PKCS #1的2.1版本中所看到的那样?

EN

回答 2

Stack Overflow用户

发布于 2019-05-23 22:54:27

我和你有同样的需求,但在2019年(我假设我们现在有更好的库;)

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

签名生成

这是我用来签署一些二进制数据的代码,使用8192RSA密钥,使用PSS填充和SHA512散列函数:

代码语言:javascript
复制
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。

这就是代码:

代码语言:javascript
复制
// 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);
票数 2
EN

Stack Overflow用户

发布于 2011-12-13 08:11:33

为了不成为“那个人”,我想我应该给这个问题一个答案,考虑到这个问题在Google和其他地方是如何显示的;)

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

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

-CPD

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8469909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档