「ニューロン数と温度で操る、次世代の圧縮・暗号化システム」の実装を通して、脳の「相転移」を見た!【SNN】
この研究の背景や目的
人間がなぜ完璧な乱数を作れるのか知りたい
たとえば「何か数字を思い浮かべて」と言い、相手に脳波計や解析機器を付けてもらっても、その考えている数字を言い当てることは現代の技術でも無理でしょう。
なにせ凄い桁数かもしれないし、負の数や虚数や平方根かも分からないし、「円周率」という言葉で脳内で表現してるかもしれない…。
このことから私は、もしかしたら人間の脳をほんの一部でも再現できれば完璧な乱数が作れるのではないかと考えています!
SNNで脳の電気信号だけは再現できる!
人間の脳の「思い浮かべる」という仕組みは謎だらけですが、脳も電気信号で情報を処理していることは間違いないでしょう。そしてその 「脳の電位の変化」だけは真似(シミュレーション)することができます!
そのシミュレーションにはSNN(スパイキングニューラルネットワーク) というプログラムを使います。
脳の要約能力の解明も、新しい暗号化や圧縮技術になりそう
SNNもニューラルネットワークの一種なので、学習もできます!
また、今回作ったプログラムはSNNによる暗号化だけでなく、情報の圧縮にも成功しています!
たとえば人間は、長い本を指定された文字数以内で要約したりできますが、これも現代の乱数生成技術とは全く違った乱数生成技術に使えるのではないかと思います!
完璧な乱数ができたら…
もし完璧な乱数の生成が可能になったら、色んなことができそうですね、たとえば
- 🔐 絶対に破られない暗号化
- 🤖 全く予想外な提案や選択をするAIの開発
等でしょうか。まあとにかく、人間の意思決定が気まぐれなようで実は超高度な計算で成り立っているとしたら、その超高度な計算方法(アルゴリズム)の解明に少しでも私も貢献したいです!
SNN-Compryptoの仕組み
さて、ここからは実際に作ったシステム「SNN-Comprypto」の仕組みを解説します。
全体の流れ
ポイント:
- SNNが「次の値」を予測する(圧縮に使う)
- 予測と実際の差(残差)だけを記録
- SNNの膜電位からカオス鍵を生成
- 残差を鍵でXOR暗号化
これにより 「圧縮」と「暗号化」が同時にできます!
LIFニューロンモデル
脳のニューロンを模倣するために「LIF(Leaky Integrate-and-Fire)」モデルを使います。
class CompryptoNeuron:
def __init__(self, tau=20.0):
self.v = -65.0 # 膜電位 (mV)
self.v_thresh = -50.0 # 発火閾値
self.v_reset = -70.0 # リセット電位
self.tau = tau # 時定数
def step(self, I_syn):
# 膜電位の更新(微分方程式)
dv = (-(self.v - self.v_rest) + I_syn) / self.tau
self.v += dv
# 閾値を超えたら発火!
if self.v >= self.v_thresh:
self.v = self.v_reset
return 1.0 # スパイク!
return 0.0
電位がじわじわ上がっていき、閾値を超えると「パチン!」と発火してリセット。これが脳のニューロンの動きです。
カオス鍵生成
ここが暗号化の核心!
300個のニューロンの膜電位を集めて、SHA-256でハッシュ化します:
def get_keystream_byte(self):
# 全ニューロンの膜電位を取得
state_values = np.array([n.v for n in self.neurons])
# SHA-256でカオス化!
h = hashlib.sha256(state_values.tobytes()).digest()
return h[0] # 1バイトの鍵を返す
膜電位は小数点以下何桁も変動するので、予測不可能なカオスが生まれます。
実験1:ニューロン数の「相転移」を発見!
ニューロン数と性能の関係を検証
ニューロンは増やせば増やすほど際限なく賢くなるのか、また急激にある数を境に賢くなることはあるか?
実験設定
- ニューロン数を20〜600まで20刻みで変化
- 500バイトの正弦波データを処理
- 予測誤差(MSE)を測定
結果:驚きのグラフ!

