当前位置: 首页 > 知识库问答 >
问题:

使用Crypt::RSA和Crypt::RSA::SS::PSS在Perl中验证RSA PSS签名时出现问题

微生俊
2023-03-14

我无法使用Crypt::RSA和Crypt::RSA::SS::PSS在Perl中验证PSS签名。

echo -n hello | 
openssl dgst -verify pubkey.pem -signature hello.sig -sha1 \
             -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:20
  • 字符串“hello”是由设备签名的缓冲区。
  • “pubkey.pem”是设备的RSA公钥,用PEM_write_RSA_PUBKEY()从设备导出。
  • “hello.sig”包含由设备生成的二进制(原始)签名。(因为有填充,所以是128字节。)

我试图在Perl中使用crypt::rsa和crypt::rsa::ss::pss来执行上述操作,但无法使其正常工作。

我已经测试了这两个模块,并且能够在生成自己的密钥时用Perl生成和验证PSS签名,如下所示:

use Crypt::RSA;
use Crypt::RSA::SS::PSS;

my ($message, $rsa, $pss, $signature, $verify);
my ($public, $private);


 # The message to be encrypted
 #
$message = "hello";


 # Generate RSA key
 #
$rsa = new Crypt::RSA;
($public, $private) = $rsa->keygen( Size => 1024, Filename => "key" );


 # Generate PSS signature
 #
$pss = new Crypt::RSA::SS::PSS;

$signature = $pss->sign ( Message => $message, Key => $private ) || die $pss->errstr;

$verify = $pss->verify ( Message => $message, Key => $public, Signature => $signature ) || die $pss->errstr;

 # $verify returns true, it worked.
  $publicKey = new Crypt::RSA::Key::Public ( Filename => "key.public"  );
  ...
 # I pack the 256 character (128 byte) hex string of the signature
 # that's generated by the device.
  $signature = pack ("H*", '03808458…..73E92'); 

我想我应该能够指出它应该使用SHA1和AES-128(与Blowfish相反)。
我是不是找错人了?

谢谢…。

共有1个答案

赵灼光
2023-03-14

如果无法对文件和代码进行测试以进行调试,则不确定如何帮助您。但是,虽然不是最好的解决方案,但一个很好的工作是在Perl中使用系统调用。如果您能够在命令提示符上验证它,您可以使用一些选项来检查它。第一个是系统:

my $return_code = system("some command");
# or...
my $return_code = system("command", "some", "args");

这样做时,将在$return_code中收到返回的退出代码。如果在命令提示符中验证它的任何操作都在验证失败时以错误代码退出,那么当一切顺利时,您将收到0,当出错时,您将收到另一个数字。

分析系统调用答案的其他方法,如果您想读取实际答案,请使用backticks id:

my $answer = `some system call`;
# or...
my $answer = qx[some system call];
if ($return_code == 0) {
    print "Verified!";
}
# or...
if ($answer =~ /OpenSSL.*?Verification sucess.*?Signature code:(\d+)/) {
    # I'm just making up stuff here, I don't know the answer of your command!
    print "Verification succesful. Signature code was $1";
}

我希望这能有所帮助。我希望我能测试实际的脚本和文件,并给出一个纯Perl的答案,但这至少可以帮助您目前取得进展。

弗朗西斯科

 类似资料:
  • 我正在处理C RPC客户端。我需要使用OpenSSL对mime数据进行签名,并将公钥和签名发送到服务器。Java将尝试使用公钥验证签名。 问题是,JAVA无法验证OpenSSL生成的签名,但可以验证JAVA生成的签名。你知道如何修复我的c客户端代码吗? C客户端代码: JAVA代码:

  • 我有一个JavaScript客户端和一个Node服务器。JS.我试图在客户端签署一个简单的文本,并将签名与公钥一起发送到服务器,然后服务器可以验证公钥。 客户端的任何东西都可以!但我无法在服务器端验证签名。我认为您没有必要阅读客户机代码,但为了保证,我也会提供它。 客户代码: 服务器代码(为此我使用express): 服务器控制台日志: 注: 我认为在服务器中正确导入了公钥,因为当我在服务器中再次

  • 问题内容: 我试图使自己熟悉pycrypto模块,但是缺少清晰的文档使事情变得困难。 首先,我想了解签名和验证数据。有人可以举例说明如何写吗? 问题答案: 这是文档中示例的丰富版本:

  • 我正在尝试将支付网关集成到我的nodejs应用程序中。当支付完成时,网关用支付结果将用户重定向到我的站点。结果是RSA签名的,我需要用支付网关提供的公钥来验证它。 下面是支付网关为签名验证提供的示例PHP代码。 有谁知道怎么把这件事搞定吗?

  • 我已经使用Node rsa在Node中生成了一对私钥和公钥,并且可以在Node中使用这些密钥成功地进行签名和验证。 我尝试使用公钥的模和指数来验证中的签名(由节点中的私钥签名)。网 e、 g.我有一个string=“foo”,它有一个由Node生成的签名“abc123”。在里面NET我想使用公钥的模和指数来确认签名“abc123”对“foo”有效。 我想使用模数和指数而不是直接使用公钥的原因是因为

  • 在PHP中,我试图使用AWS的RSA公钥(我在https://cognito-identity.amazonaws.com/.well-known/jwks_uri). 密钥以适当的页眉/页脚开始,然后开始RSA公钥等等。我查看了一些PHP库,如Emarref\Jwt\Jwt\code>,但是我发现了错误:。这一切归结为基本的php函数:。 我已经研究了php。net/manual进行openss