Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php签名示例_Php_Encryption_Signature - Fatal编程技术网

php签名示例

php签名示例,php,encryption,signature,Php,Encryption,Signature,我实现了一个关于数字签名如何工作的示例(为了更好地理解自己)(在我使用php的例子中) 我使用了Bob和Alice的故事,标题是“如何使用数字签名进行身份验证?” 假设Alice想向Bob发送一条签名的消息。她通过对消息使用哈希函数来创建消息摘要。消息摘要用作“数字指纹”“电文的内容;如果修改了消息的任何部分,哈希函数将返回不同的结果。Alice然后用她的私钥加密消息摘要。此加密邮件摘要是邮件的数字签名。 Alice将消息和数字签名发送给Bob。当Bob收到它们时,他使用Alice的公钥解密签名

我实现了一个关于数字签名如何工作的示例(为了更好地理解自己)(在我使用php的例子中)

我使用了Bob和Alice的故事,标题是“如何使用数字签名进行身份验证?”

假设Alice想向Bob发送一条签名的消息。她通过对消息使用哈希函数来创建消息摘要。消息摘要用作“数字指纹”“电文的内容;如果修改了消息的任何部分,哈希函数将返回不同的结果。Alice然后用她的私钥加密消息摘要。此加密邮件摘要是邮件的数字签名。 Alice将消息和数字签名发送给Bob。当Bob收到它们时,他使用Alice的公钥解密签名,从而显示消息摘要。为了验证消息,他使用Alice使用的相同哈希函数对消息进行哈希,并将结果与从Alice收到的消息摘要进行比较。如果他们完全平等,Bob可以确信这条信息确实来自Alice,并且自她签字以来没有改变。如果消息摘要不相等,则消息可能来自其他地方,或者在签名后被更改(或者私钥不同)。”

在我发布代码之前,我想说的是,这可能不是不使用标准生成密钥的正确方法。但我应该让我(也许你)了解签名是如何工作的

echo "Example 2 <br><br>";

$res = openssl_pkey_new();

/* Extract the private key from $res to $privKey */
openssl_pkey_export($res, $privKey);

/* Extract the public key from $res to $pubKey */
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];

$message = "Im a message";

echo "<br><br><strong>Public key:</strong><br>";
echo $pubKey;
echo "<br><br><strong>Private key:</strong><br>";
echo $privKey;

echo "<br><br><strong>Message:</strong><br>";
echo $message;

echo "<br><br><strong>Message digest:</strong><br>";
echo $md5message = sha1($message);

echo "<br><br><strong>Message digest encrypted(signature):</strong><br>";
openssl_private_encrypt($md5message, $crypted, $privKey);
echo $crypted;

echo "<br><br><strong>Bob uses sha1 as well for the message:</strong><br>";
echo $md5message = md5($message);

echo "<br><br><strong>Bob checks with decrypt(verify):</strong><br>";
openssl_public_decrypt($crypted, $decrypted, $pubKey);
echo $decrypted;
echo“示例2

”; $res=openssl_pkey_new(); /*将私钥从$res提取到$privKey*/ openssl_pkey_导出($res,$privKey); /*将公钥从$res提取到$pubKey*/ $pubKey=openssl\u pkey\u get\u详细信息($res); $pubKey=$pubKey[“key”]; $message=“我是一条消息”; echo“

公钥:
”; echo$pubKey; echo“

私钥:
”; echo$privKey; 回显“

消息:
”; 回声$信息; 回显“

消息摘要:
”; echo$md5message=sha1($message); echo“

加密的邮件摘要(签名):
”; openssl_private_encrypt($md5message,$crypted,$privKey); 回声加密; echo“

Bob也使用sha1作为消息:
”; echo$md5message=md5($message); echo“

鲍勃使用解密(验证)进行检查:
”; openssl_public_decrypt($crypted,$decrypted,$pubKey); echo$已解密;
我有3个问题:

1) 签名工作流程是否正确?我应该更改什么(如前所述,我不想生成“正确的”。pem、.crt等键…将是我的下一步)

2) 在我的理解中,私钥总是用来解密的。用于加密的公钥。我知道这里的措辞是私钥的签名,并用公钥进行验证。显然,在这个示例中,我只能用公钥进行验证。我无法理解这一点。这怎么可能?也许你可以给我一个更好的示例或链接s

3) 我应该在我的实现中改变什么


提前谢谢。

好的,我会说几句话

  • 关于Alice和Bob的文本似乎是正确的,尽管最后一句话“如果消息摘要不相等,则消息可能起源于其他地方,或者在签名后被更改。”显然可以用“或使用不同私钥签名的消息”扩展

  • 虽然
    openssl\u private\u encrypt
    的级别有点太高,无法显示实际发生的情况,但工作流基本上是正确的。它可能会为签名生成执行填充,但不会对所用哈希算法的OID进行编码(请参阅可读性较高的PKCS#1规范,以了解我所说的内容).因此,从这个意义上讲,您的签名方案不太可能与其他任何东西进行验证

  • 因此,很明显,验证部分缺少实际验证,您需要将结果哈希与本地计算的哈希进行比较。此外,您永远不应该使用MD5。您可能应该使用PSS填充方案,而不是旧的PKCS#1 v1.5兼容方案


  • 你能给我签名的十六进制编码、模数和公共指数吗?我很有兴趣在
    openssl\u private\u encrypt
    上做一些额外的测试。我不太清楚你的意思,因为它是动态生成的……我修正了措辞并在sha1中转换了md5。非常感谢你的建议。