1 0 1 1 Q1 Q2 Q3 Q4 OUT XOR feedback

🔬 デジタル暗号の心臓部「LFSR」をLTspiceで動かそう!

フリップフロップとXORゲートだけで「擬似乱数」を生成する回路を組んでみよう。
Wi-Fiの暗号化もここから始まっている🐾

🔬 LtSpice (Digital) 🔐 ストリーム暗号・鍵ストリーム ⚡ 中級
🔬 LtSpiceシリーズ
1 チュア回路でカオス理論を体験する 2 LFSR:ストリーム暗号の心臓部を動かす 3 サイドチャネル攻撃の可視化(準備中)
🔬
研究でいつもお世話になっているLtSpice、今回は「ロジック素子」を使ってみたよ🐾
LFSR(線形フィードバックシフトレジスタ)って名前は難しそうだけど、 中身はフリップフロップとXORゲートを組み合わせただけのシンプルな回路。 それなのに、Wi-Fiの暗号化やデジタル放送の鍵生成に使われているんだ。 一緒に「擬似乱数が生まれる瞬間」を見てみよう!

🛠️ LtSpiceのインストール方法は vol.1(チュア回路)の冒頭をご確認ください。

01 LFSRとは?ビットの「たらい回し」

LFSR(Linear Feedback Shift Register)は、 複数の「箱(レジスタ)」に入ったビットを、クロック信号に合わせて 隣へ隣へとずらしていく回路だよ。

ポイントはフィードバック。一番端から押し出されたビットをそのまま捨てるのではなく、 特定の位置のビットとXOR(排他的論理和)して先頭に戻す。 これを繰り返すと、一見バラバラに見えるビット列が生成される。

4ビットLFSR(初期値: 1011)のビット移動イメージ
Q11
Q20
Q31
Q41
XOR
↑ Q3とQ4をXOR → 結果をQ1に戻す(フィードバック)
擬似乱数出力列 → 1 0 1 1 0 1 1 1 0 0 0 1 0 0 1 ...

ビット周期の力

何ビットのLFSRを使うかで、繰り返しが始まるまでの「周期」が決まる。 最大周期(2ⁿ − 1)を持つように設計されたLFSRを 「最大長系列(M系列)」と呼ぶ。

ビット数(n)最大周期具体的な長さ
4 bit2⁴ − 115 クロック
8 bit2⁸ − 1255 クロック
32 bit2³² − 1約43億クロック
64 bit2⁶⁴ − 1約1.8京クロック(天文学的!)

02 LTspiceでの回路構成

LTspiceの Digital ライブラリにある素子を使って、 4ビットLFSRを組み立てよう。

使用コンポーネント

部品LTspice上の名前役割
Dフリップフロップ × 4 dff(Digital ライブラリ) 1ビットを保持する「箱」。4つ直列に並べる
XORゲート × 1 xor(Digital ライブラリ) Q3とQ4の出力を組み合わせてフィードバックを作る
パルス電源(クロック) PULSE Voltage Source 全フリップフロップに共通のクロック信号を供給
初期値設定 .ic コマンド 各フリップフロップの初期ビット値を指定

03 回路作成の手順

STEP 1

4つのDフリップフロップを直列接続

LTspiceのDigitalライブラリから dff を4つ配置。 1つ目の出力(Q)を2つ目の入力(D)に接続、以降も同様につないでいく。

STEP 2

XORゲートでフィードバック作成

xor ゲートを1つ配置し、入力に FF3.QFF4.Q を接続。 XORの出力を FF1.D(先頭フリップフロップの入力)に戻す。

💡 タップ位置について: 「どのビット同士をXORするか」を「タップ位置」と呼ぶ。 4ビットLFSRで最大周期(15)を得るには、タップ位置を [4, 3] に設定する(= Q4とQ3をXOR)。 タップ位置の選び方はLFSRの「設計の肝」で、間違うと周期が短くなってしまう。
STEP 3

クロック信号の設定

Voltage Source を配置し、以下のPULSE設定を入力する:

▶ PULSE設定(クロック信号)
PULSE(0 3.3 0 1n 1n 500n 1u)

→ 周期1µs(1MHz相当)、High=3.3V のデジタルクロック信号

STEP 4

初期値を設定してシミュレーション実行

回路図に以下の .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 を全てプロットして波形を確認しよう。

⚠️ 絶対にやってはいけない:全ビット0の初期値

V(FF1.Q)=0 V(FF2.Q)=0 V(FF3.Q)=0 V(FF4.Q)=0 にすると、 XOR(0, 0) = 0 が先頭に戻るため、永遠に全ビット0のまま動かなくなる(デッドロック!)。
LFSRの2ⁿ − 1(最大周期)から「1」が引かれているのは、 この「全ゼロ状態」を除外しているから。これを知っていると、暗号エンジニアっぽい🐾
📊

ここにQ1〜Q4の波形プロット(LTspice実測)が入る予定
クロックに対して不規則に変化する擬似乱数ビット列が見える

🔐 LFSRと暗号:ここが「ストリーム暗号」の核心

チュア回路と違い、LFSRは暗号との接点を探す必要がない。 LFSRはストリーム暗号の実装そのものだから。 Wi-FiのWEP暗号(RC4)、デジタル放送のスクランブル、GPSの測位信号… 全てLFSRベースの擬似乱数が使われている(いた)。

🔑 鍵ストリームの生成

ストリーム暗号では、短い秘密鍵を「シード」としてLFSRに入力し、 長い擬似乱数列(鍵ストリーム)を生成。 平文とXORするだけで暗号文ができる。

📡 Wi-Fi / デジタル放送

WEP(旧Wi-Fi暗号)はRC4というLFSRベースの暗号を採用。 後に解読されたため現在はAESに移行したが、 LFSRの設計が暗号強度に直結することの教訓となった。

🌀 初期値(シード)の重要性

同じLFSR回路でも、初期値が1ビット違うだけで 全く異なる乱数列が出力される。 これが暗号における「鍵」の概念そのもの。

🔓 LFSRの弱点と線形解読

単純なLFSRは「線形攻撃」に弱い。 出力列が2n ビット(nはLFSRのビット数)分判明すると、 初期値が解読できてしまう。 これを防ぐためにLFSRを複数組み合わせる(A5/1など)。

「たったこれだけの回路で、世界中の通信を守る暗号が作られている」
……そう思うと、少しワクワクしませんか?🐾

05 まとめ

🔬
次回は、サイドチャネル攻撃を取り上げるよ🐾
回路が動いているとき、意図せず外部に漏れる「電力消費」や「電磁波」を解析すると、 中の秘密鍵が見えてしまう…という怖い話。 LTspiceでその「電力プロファイル」を可視化してみよう。

06 関連記事

🔙 vol.1 チュア回路へ 🔬 暗号ラボへ戻る