サイコロを振って奇数なら0、偶数なら1とするなどです。なりこれがVernam暗号で生成された暗号文となります。この暗号に対して攻撃を行ってみましょう。秘密鍵がわかれば、平文を複合できるので秘密鍵を当ててみます。これら全てのパターンはサイコロの目による乱数で生成されているため同様に確からしいです。これに対し、なにも考えずとにかく適当に攻撃してみましょう。Vernam暗号のことを何も知らない通行人に、「この金庫に100万円入ってて、0と1だけで構成された4桁の数字で解錠できるんすよ。開けたら中身あげますね。通りしらみつぶしに試行しますよね、きっと。あり、この確率は「この暗号がVernam暗号だと知っていて、かつ秘密鍵を使って攻撃を行っていた人が、攻撃に成功する確率と等しい」です。このように、暗号方式を知っていて複合化の方法も分かっている状態でも、適当に当てずっぽうで平文を解読する確率と何ら変わらないことを情報理論的安全と言っているようです。それに対し、仮に秘密鍵のパターンが0000、1111の2種類しかなかったとします。確率で平文を解読することが可能であり、圧倒的に当てずっぽうより確率が高いです。このような暗号は情報理論的安全とは言えません。vernam暗号の問題点と計算量的安全性じゃあ、情報理論的安全なvernam暗号をみんな使えばいいじゃん。なりそうなところですが大きく2つの問題点があります。共有するために秘密鍵を暗号化して送る必要あるんじゃない?」と言う無限ループに陥ってしまう問題ですね。単純にすり替わっただけと捉えられます。先ほどはカンタンのために4ビットと言う小さなサイズで例としましたが実際に扱われる暗号ではもっと大きな情報量を扱います。この際、計算量などの観点からはより小さなサイズの方が実用的であり、平文と同等のサイズでしか秘密鍵を生成できないのは問題です。通り全て網羅するのに、500兆年かかるからまぁ安全だよね」みたいな状態です。厳密な定義はよく分かっていませんが、攻撃に必要な計算量を見積もり、それらが現実的に解けないと判断された暗号は計算量的安全であるといえるそうです。vernam暗号の実装アルゴリズムの理解を深めるためにサクッと実装したのでvernam暗号の実装とその結果を貼り付けておきます。今仕事でTypeScriptをメインで用いているのでTSで書いていますが、ビット演算が扱いにくかったので今後の実装はGoかC++で書くと思います。1011決定的アルゴリズムと乱択アルゴリズムここからは暗号方式に求められるアルゴリズムについてです。用語の定義を整理します。ある入力に対する出力が常に同じとなるアルゴリズムのことを決定的アルゴリズムと言います。それに対して、ある入力に対して出力が確率的に変化するアルゴリズムのことを乱択アルゴリズム、または確率的アルゴリズムと言います。暗号化アルゴリズムは確率的アルゴリズムであることが求められます。平文と秘密鍵が同じならば、かならず同じ暗号文になる場合、暗号さえ盗聴できていれば平文を推測することが可能となる場合があります。決定的アルゴリズムではない暗号方式としてCBCモードが上げられます。Vector)と言うもう1つの要素を加えて暗号化することで、同じ秘密鍵と平文を用いて暗号文を生成してもIVによって変化するというアルゴリズムです。CBCモードの実装CBCモードは平文をブロックに分割してそれらを逐次的に暗号化していく手法です。アルゴリズム自体は本を参照するかググってください。以下TSによる実装と結果です。実装は特段見る必要ないのですが、同じ平文と秘密鍵でも異なる暗号文が生成できている部分に注目してください。110110101010このように、平文と秘密鍵が同じでもIVのおかげで異なる暗号文を生成できていることがわかります。»Profile表参道で働く、フロントエンドエンジニア普段はTypeScriptでReact&Redux書いてます。機械学習最近全くやってないけど、復活しようと企んでる。(2)Archiveはてなブログをはじめよう!ket-30さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。