はじめまして!インターン生のmomoです!
普段は、大学院で暗号理論の研究をしています✏️
いきなりですが・・・
普段、暗号の安全性って考えたことありますか?
本記事では、ビット演算子の一つである「排他的論理和」を用いた暗号の紹介をします♬
ワンタイムパッドとは?
ちょっと変わった暗号方式 “ワンタイムパッド” を紹介します!
※ワンタイムパスワードとは別物です。
この暗号を一言でいうと、「 安全性が高いけど、不便な暗号方式 」 ですかね。
暗号って「安全だから良い!」ってわけではないのです・・・
仕組みはシンプル。
排他的論理和(XOR)を利用して平文を暗号化する
これだけです。
ここで、排他的論理和(XOR)について復習すると・・・
A と B を以下のように入力した時に、 A ∨ B として出力される論理演算です!
ワンタイムパッドは、この論理演算を利用して暗号化しています!
実際に、例を用いてワンタイムパッドの仕組みを見ていきます🌱
例えば、平文と秘密鍵が以下のように与えられたとき、排他的論理和を考えると、暗号文は以下のようになります。
ワンタイムパッドの実装
Pythonでワンタイムパッドを実装してみました👇
import random
plain_text = "1010010101"
secret_key = ""
for _ in range(len(plain_text)):
secret_key += str(random.randint(0, 1))
cipher_text = ""
for i in range(len(plain_text)):
xor = int(plain_text[i]) ^ int(secret_key[i])
cipher_text += str(xor)
print(f"平文: {plain_text}, 秘密鍵: {secret_key}, 暗号文: {cipher_text}")
実装結果
平文: 1010010101, 秘密鍵: 0101001000, 暗号文: 1111011101
ポイント!
- secretKey (秘密鍵) は、plainText (平文) と同じ長さをとってくる。
- secretKey (秘密鍵) は、ランダムに設定する。
- 1ビットずつ排他的論理和を計算する。
ワンタイムパッドの特徴
メリット
暗号化も復号化も仕組みがシンプル。
乱数を用いることによって、暗号化の安全性が高い。
デメリット
平文と秘密鍵は同じ長さである必要があるため、平文が長くなると秘密鍵も長くなってしまう。
送信者と受信者で事前に秘密鍵を共有しておく必要がある。
余談
ワンタイムパッドは、1917年にギルバート・バーナムが発案し、数学者クロード・エルウッド・シャノンによって安全性が示された暗号です。
また、太平洋戦争で日本陸軍が利用したことで有名です。
まとめ
ワンタイムパッドは排他的論理和を用いて暗号化する暗号方式!
安全性は高いけど、秘密鍵の共有に手間がかかるため不便なのです(泣)
参考文献
Johannes A. Buchmann 著、林芳樹 訳「暗号理論入門」 2001/07/01第1刷 Springer-Verlag Tokyo
岡本栄司 著、林芳樹 訳「暗号理論入門」 2002/04/10第2刷 共立出版