ZAKO-PG

こんなザコがプログラマーなの?

秘密鍵で復号はできない!その理由は?

スポンサーリンク

f:id:cookie11109:20180809214625p:plain

公開鍵認証の実装をしていたのですが、認証の仕方を勘違いしていたことが発覚。

忘れないようにメモしておきます。

 

暗号化の種類

まず、暗号化には大きく分けて2つの種類があります。

「共通鍵認証」と「公開鍵認証」です。

共通鍵認証

送信者と受信者が、それぞれ共通の秘密鍵を持っていることを前提として、その共通の鍵を使用して暗号化と複合化を行う認証。

 

共通鍵のメリットは、暗号化・復号化のコストが低いことです。

逆にデメリットは、最初に共通鍵を共有する際、鍵の漏洩の危険性があることです。

また、共有する相手が大勢になると、その相手の分だけ鍵を作成しなければなりません。管理するとなると、大変面倒くさい。

公開鍵認証

まず、受診者側が、公開鍵と秘密鍵の2つを用意します。

送信者側は公開鍵を使用してデータを暗号化し、受診者側に渡します。受診者側は秘密鍵を使用して復号化します。

この一連の流れを「公開鍵認証」といいます。

 

受診者側は送信者に公開鍵を渡す必要がありますが、この公開鍵は暗号化するだけで復号化はできません。

なので、万一悪意ある人の手に渡っても、通信内容が復号化されることはありません。

 

秘密鍵で復号化はできる?

で、あるサイトにこんな記述があったんですね。

 

デジタル署名
秘密鍵を使って暗号化することもできます。この場合、公開鍵を使うと復号化できます。いわゆる電子署名です。

 

というわけで、今回、電子署名で改ざんされていないことの確認をしたかったため、コレだー!と思って早速C#で実装。

 

……が、何回やっても「キーが不正です」的なエラーメッセージを吐く。

「これは……きな臭いな?」と思い、もう一回ちゃんと調べ直してみました。

 

デジタル署名=秘密鍵で暗号化ではない!

このサイトが図付きでとてもわかり易かったんですが、デジタル署名ってデータそのものを暗号化してるんじゃないんです。

www.infraexpert.com

 
受信者側
  1. まずはデータをハッシュ化する
  2. 秘密鍵で①のハッシュデータを暗号化する
  3. 元のデータと②の平文をくっつけて送付する
 
 
送信者側
  1. 受け取ったデータをハッシュ化する
  2. くっついてた平文を公開鍵で復号化する
  3. ①と②のデータを比べて、同じだったらOK!

 

なんというトラップ。

でも、計算式とかを見ると、「そりゃそうだな」って感じです。

qiita.com