2013-03-01 36 views
0

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

我在“如何使用数字签名进行身份验证?”中使用了Bob和Alice的故事。从http://www.verisign.com.au/repository/tutorial/digital/intro1.shtml

“假设Alice想发送签名邮件给Bob,她创建了一个消息,通过对消息的哈希函数消息摘要摘要作为。‘该消息的数字指纹’,如果任何部分的消息被修改后,哈希函数返回不同的结果,然后Alice用她的私钥对消息摘要进行加密,这个加密的消息摘要是消息的数字签名 Alice向Bob发送消息和数字签名。当Bob收到这些消息时,他使用Alice的公钥解密签名,从而揭示消息摘要。为了验证消息,他然后用Alice使用的相同散列函数对消息进行散列,并将结果与​​他从Alice收到的消息摘要进行比较。如果他们完全平等,鲍勃可以合作事实上,这条消息确实来自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; 

我有3个问题:。

1)如何工作流程权签名的工作?我应该改变什么(如前所述,我不想生成“正确”.pem,.crt等密钥。对我来说会是下一步)。

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

3)我在执行中应该改变什么?

在此先感谢。

+0

你能给我签名,模数和公开指数的十六进制编码吗?我非常有兴趣在'openssl_private_encrypt'上做一些额外的测试。 – 2013-03-02 15:38:19

+0

不完全确定你的意思,因为它是在飞行中生成的...... – whereismydipp 2013-03-04 01:11:49

回答

1

好的,我会发表一些评论。

  1. 约Alice和Bob的文字似乎是正确的,但最后一句“如果消息摘要不相等,则消息无论是源于其他地方或在签名之后被改变。”显然可以用“或用不同的私钥签名的消息”进行扩展。

  2. 工作流程大致正确,但openssl_private_encrypt有点太高,无法显示实际发生的情况。它很可能会执行填充来生成签名,但不会对所使用的哈希算法的OID进行编码(请参阅相当可读的PKCS#1规范以查看我在说什么)。所以从这个意义上说,你的签名方案不太可能与其他任何东西进行验证。

  3. 因此,显然验证部分缺少实际验证,您需要将生成的散列值与本地计算的散列值进行比较。此外,你永远不应该使用MD5。可能您应该使用PSS填充方案而不是旧的PKCS#1 v1.5兼容方案。

+0

我修正了措辞并在sha1中转换了md5。非常感谢您的建议。 – whereismydipp 2013-03-04 01:11:21