デジタル署名がどのように機能するか (私の場合は 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) 実装で何を変更する必要がありますか?
前もって感謝します。