首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Crypt::RSA和Crypt:: RSA ::SS::PSS在Perl中验证RSA PSS签名时出错

用Crypt::RSA和Crypt:: RSA ::SS::PSS在Perl中验证RSA PSS签名时出错
EN

Stack Overflow用户
提问于 2013-03-31 03:02:18
回答 1查看 1.2K关注 0票数 1

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

情况如下:

我有一个拥有1024位RSA密钥的设备,并使用PSS、SHA1和AES-128对数据进行签名.

我成功地提取了设备的公钥,并将其保存在带有PEM_write_RSA_PUBKEY()的文件中。

我可以使用RSA_verify_PKCS1_PSS()在C/C++中验证这一点,也可以在命令行上使用openssl,如下所示:

代码语言:javascript
复制
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签名,如下所示:

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

因此,我没有创建自己的RSA密钥,而是使用如下所示在公钥中读取:

代码语言:javascript
复制
  $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'); 

其中"key.public“包含设备的公钥,转换为十进制字符串,插入到由Crypt::RSA:: key ::Public读写的变量的"n”字段中。

但我无法证实:-

我应该能够指出,它应该使用SHA1和AES-128 (相对于Blowfish)。

我撞错树了吗?

谢谢…。

EN

回答 1

Stack Overflow用户

发布于 2013-03-31 12:37:05

不知道如何帮助您,而不能够对您的文件和代码进行测试,以便进行调试。但是,虽然不是最好的解决方案,但一个好的工作是在Perl中使用系统调用。如果您能够在命令提示符下验证它,那么您有一些选项可以这样检查它。第一个是system

代码语言:javascript
复制
my $return_code = system("some command");
# or...
my $return_code = system("command", "some", "args");

当您这样做时,您将收到$return_code中返回的退出代码。如果您在命令提示符下使用错误代码在验证失败时进行验证,那么您知道,当一切顺利时,您将收到一个0,当它出错时,将收到另一个号码。

另一种分析系统调用的答案的方法,如果您想读取实际的答案,可以使用backticks:

代码语言:javascript
复制
my $answer = `some system call`;
# or...
my $answer = qx[some system call];

通过这样做,您将捕获通过系统调用发送到STDOUT的任何内容。如果您还想捕获STDERR,那么您可以使用2>&1或类似的方法在同一个调用中重定向它。在这种情况下,您不会得到返回的退出代码。

根据您使用的方法,您可以使用如下的答案:

代码语言:javascript
复制
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的答案,但这至少会帮助您继续前进。

弗朗西斯科

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

https://stackoverflow.com/questions/15725897

复制
相关文章

相似问题

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