🎉

完璧な乱数は作れるのか?SNNによる次世代鍵作成に挑む!

に公開

コンピュータで完璧にランダムな数は作れるか?

通常のコンピュータプログラムで生成される乱数は、計算式に基づいた「擬似乱数」であり、シード値とアルゴリズムがバレれば数値が予測されてしまいます。

しかし人間は、たとえば「適当に数字を思い浮かべてください」
そう言われてその頭に浮かんだ数を言い当てられることはあり得ないでしょう。
(余談ですが今のGeminiやGPTに「適当に数字を思い浮かべてください」と言うと、「乱数を作る関数を呼び出してそれを参照して」答えるのでしょうか?それとも既に人間みたいに・・・?(^_^;))

そこで私は、SNN(スパイキングニューラルネットワーク:人間の脳細胞群の動作や電位変化を再現できるプログラム)は、新しい乱数の生成方法の開発に繋がるのではないか、と考えました!

大学院生時代、脳科学を学んできましたが、どうやら人間の決定は「過去の記憶、直前の刺激、その瞬間の脳の状態…それらが複雑に絡み合って決まっているようです。

これを数学や物理学では決定的カオスと呼びます。

では、このカオスを暗号の鍵生成に使えないか?
今回はカオス的な挙動を利用して、予測困難な暗号鍵を生成するシミュレーターを作ってみました!

本記事では、SNNを使った従来とは全く異なるアプローチで暗号鍵を生成する実験について紹介します。

従来の乱数生成 vs 脳のカオス

従来の方法:計算による乱数

import random
key = random.getrandbits(256)  # 256ビットの乱数

これは擬似乱数と呼ばれ、数学的なアルゴリズムで生成されます。高速で便利ですが、シード値がわかれば再現可能です。

新しいアプローチ:脳細胞によるカオス

# ニューロンの膜電位からカオス鍵を生成
state_values = np.array([neuron.v for neuron in reservoir.neurons])
key_byte = hashlib.sha256(state_values.tobytes()).digest()[0]

こちらはニューロンの状態を鍵に使います。膜電位は入力データの履歴に依存して刻一刻と変化するため、同じ鍵を再現するには全く同じ入力履歴が必要になります。

修論からのヒント:MD-LD相互作用

私の修士論文では、海馬歯状回の顆粒細胞をシミュレーションしました。

この細胞には2種類の入力があります:

  • MD入力:空間情報を運ぶ(短期抑圧 = Depression)
  • LD入力:非空間情報を運ぶ(短期増強 = Facilitation)

重要な発見は、入力のタイミング(位相差)によって出力が劇的に変わるということでした。

これを暗号に応用すると:

  • データ → MD入力
  • 秘密鍵 → LD入力
  • 正しいタイミングでないと復号できない = 時間軸上の鍵

実装した「SNN Comprypto」

まず初めに、今回作ったプログラムは圧縮と暗号化と両方行っていて工程が多く複雑なので、処理の流れをなるべく優しい言葉で図解してみました(^^;)

ざっくりした解説

  1. 送り手と受け手が、同じ「脳のモデル(SNN製AI)のコピー」を持っている

    • 二人は同じ脳のモデル(SNN製AI)を持っていて、これらは常に同じ状態変化が起きている。
    • 勿論これらは同じ入力を見ると同じ反応をする。
  2. 脳モデルは常に毎瞬「次はこの数がくる」と予測し続けている

    • 例:「次のデータは98だろう」と予測
    • 実際のデータは100だったりする。
  3. 「予測」と「実際」の差だけを送る

    • 100 - 98 = 2
    • 「100」をそのまま送るより差の「2」だけ送ることにより情報を圧縮できる!
  4. その差を「この瞬間の合言葉」で隠す

    • 脳モデルはその瞬間の自分の状態から合言葉を作る
    • 合言葉も毎瞬変わるから情報を暗号化できる!
  5. 受け手も同じ脳モデルを持つことで…

    • 同じ予測ができる(98)
    • 同じ合言葉を知ってる(55)
    • だから元のデータ(100)を復元できる!

今回作ったプログラムの処理フロー

一言でいうと 「双子のAIだけが知ってる合言葉」で秘密の手紙を送る仕組み!

主な機能

