使用 phpseclib 验证 RSA-PSS

问题描述 投票:0回答:1

所以我尝试验证使用php库phpseclib v3在golang中签名的rsa-ps签名。 php 验证总是给我一个错误。但让我困惑的是,当我尝试在 php 中签名并验证它在 golang 和 php 中是否有效时。

这是我在 golang 中用于签名和验证签名的代码

签名

rng := rand.Reader
rsa.SignPSS(rng, key, crypto.SHA256, digest, nil)

验证签名

rsa.VerifyPSS(key, crypto.SHA256, digest, signature, nil)

这是在php中验证和签名的代码

验证签名

$key = RSA::loadPublicKey('the key');
$result = $key->withHash('sha256')->withMGFHash('sha256')->verify($message, $signature);

签名

$key = RSA::loadPrivateKey('the key');
$key = $private->withPadding(RSA::SIGNATURE_PSS);
$signature = $private->withHash('sha256')->withMGFHash('sha256')->sign($message);

注意 签名的值以加密的base64形式返回,我在验证签名之前已经解密了该值

任何人都可以解释这是怎么发生的吗?我应该怎么做才能使其适用于两者?

php go rsa digital-signature phpseclib
1个回答
0
投票

在 Go 代码中,在

SignPSS()
调用中,第 5 个参数被指定为
nil
,因此
saltLength()
给出
PSSSaltLengthAuto
,从而应用最大可能的盐长度。
最大可能的盐长度为
signature length - digest output length - 2
(以字节为单位)(例如,使用 2048 位签名/密钥长度和 SHA256 作为摘要:
256 - 32 - 2
字节。

在 PHP 代码中,默认使用摘要输出长度(SHA256 为 32 字节)作为盐长度 s。 这里。因此,为了让 PHP 代码验证 Go 代码的签名,必须使用

withSaltLength()
:

将盐长度显式设置为最大大小
$key = PublicKeyLoader::load($pubKey);
$result =   $key
            ->withHash('sha256')
            ->withMGFHash('sha256')
            ->withSaltLength(256 - 32 - 2)      // Fix! Replace 256 with your signature / key length in bytes
            ->verify($message, $signature);
print($result ? 'valid signature' : 'invalid signature'); // valid signature
© www.soinside.com 2019 - 2024. All rights reserved.