首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DSA签名: openssl_sign (php) vs Crypt::OpenSSL::DSA (perl)不匹配

DSA签名: openssl_sign (php) vs Crypt::OpenSSL::DSA (perl)不匹配
EN

Stack Overflow用户
提问于 2013-11-14 11:25:47
回答 1查看 2K关注 0票数 1

目前,在我的项目中,DSA签名正在通过perl生成,并通过其他服务器上的perl进行验证。效果很好。

几天前,我尝试将一个服务从perl迁移到php,发现php生成标志,perl无法验证。更重要的是,如果我在控制台中生成签名(使用openssl命令)- perl也说签名无效。看起来是这样的:

PHP签名<= ok =>控制台签名<=不确定!=> perl签名

为什么会发生这种事?

私钥,即用于签名的是相同的。

Perl代码:

代码语言:javascript
复制
my $pk = Crypt::OpenSSL::DSA->read_priv_key('private.key');
print encode_base64( $pk->sign( md5($data) ) );

PHP代码:

代码语言:javascript
复制
$pk = openssl_get_privatekey('private key string');
openssl_sign(md5($data, true), $signature, $pk, OPENSSL_ALGO_DSS1));
echo base64_encode($signature);

控制台代码(验证):

代码语言:javascript
复制
openssl dsa -in private_key.pem -pubout -out dsa_public_key.pem
openssl dgst -dss1 -verify dsa_public_key.pem -signature sign.bin data.md5

完全迷失..。第二天我找不到任何答案:(你能告诉我怎么挖吗?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-14 16:00:24

请注意,在您的示例中,您要在签名时做双摘要:dss1(md5(message)) - dss1实际上是指sha1

所以,您可以创建这样的签名:

代码语言:javascript
复制
echo -n 'data you want to sign' | openssl dgst -md5 -binary | openssl dgst -dss1 -sign openssl_dsa1_pri.pem > signature.bin

您可以通过openssl逗号来验证它,如下所示:

代码语言:javascript
复制
echo -n 'data you want to sign' | openssl dgst -md5 -binary | openssl dgst -dss1 -verify openssl_dsa1_pub.pem -signature signature.bin

使用Crypt::OpenSSL::DSA,您可以这样验证它:

代码语言:javascript
复制
my $signature = read_file("signature.bin");
my $message = 'data you want to sign';
my $pub = Crypt::OpenSSL::DSA->read_pub_key('openssl_dsa1_pub.pem');
warn "Verified=", $pub->verify(sha1(md5($message)), $signature), "\n";

当然,双文摘没有必要,您可以使用:

代码语言:javascript
复制
echo -n 'data you want to sign' | openssl dgst -dss1 -sign openssl_dsa1_pri.pem > signature2.bin

echo -n 'data you want to sign' | openssl dgst -dss1 -verify openssl_dsa1_pub.pem -signature signature2.bin

my $signature = read_file("signature2.bin");
my $message = 'data you want to sign';
my $pub = Crypt::OpenSSL::DSA->read_pub_key('openssl_dsa1_pub.pem');
warn "Verified=", $pub->verify(sha1($message), $signature), "\n";
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19976445

复制
相关文章

相似问题

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