グラフの見方
| 位置 | タイトル | 説明 |
|---|---|---|
| 左上 | Learning Curve | 青線:ニューロン数とMSE(予測誤差)の関係。下がるほど良い! |
| 右上 | Rate of Change | 紫バー:MSEの変化率。赤いバーが最大の改善ポイント! |
| 左下 | Efficiency | 緑線:1ニューロンあたりの改善量。高いほどコスパ良い! |
| 右下 | Total Improvement | 赤線:累積改善率。青点線が80%ライン |
→ 右上の赤いバーが80➞100ニューロンのところで突き抜けているのが「相転移」の証拠!
発見したこと
🎯 発見1:80→100ニューロンで「相転移」が起きた!
| 区間 | MSE減少量 | 1ニューロンあたりの効率 |
|---|---|---|
| 80 → 100 | -183.0 | 9.15 (最大!) |
100ニューロンを境に、脳が「あ!これサイン波だ!」と理解した瞬間です。
まさに「知能の相転移」!
📉 発見2:160ニューロンで収穫逓減が始まる
160ニューロン以上は、改善率が最大時の10%以下に低下。
増やしても効果が薄くなってきます。
💡 発見3:240ニューロンがスイートスポット
| 条件 | ニューロン数 | 性能 |
|---|---|---|
| 最高性能 | 500 | 100% |
| 80%の性能を最小コストで | 240 | 80% |
IoTやエッジデバイスなら、240ニューロンで十分という結論!
実験2:温度パラメータで「砂嵐」を起こす
新機能:温度という名の「第2の暗号鍵」
SNNに「熱雑音」を加えることで、温度設定が暗号鍵として機能するようになりました。
# 熱雑音の注入
thermal_noise = np.random.normal(0, 0.5 * self.temperature, self.num_neurons)
I_total = I_rec + I_ext + thermal_noise
同じ温度でないと復号できない!
実験設定
- 暗号化時の温度:
1.0 - 復号時の温度を少しずつ変えてみる
結果:恐ろしいほどのアバランチ効果
| 復号温度 | 差分 | 一致率 |
|---|---|---|
| 1.0000 | +0 | 100% ✅ |
| 1.0001 | +0.0001 | 0.40% ❌ |
| 1.0010 | +0.001 | 0.80% ❌ |
| 1.0100 | +0.01 | 0.40% ❌ |
温度が0.0001でもズレたら、完全な砂嵐!

グラフの見方
| 位置 | タイトル | 説明 |
|---|---|---|
| 左上 | Match Rate | 緑バー:100%一致(復号成功)、赤バー:ほぼ0%(失敗) |
| 右上 | Correct Temperature | 青線:元データ、緑点線:復号データ。完全一致! |
| 左下 | Wrong Temperature | 青線:元データ、赤線:復号データ。完全に砂嵐! |
| 右下 | Residual Error | 赤バー:元データとの差分。カオス的に暴れている |
→ 左下の赤線が元データ(青)と全く無関係に暴れているのがバタフライ効果の証拠!
理論的なランダム値は0.39%なので、ほぼ完全なランダムになっています。
これが「バタフライ効果」の可視化です!
NIST乱数検定:9項目すべて合格!
生成されたカオス鍵が本当にランダムか、NIST SP 800-22で検証しました。
| テスト | P値 | 結果 |
|---|---|---|
| 頻度テスト | 0.534 | ✅ PASS |
| ブロック頻度 | 0.234 | ✅ PASS |
| ランテスト | 0.122 | ✅ PASS |
| 最長ラン | 0.089 | ✅ PASS |
| 行列ランク | 0.456 | ✅ PASS |
| DFT (スペクトル) | 0.678 | ✅ PASS |
| 重複テンプレート | 0.345 | ✅ PASS |
| 近似エントロピー | 0.567 | ✅ PASS |
| 累積和 | 0.789 | ✅ PASS |
9/9 すべて合格! 暗号学的に安全な乱数と言えます。
実験3:RNG Battle Royale(v3)
検証内容
「SNNの乱数が優秀なのは分かったが、他のニューラルネットワーク(DNN/LSTM)と比べてどうなのか」
そこで総当たり戦を開催しました!
実験設定
- 生成器:SNN, DNN, LSTM, Python random
- 予測器:SNN予測器, 統計予測器
- ラウンド数:100,000回(厳密検証)
- ルール:お互いの内部状態を一部公開して、次の値を予測できるか?
結果:衝撃のグラフ!

