0

デジタル署名がどのように機能するか (私の場合は php を使用) の例を (自分自身の理解を深めるために) 実装しました。

「デジタル署名は認証にどのように使用されますか?」のボブとアリスの話を使用しました。http://www.verisign.com.au/repository/tutorial/digital/intro1.shtmlから

ボブは、メッセージが実際にアリスから送信されたものであり、アリスが署名してから変更されていないことを確信できます。メッセージ ダイジェストが等しくない場合、メッセージは別の場所で発信されたか、署名後に変更された (または秘密鍵が異なる) かのいずれかです。」

コードを投稿する前に、これはおそらく標準の生成キーを使用しない正しい方法ではないことを述べたいと思います。しかし、署名がどのように機能するかについて、私 (そしておそらくあなた) に理解してもらう必要があります。

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) 実装で何を変更する必要がありますか?

前もって感謝します。

4

1 に答える 1

1

わかりました、私はいくつかの発言をします。

  1. Alice と Bob に関するテキストは正しいように見えますが、最後の文「メッセージ ダイジェストが等しくない場合、メッセージは別の場所で発信されたか、署名後に変更されました。」明らかに、「または別の秘密鍵で署名されたメッセージ」で拡張できます。

  2. ワークフローはほぼ正しいですopenssl_private_encryptが、実際に何が起こっているかを示すにはレベルが高すぎます。署名生成のためにパディングを実行する可能性がありますが、使用されるハッシュ アルゴリズムの OID をエンコードすることはありません (私が話していることを確認するには、かなり読みやすい PKCS#1 仕様を参照してください)。その意味で、あなたの署名スキームは他のものと検証される可能性は低いです.

  3. したがって、明らかに検証部分には実際の検証が欠けているため、結果のハッシュをローカルで計算したものと比較する必要があります。さらに、MD5 は絶対に使用しないでください。おそらく、古い PKCS#1 v1.5 互換スキームの代わりに PSS パディング スキームを使用する必要があります。

于 2013-03-02T15:37:28.207 に答える