読者です 読者をやめる 読者になる 読者になる

✲゚。.ヾ(⌒(ノ'ω')ノ☆.。

変色系男子の日常。

公開鍵暗号アルゴリズム RSA を使ってデジタル署名してみた

暗号 Ruby

先日の 公開鍵暗号アルゴリズム RSA を使って実際に暗号化してみる のおまけ的な記事です。

デジタル署名 にも実は公開鍵暗号アルゴリズムが利用されています。

デジタル署名とは、送信者が受信者へメッセージを送信した際に、そのメッセージの改ざんの検出、送信者のなりすましの検出、送信者の否認の防止などを行うための技術です。これ以上の詳しい説明は省きますが、今回は公開鍵暗号アルゴリズムをデジタル署名にも流用できるという点だけ述べたいと思います。

公開鍵暗号は、メッセージの送信者が (受信者が公開している) 公開鍵を使ってメッセージを暗号化し、それを受け取った受信者が自身のプライベート鍵を使って暗号文を復号化するというものでした。一方デジタル署名では、メッセージの送信者がプライベート鍵を使ってメッセージ*1を暗号化し (これが署名に相当します)、それを受信者が公開鍵を使って復号化します (これが署名の検証に相当します) 。

まとめると、公開鍵暗号とデジタル署名それぞれの鍵の使い方は以下の通りです。

プライベート鍵 公開鍵
公開鍵暗号 受信者が復号化に使う 送信者が暗号化に使う
デジタル署名 送信者が署名に使う 受信者が署名の検証に使う

では、今回も実際にやってみたいと思います。 せっかくなので前回作成した鍵をそのまま流用したいと思います。

プライベート鍵が

{ \displaystyle
\{ D, N \} = \{ 92615, 930473 \}
}

公開鍵が

{ \displaystyle
\{ E, N \} = \{ 5, 930473 \}
}

でした。

今回は 2521 という整数値をメッセージとし、それに署名します。

署名はプライベート鍵を使用して、以下の式の通りに行います。

{ \displaystyle
署名 =  {メッセージ}^{D} \bmod N
}

実際にやってみます。

message = 2521
d, n = 92615, 930473

signature = (message ** d) % n #=> 251690

この 251690 という整数値が署名です。 送信者には 2521 というメッセージに 251690 という署名を添えて送信します。

にっこにっこにー J(*‘ヮ‘*)し →  \{ 2521, 251690 \} → (‘ヘ‘ ζ ナニソレ、イミワカンナイ!

署名の検証は公開鍵を使用して、以下の式の通りに行います。

{ \displaystyle
署名から得られたメッセージ =  {署名}^{E} \bmod N
}

実際にやってみます。

message = 2521
signature = 251690
e, n = 5, 930473

verified_message = (signature ** e) % n #=> 2521
message == verified_message #=> true

送信されたメッセージと署名から得られたメッセージが見事にマッチしました。つまり、署名の検証に成功です!

(‘ヘ‘ ζ 間違いないわ!このメッセージは正真正銘、にこちゃんからだわ!

デジタル署名にも使えるなんて、公開鍵暗号って素晴らしい!!!

*1:メッセージ全体を暗号化する手法では時間が掛かるため、実際はメッセージの ハッシュ値 に対して署名を行うことが多いです。