我无法使用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,如下所示:
echo -n hello |
openssl dgst -verify pubkey.pem -signature hello.sig -sha1 \
-sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:20其中:
我试图在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.因此,我没有创建自己的RSA密钥,而是使用如下所示在公钥中读取:
$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)。
我撞错树了吗?
谢谢…。
发布于 2013-03-31 12:37:05
不知道如何帮助您,而不能够对您的文件和代码进行测试,以便进行调试。但是,虽然不是最好的解决方案,但一个好的工作是在Perl中使用系统调用。如果您能够在命令提示符下验证它,那么您有一些选项可以这样检查它。第一个是system
my $return_code = system("some command");
# or...
my $return_code = system("command", "some", "args");当您这样做时,您将收到$return_code中返回的退出代码。如果您在命令提示符下使用错误代码在验证失败时进行验证,那么您知道,当一切顺利时,您将收到一个0,当它出错时,将收到另一个号码。
另一种分析系统调用的答案的方法,如果您想读取实际的答案,可以使用backticks:
my $answer = `some system call`;
# or...
my $answer = qx[some system call];通过这样做,您将捕获通过系统调用发送到STDOUT的任何内容。如果您还想捕获STDERR,那么您可以使用2>&1或类似的方法在同一个调用中重定向它。在这种情况下,您不会得到返回的退出代码。
根据您使用的方法,您可以使用如下的答案:
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的答案,但这至少会帮助您继续前进。
弗朗西斯科
https://stackoverflow.com/questions/15725897
复制相似问题