【发布时间】:2013-03-31 03:02:18
【问题描述】:
我无法在 Perl 中使用 Crypt::RSA 和 Crypt::RSA::SS::PSS 验证 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
地点:
- 字符串“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.
因此,我没有创建自己的 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)。
我是不是找错树了?
谢谢……
【问题讨论】:
标签: perl rsa digital-signature public-key-encryption