SNNでは「1秒間に何回発火したか」や「最初の発火まで何ミリ秒か、または発火間隔」等も符号の情報となります(発火したら「1」、しない間は「0」)。
この「スパイクが発生するまでの微妙な時間差」を鍵生成の種として利用しています。
今回は

  1. 予測圧縮:SNNがデータの文脈を学習・予測し、予測誤差のみを記録
  2. カオス暗号化:ニューロン膜電位のカオス的変動を鍵生成に利用
  3. 同時処理:圧縮と暗号化を1ステップで実行
    を盛り込みました。

通常のディープラーニング(DNN)ではノイズは邪魔者ですが、生体の脳においては、ニューロンの発火タイミングの揺らぎやノイズさえも処理すべき情報の一部です!
SNNモデル(LIF:Leaky Integrate-and-Fireなど)は、入力やパラメータのわずかな違いが出力に大きな影響を与える初期値鋭敏性(これがカオス的挙動を起こす鍵!) を持ちやすいため、これを「予測できないエントロピー源」として利用します!

コードの一部

class CompryptoReservoir:
    """
    予測と暗号化を同時に行うSNNリザーバ
    """
    def get_keystream_byte(self):
        """膜電位からカオス鍵を生成"""
        # 全ニューロンの膜電位を取得
        state_values = np.array([n.v for n in self.neurons])
        # ハッシュ関数で非線形性を極大化
        h = hashlib.sha256(state_values.tobytes()).digest()
        return h[0]

処理フローの可視化


comprypto_system.py 実行時の出力グラフ
グラフは以下の3つの段階を示しています
①入力信号とSNNの予測(上段)
・青線:元の正弦波データ
・橙線(破線):SNNが予測した次の値
・SNNが波形のパターンを学習し、次の値を予測している様子がわかります

②予測残差(中段)
・緑線:「実際の値 - 予測値」の差分
・予測が正確であるほど、この値は0に近づきます
・0付近に集中 = エントロピー低下 = 圧縮効果

③暗号化出力(下段)
・赤線:カオス鍵でXOR処理した最終出力
・完全にランダムに見える = 暗号化成功
・秘密鍵がないと元のパターンを推測できない

アバランチ効果:鍵が1ビット違うと…

暗号の強度を測る重要な指標に「アバランチ効果」があります。

鍵が1ビットでも違うと、出力が完全に変わる必要があります。

正しい鍵での復号:100% 一致
1ビット違う鍵での復号:0.70% 一致(完全ランダム時の期待値 ≈ 0.4%)

わずかな鍵の違いでも出力が完全に乱数化されることを確認しました!

NIST検定結果

NIST SP 800-22は、暗号業界で世界標準として認められている乱数生成能力を測る検定です。
今回の私のプログラムが「どのくらいのランダム性」なのか検証してみました!

テスト名                         P値       判定
────────────────────────────────────────────────
Frequency (Monobit)              0.621790   ✅ PASS
Block Frequency                  0.327433   ✅ PASS
Runs                             0.249386   ✅ PASS
Longest Run                      0.841349   ✅ PASS
Matrix Rank                      0.500000   ✅ PASS
DFT (Spectral)                   0.131301   ✅ PASS
Overlapping Template             0.464884   ✅ PASS
Approximate Entropy              0.890502   ✅ PASS
Cumulative Sums                  0.267775   ✅ PASS
────────────────────────────────────────────────
結果: 9個 合格 / 9個中

ログの通り、SNN Compryptoが生成する鍵ストリームは、AESなどの商用暗号と同等のランダム性を持つことが証明されました!

Numbaによる高速化

因みにNumbaによる高速化版も作り、ベンチマーク結果は純粋なPython実装から7.5倍の速度向上を達成しました!

[Python版] 970ms → [Numba版] 150ms
セキュリティ: Entropy 7.96 bits/byte(理想値8.0に近い)
復元: 100%完全復元(Lossless)

まとめと今後の展望

達成したこと

  • SNNによる圧縮・暗号化の同時処理を実現
  • Numbaで7.5倍の高速化
  • 高いアバランチ効果を確認
  • 🎉 NIST SP 800-22 乱数検定を全テスト合格!

今後の目標

  • GPU (CUDA) 対応による更なる高速化
  • Tsodyks-Markramモデルによる本格版の完成
  • ライブラリ化 (pip install snn-comprypto)

「計算による乱数」 から生物の脳が作る 「予測不能な乱数」 を、次世代のセキュリティに活かす挑戦は続きます!(^-^)

Discussion