SWEet

A Software Engineer Is Eating Technologies

公開鍵暗号と共通鍵暗号

今日は共通鍵暗号公開鍵暗号についてまとめてみました。

簡単に言うと暗号化と復号化を同じ鍵で行う方式。つまり送信者と受信者で一つのカギを使うので、別の通信相手の場合には別のカギを用意しなくてはいけません。代表的な共通鍵暗号方式としてAESがあります。

鍵の数は n(n-1)/2 です。

  • 公開鍵暗号

    公開鍵暗号は多対多のインターネットにおいて優れた暗号化方式ですが暗号化と復号化に共通鍵暗号のおよそ数千倍の時間がかかり、CPUにも負荷がかかります。

    公開鍵暗号のカギは二つ存在し、秘密鍵と公開鍵にわかれます。サーバーなどが多数のクライアントと通信をしたい時、データを秘密鍵で暗号化して公開鍵を各クライアントに配ることで復号化してもらいます。この時データの暗号化は秘密鍵でしかできません。なので秘密鍵は絶対に秘匿しておく必要があります。

    主な公開鍵暗号化方式としてRSAなどがあげられます。鍵の数は 2n個 で済みます

  • RSAの安全性

    暗号技術分野の知識ですがRSAの安全性の根拠は桁数の大きな整数を素因数分解するのが困難だということを根拠にしています。  

    例として、  1. 二つの素数を挙げる a=523,b=613

    1. 二つの素数を掛け算する a*b = 320599 これは単なる掛け算です。
    2. では逆に320599 という数字から もとの素数を求めるというのは非常に困難です。

数字の桁数が大きくなればなるほど素因数分解は困難になります。つまり数字の桁数がそのまま鍵の安全強度に繋がります。実際のRSAではもとの素数に150~300以上もの桁の数字を使用しているそうです。

暗号技術についての雑記

そもそも暗号ってなんぞや?という時が自分にあったのでまとめておこうかなと思います

一番原始的とも言える暗号を例に紹介します。それはシーザー暗号です。

シーザー暗号は簡単に言うとアルファベットをずらすことによって文字列を暗号化します

・例 Hello ⇒ ifmmp 例は1文字ずらしただけです。それでも平文の原型を残さず別の文字列にすることができました。

では例の場合のカギは? それは 1 です。

この暗号は確かポケモンBW2の海底遺跡か何かでも使われていたと思います。

この他にもデータの場合は全て2進数になおして鍵とXORを演算することで暗号化するというような方式もあります

暗号技術の書籍は結構あって面白いので是非興味があったら読んでみることをお勧めします

そもそもどうして暗号化のアルゴリズムと鍵を分ける必要があるのか。それは毎回データを暗号化するのに新しいアルゴリズムを生み出すのはめんどくさい。何回も同じの繰り返して使いたい。だけど同じアルゴリズムを使っていると解読されるリスクが高くなってしまう。だから、暗号化アルゴリズムに「変更可能な部分」を残しておいて通信ごとにそこを変えればなんとかなるだろう。その変更可能な部分というのが鍵のことですね。 先人たちの偉大な努力の結晶ですね。

もし今度時間があったら色々な暗号化アルゴリズムについてもまとめてみようかなと思います

なんというか暗号化アルゴリズムについての方がつい熱が入ってしまいました。次回は何についてまとめておきましょうか…

夏休みにも入ったのでじっくり勉強しながら考えようと思います。

では今日はここら辺で筆をおかせていただきます