RC4ストリーム暗号 in Python
はじめに
RC4は1987年にRon Rivestによって作られました。1994年にアルゴリズムがリークされ、WEPやWPA(WI-FIで見たことありませんか?)で使われています。この暗号はとっても短いコードで書くことがでるので、誰でも簡単なRC4のおもちゃが作れると思います。ここでは、RC4をpythonで簡単に作ってみたいと思います。
RC4のしくみ
RC4は2つのパートKSA(Key-scheduling algorithm)とPRGA(Pseudo-random generation algorithm)から構成されています。KSAはランダムな鍵(40~256bit)で\(S = [0, 1, ..., N - 1]\)を初期化し、PRGAはそのSを使って疑似乱数を生成します。この生成された疑似乱数と平文のxorを取っていくことで暗号化をします。以下に疑似コードを書いておきます。
KSA(K) Initialization: For i = 0 ... N - 1 swap S[i] = i j = 0 Scrambling: For i = 0 ... N - 1 j = j + S[i] + K[i mod l] Swap(S[i], S[j])
PRGA(S) Initialization: i = 0 j = 0 Generation loop: i = i + 1 j = j + S[i] Swap(S[i], S[j]) Output z = S[S[i] + S[j]]
上の疑似コードをPythonにしてRC4を作ります。
def KSA(key): l = len(key) S = list(range(256)) j = 0 for i in range(256): j = (j + S[i] + key[i % l]) % 256 S[i], S[j] = S[j], S[i] return S
KSAはb'key'のようなbytesオブジェクトが入ることを想定しています。そしてリストSを返します。
def PRGA(S): i, j = 0, 0 while True: i = (i + 1) % 256 j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] K = S[(S[i] + S[j]) % 256] yield K
PRGAはKSAの返り値Sを入れて疑似乱数を生成するジェエネレータです。
最後に'message'のような文字列を暗号化する関数を以下のように作ります。
def rc4(m, key): keystream = PRGA(KSA(key)) return bytes(i ^ j for i, j in zip(m, keystream))
コメント
コメントを投稿