フリップフロップとXORゲートだけで「擬似乱数」を生成する回路を組んでみよう。
Wi-Fiの暗号化もここから始まっている🐾
🛠️ LtSpiceのインストール方法は vol.1(チュア回路)の冒頭をご確認ください。
LFSR(Linear Feedback Shift Register)は、 複数の「箱(レジスタ)」に入ったビットを、クロック信号に合わせて 隣へ隣へとずらしていく回路だよ。
ポイントはフィードバック。一番端から押し出されたビットをそのまま捨てるのではなく、 特定の位置のビットとXOR(排他的論理和)して先頭に戻す。 これを繰り返すと、一見バラバラに見えるビット列が生成される。
何ビットのLFSRを使うかで、繰り返しが始まるまでの「周期」が決まる。 最大周期(2ⁿ − 1)を持つように設計されたLFSRを 「最大長系列(M系列)」と呼ぶ。
| ビット数(n) | 最大周期 | 具体的な長さ |
|---|---|---|
| 4 bit | 2⁴ − 1 | 15 クロック |
| 8 bit | 2⁸ − 1 | 255 クロック |
| 32 bit | 2³² − 1 | 約43億クロック |
| 64 bit | 2⁶⁴ − 1 | 約1.8京クロック(天文学的!) |
LTspiceの Digital ライブラリにある素子を使って、 4ビットLFSRを組み立てよう。
| 部品 | LTspice上の名前 | 役割 |
|---|---|---|
| Dフリップフロップ × 4 | dff(Digital ライブラリ) |
1ビットを保持する「箱」。4つ直列に並べる |
| XORゲート × 1 | xor(Digital ライブラリ) |
Q3とQ4の出力を組み合わせてフィードバックを作る |
| パルス電源(クロック) | PULSE Voltage Source |
全フリップフロップに共通のクロック信号を供給 |
| 初期値設定 | .ic コマンド |
各フリップフロップの初期ビット値を指定 |
LTspiceのDigitalライブラリから dff を4つ配置。
1つ目の出力(Q)を2つ目の入力(D)に接続、以降も同様につないでいく。
xor ゲートを1つ配置し、入力に FF3.Q と FF4.Q を接続。
XORの出力を FF1.D(先頭フリップフロップの入力)に戻す。
Voltage Source を配置し、以下のPULSE設定を入力する:
PULSE(0 3.3 0 1n 1n 500n 1u)
→ 周期1µs(1MHz相当)、High=3.3V のデジタルクロック信号
回路図に以下の .ic コマンドを追記(全ビット0はNG!後述):
.ic V(FF1.Q)=3.3 V(FF2.Q)=0 V(FF3.Q)=3.3 V(FF4.Q)=3.3
Edit → Edit Simulation Command から:
Run → Q1〜Q4 を全てプロットして波形を確認しよう。
V(FF1.Q)=0 V(FF2.Q)=0 V(FF3.Q)=0 V(FF4.Q)=0 にすると、
XOR(0, 0) = 0 が先頭に戻るため、永遠に全ビット0のまま動かなくなる(デッドロック!)。ここにQ1〜Q4の波形プロット(LTspice実測)が入る予定
クロックに対して不規則に変化する擬似乱数ビット列が見える
チュア回路と違い、LFSRは暗号との接点を探す必要がない。 LFSRはストリーム暗号の実装そのものだから。 Wi-FiのWEP暗号(RC4)、デジタル放送のスクランブル、GPSの測位信号… 全てLFSRベースの擬似乱数が使われている(いた)。
ストリーム暗号では、短い秘密鍵を「シード」としてLFSRに入力し、 長い擬似乱数列(鍵ストリーム)を生成。 平文とXORするだけで暗号文ができる。
WEP(旧Wi-Fi暗号)はRC4というLFSRベースの暗号を採用。 後に解読されたため現在はAESに移行したが、 LFSRの設計が暗号強度に直結することの教訓となった。
同じLFSR回路でも、初期値が1ビット違うだけで 全く異なる乱数列が出力される。 これが暗号における「鍵」の概念そのもの。
単純なLFSRは「線形攻撃」に弱い。 出力列が2n ビット(nはLFSRのビット数)分判明すると、 初期値が解読できてしまう。 これを防ぐためにLFSRを複数組み合わせる(A5/1など)。
「たったこれだけの回路で、世界中の通信を守る暗号が作られている」
……そう思うと、少しワクワクしませんか?🐾