DSA 算法:登录 PHP

DSA algorithm : Sign in PHP

我需要在 php 的服务器上签署数据,并在 Java 桌面应用程序上验证签署的数据。我的问题是我没有成功生成两种语言都接受的密钥...

我的第一次尝试是用 Java KeyPairGenerator, but as shown in that question 生成密钥,我无法让 openssl 读取密钥。

现在我用 openssl 生成了密钥:

$openssl dsaparam 512 < /dev/random > dsaparam.pem
$openssl gendsa dsaparam.pem -out dsa_priv.pem
$openssl dsa -in dsa_priv.pem -pubout -out dsa_pub.pem

我现在尝试使用此代码签名:

<?php
$data = "test";

$pkeyid = openssl_pkey_get_private("dsa_priv.pem");
echo openssl_sign($data, $signature, $pkeyid);
echo "<br/>";
echo $signature;
?>

结果?

openssl_sign(): supplied key param cannot be coerced into a private key in ...

我做错了什么?谁能帮我生成一个有效的 DSA 密钥并用它签名?

您在这里遗漏了一件重要的事情。 openssl_pkey_get_private 方法将密钥作为字符串或使用 file:// 协议的文件。以下示例按预期工作:

$data = "test";

$pkeyid = openssl_pkey_get_private("file://dsa_priv.pem");
openssl_sign($data, $signature, $pkeyid);
echo "\nSignature: " . base64_encode($signature) . "\n";

并产生:

Signature: MCwCFBpkSESngh+6ooMQZj7i+76t87QmAhQJTfyvvoZ4YFPd722R2qRnXD/Giw==