「バーナム暗号」・絶対に解読できない暗号

投稿日: 更新日:

排他的理論和(XOR)

前提知識としてXORの計算方法を知っておく必要があります。そんなに難しいものではありません。

1bitのa,ba, bがあったとします。そして、XORをaba \oplus bとすると以下のように計算できます。

00=001=110=111=0\begin{split} 0 \oplus 0 = 0\\ 0 \oplus 1 = 1\\ 1 \oplus 0 = 1\\ 1 \oplus 1 = 0\\ \end{split}

つまり、aabbが同一の時に00、異なる時は11となります。

どうやって暗号化するのか

nnbitの平文MMがあった時、ランダムに生成したnnbitのkeykeyを用意します。そして、その2つのXORを取れば暗号文CCの完成です。

C=MkeyC = M \oplus key

どうやって復号化するのか

暗号化に用いたkeykeyと暗号文CCとのXORを取ります。そうすると、元の平文MMが得られます。

M=CkeyM = C \oplus key

実際に計算してみる

暗号化する

平文MMを10bitの01011010110101101011とし、鍵を10110101111011010111とします。

これら2つのXORを取ると

0101101011平文10110101111110111100暗号文\begin{array}{rr} &0101101011 &\text{平文}\\ \oplus &1011010111 &\text{鍵}\\ \hline &1110111100 &\text{暗号文} \end{array}

となり暗号文は11101111001110111100となります。

復号化する

先ほどの暗号文11101111001110111100と、鍵10110101111011010111とのXORを取ります

1110111100暗号文10110101110101101011平文\begin{array}{rr} &1110111100 &\text{暗号文}\\ \oplus &1011010111 &\text{鍵}\\ \hline &0101101011 &\text{平文} \end{array}

となり、正しく復号化できました!

なぜ解読できないのか

「全通りの鍵を試せばいつか正しい平文が得られて解読できそうだ」と思うでしょう。

鍵を全通り試すと2n2^n通りあります。また、考えられる平文も2n2^n通りあります。したがって、鍵を全通り試すと、考えうる平文すべてが出てきます。全パターンの平文が出ると、どれが正しいのかを判定することができません。

つまり、解読不可というのは「正しい平文かどうかを判定できない」ということです。「現実的な時間で解読困難」というわけではないです。

なぜ使われていないのか

バーナム暗号はほとんど使われていないのが現状です。

鍵保存問題

暗号化に使った鍵は安全に保存しておく必要があります。 ここで、バーナム暗号の鍵の長さと平文の長さは同じです。 もし、鍵を安全に保存できるのであればそこに平文を保存すればいいことになります。そうなれば暗号化は不要なことになります。

鍵配送問題

バーナム暗号は平文と同じサイズの鍵を使用します。その鍵を安全に配送できるならば、その経路を使って同じサイズの平文をそのまま送信すればよいのです。

鍵が使い捨て

事前に鍵を共有して、その後何回でも通信すれば良いと思うかもしれません。これは、やってはいけません。

もし、鍵が流出した際に、過去の通信すべてが解読されることになるからです。

よって、バーナム暗号では毎回の通信ごとに鍵を変えなければなりません。毎回変えるとなれば、鍵配送問題に直面します。

参考文献

IPUSIRON (2017) 暗号技術のすべて 翔永社

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人