公開鍵認証の実装をしていたのですが、認証の仕方を勘違いしていたことが発覚。
忘れないようにメモしておきます。
暗号化の種類
まず、暗号化には大きく分けて2つの種類があります。
「共通鍵認証」と「公開鍵認証」です。
共通鍵認証
送信者と受信者が、それぞれ共通の秘密鍵を持っていることを前提として、その共通の鍵を使用して暗号化と複合化を行う認証。
共通鍵のメリットは、暗号化・復号化のコストが低いことです。
逆にデメリットは、最初に共通鍵を共有する際、鍵の漏洩の危険性があることです。
また、共有する相手が大勢になると、その相手の分だけ鍵を作成しなければなりません。管理するとなると、大変面倒くさい。
公開鍵認証
まず、受診者側が、公開鍵と秘密鍵の2つを用意します。
送信者側は公開鍵を使用してデータを暗号化し、受診者側に渡します。受診者側は秘密鍵を使用して復号化します。
この一連の流れを「公開鍵認証」といいます。
受診者側は送信者に公開鍵を渡す必要がありますが、この公開鍵は暗号化するだけで復号化はできません。
なので、万一悪意ある人の手に渡っても、通信内容が復号化されることはありません。
秘密鍵で復号化はできる?
で、あるサイトにこんな記述があったんですね。
というわけで、今回、電子署名で改ざんされていないことの確認をしたかったため、コレだー!と思って早速C#で実装。
……が、何回やっても「キーが不正です」的なエラーメッセージを吐く。
「これは……きな臭いな?」と思い、もう一回ちゃんと調べ直してみました。
デジタル署名=秘密鍵で暗号化ではない!
このサイトが図付きでとてもわかり易かったんですが、デジタル署名ってデータそのものを暗号化してるんじゃないんです。
- まずはデータをハッシュ化する
- 秘密鍵で①のハッシュデータを暗号化する
- 元のデータと②の平文をくっつけて送付する
- 受け取ったデータをハッシュ化する
- くっついてた平文を公開鍵で復号化する
- ①と②のデータを比べて、同じだったらOK!
なんというトラップ。
でも、計算式とかを見ると、「そりゃそうだな」って感じです。