グラフの見方
| 色 | 意味 |
|---|---|
| 🟢 緑 | 予測困難(良い乱数!) |
| 🔴 赤 | 予測しやすい(弱い!) |
| 🔵 青点線 | 理論上の完全ランダム(0.39%) |
結果の数字
| 生成器 | 予測率 | vs 理論値 | 評価 |
|---|---|---|---|
| SNN | 0.390% | 1.0× | ✅ 最強! |
| Py-Random | 0.396% | 1.0× | ✅ 良い |
| DNN | 7.210% | 18.5× | ⚠️ 予測可能 |
| LSTM | 21.954% | 56.3× | ❌ 激弱! |
発見したこと
🏆 発見:SNNは乱数生成で圧勝!
- SNNの予測率(0.39%)は理論上の完全ランダムと同等!
- LSTMはSNNより56倍も予測されやすい
- DNNもSNNより18倍予測されやすい
なぜSNNが勝ったのか?
| アーキテクチャ | 特徴 | 乱数生成 |
|---|---|---|
| SNN | 非連続な発火、カオス的膜電位 | 最強! |
| DNN | 滑らかな活性化関数 | パターンが読まれる |
| LSTM | 記憶が得意 = パターンが残る | 激弱 |
→ 記憶が得意なLSTMほど、自分のパターンを予測されやすい!
実験4:カオス解析(v4 NEW!)
検証内容
「SNNはなぜ強いのか」
そこで理論的な根拠を数学的に検証しました!
測定した指標
| 指標 | 意味 |
|---|---|
| シャノンエントロピー | 情報量の多さ(max 8.0ビット) |
| 自己相関 | パターンの残りやすさ(低いほど良い) |
| リアプノフ指数 | カオス度(正 = カオス的) |
結果:SNNは真のカオス系!
| 生成器 | エントロピー | 自己相関 | リアプノフ | 判定 |
|---|---|---|---|---|
| SNN-500 | 7.998 | 0.009 | +26.97 | ✅ カオス! |
| SNN-300 | 7.998 | 0.008 | +26.69 | ✅ カオス! |
| DNN-200 | 7.072 | 0.513 | +23.98 | ⚠️ 予測可能 |
| LSTM-128 | 6.510 | 0.729 | +22.05 | ⚠️ 予測可能 |
発見したこと
🔬 発見:SNNがカオス的な4つの理由
- スパイク発火 - 連続的じゃなく「0か1」の離散イベント
- 再帰結合 - フィードバックループが小さな揺らぎを増幅
- 閾値機構 - 発火/非発火の境界が非線形性を生む
- 熱雑音注入 - 温度パラメータで真のランダムさを追加
→ これらがバタフライ効果を生み、予測不能に! 🦋
実験5:攻撃耐性テスト(v4 NEW!)
検証内容
「暗号として使うなら、現実的なハッキング攻撃 に耐えられるか」
5つの攻撃シナリオをシミュレーションしました!
テストした攻撃
| 攻撃タイプ | 説明 |
|---|---|
| 既知平文攻撃 | 一部の平文と暗号文が分かっている |
| 選択平文攻撃 | 好きな平文を暗号化できる |
| 鍵回復攻撃 | 温度パラメータを総当たりで探す |
| 履歴解析攻撃 | 過去の出力から次を予測 |
| サイドチャネル攻撃 | 処理時間の差から情報を得る |
結果:4/5の攻撃に耐性!
| 攻撃 | 結果 | 判定 |
|---|---|---|
| 既知平文攻撃 | 2.0%予測 | ✅ SECURE |
| 選択平文攻撃 | χ²=297(異常なし) | ✅ SECURE |
| 鍵回復攻撃 | 100回で発見できず | ✅ SECURE |
| 履歴解析攻撃 | ※注意点あり | ⚠️ 下記参照 |
| サイドチャネル攻撃 | CV=0.057(差なし) | ✅ SECURE |
履歴解析攻撃について
まとめ
今回分かったこと
-
SNNは圧縮と暗号化を同時にできる
- 予測で圧縮、カオスで暗号化
-
100ニューロンで「相転移」が起きる
- 知能が急激に向上するポイントを発見
-
温度パラメータは第2の暗号鍵になる
- 0.0001の差で完全に復号不能
-
NIST検定をすべてパス
- 暗号学的に安全なランダム性
-
SNNは乱数生成で最強!(v3)
- DNN比18倍、LSTM比56倍も予測困難
-
SNNは真のカオス系!(v4 NEW)
- エントロピー7.998/8.0、正のリアプノフ指数
-
4/5の攻撃に耐性!(v4 NEW)
- 既知平文攻撃、鍵回復攻撃などをブロック
今後の展望
- 🚀 GPU (CUDA) 高速化
- 🌡️ 物理的なCPU温度を鍵に使う実験
- 🧪 ニューロモルフィックチップでの実装
ソースコード
GitHubで公開中!
論文(プレプリント)
Zenodoで公開中:
最後まで読んでいただきありがとうございました! 😊
Discussion