<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>History on kenji.blog</title><link>http://kenji.blog/categories/history/</link><description>Recent content in History on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ja</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 15:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/categories/history/index.xml" rel="self" type="application/rss+xml"/><item><title>暗号技術の歴史：シーザー暗号から耐量子暗号（PQC）まで</title><link>http://kenji.blog/p/history-of-cryptography-caesar-to-pqc/</link><pubDate>Fri, 11 Sep 2026 15:00:00 +0900</pubDate><guid>http://kenji.blog/p/history-of-cryptography-caesar-to-pqc/</guid><description>&lt;img src="http://kenji.blog/p/history-of-cryptography-caesar-to-pqc/img/eyecatch.jpg" alt="Featured image of post 暗号技術の歴史：シーザー暗号から耐量子暗号（PQC）まで" />&lt;h1 id="1-はじめに暗号技術とは何か">1. はじめに：暗号技術とは何か？
&lt;/h1>&lt;p>暗号技術（Cryptography）は、情報の秘匿性を保つための技術であり、人類の歴史とともに進化してきました。古代の戦争における秘密司令の伝達から、現代のインターネットにおけるクレジットカード情報の保護に至るまで、暗号の目的は一貫しています。それは「意図された受信者だけが情報を理解でき、第三者には解読できないようにする」ことです。&lt;/p>
&lt;p>現代の情報セキュリティにおいて、暗号技術は単なる「情報の秘匿（機密性: Confidentiality）」にとどまらず、データの「完全性（Integrity）」、「認証（Authentication）」、「否認防止（Non-repudiation）」といった重要な役割を担っています。&lt;/p>
&lt;p>本記事では、古代の単純な換字式暗号から始まり、機械式暗号、現代の共通鍵・公開鍵暗号、そして量子コンピュータの実用化によって到来する「耐量子暗号（PQC）」の時代まで、暗号技術の進化の歴史を技術的・数学的な観点から詳細に紐解いていきます。&lt;/p>
&lt;hr>
&lt;h1 id="2-古典暗号の時代文字の置き換えと並べ替え">2. 古典暗号の時代：文字の置き換えと並べ替え
&lt;/h1>&lt;p>暗号の起源は紀元前にまで遡ります。初期の暗号は主に「転置（並べ替え）」と「換字（置き換え）」の2つのアプローチで構成されていました。&lt;/p>
&lt;h2 id="スキュタレー暗号転置式暗号">スキュタレー暗号（転置式暗号）
&lt;/h2>&lt;p>紀元前5世紀の古代ギリシャ・スパルタで使用された「スキュタレー（Scytale）」は、最古の暗号器具の一つです。特定の太さの木の棒に細長い羊皮紙を巻き付け、そこに横書きでメッセージを記します。紙を解くと文字が意味不明な順序に並びますが、同じ太さの棒を持つ受信者が再び紙を巻き付けることで、元のメッセージが読めるという仕組みでした。&lt;/p>
&lt;h2 id="シーザー暗号単一換字式暗号">シーザー暗号（単一換字式暗号）
&lt;/h2>&lt;p>紀元前1世紀、古代ローマの英雄ユリウス・カエサル（シーザー）が使用したとされるのが「シーザー暗号」です。これはアルファベットを一定数（通常は3文字）シフトさせる単一換字式暗号（Monoalphabetic substitution）です。&lt;/p>
&lt;p>数学的には、文字を $0$ から $25$ までの数値として扱い、シフト数を $K$ とすると、平文 $P$ から暗号文 $C$ への変換は以下の合同式で表されます。&lt;/p>
$$C \equiv P + K \pmod{26}$$
&lt;p>復号は逆の操作を行います。&lt;/p>
$$P \equiv C - K \pmod{26}$$
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># シーザー暗号のシンプルなPython実装例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">caesar_cipher&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">shift&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;encrypt&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">mode&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;decrypt&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shift&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">shift&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">char&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">char&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isalpha&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">ord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;A&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">char&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isupper&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="nb">ord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># シフト計算&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="nb">chr&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nb">ord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">char&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">base&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">shift&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">26&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">char&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">result&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 実行例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plaintext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;HELLO WORLD&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">caesar_cipher&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plaintext&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;encrypt&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;暗号文: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># KHOOR ZRUOG&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="頻度分析とヴィジュネル暗号">頻度分析とヴィジュネル暗号
&lt;/h2>&lt;p>単一換字式暗号は、9世紀のアラブの学者アル・キンディーによって考案された「頻度分析（Frequency Analysis）」によって容易に解読されるようになりました。英語であれば「E」や「T」が頻出するという言語の統計的特性を利用したものです。&lt;/p>
&lt;p>これに対抗するため、16世紀に考案されたのが「ヴィジュネル暗号（Vigenère cipher）」です。これは複数のシフト（鍵）を周期的に切り替えて使用する多表式換字暗号（Polyalphabetic substitution）であり、約300年もの間「解読不能な暗号（Le Chiffre Indéchiffrable）」と呼ばれていました。&lt;/p>
&lt;p>数学的には、平文の $i$ 番目の文字 $P_i$ と、繰り返される鍵の $i$ 番目の文字 $K_i$ を用いて次のように暗号化します。&lt;/p>
$$C_i \equiv P_i + K_i \pmod{26}$$
&lt;p>この暗号も、19世紀に入りチャールズ・バベッジやフリードリヒ・カシスキーによって、暗号文中の繰り返しのパターンから鍵の長さを割り出す「カシスキー触媒（Kasiski examination）」が発見され、解読されることになります。&lt;/p>
&lt;div class="mermaid">graph TD
subgraph "古典暗号の分類"
A["古典暗号"] --> B["転置式暗号"]
A --> C["換字式暗号"]
B --> D["スキュタレー暗号"]
C --> E["単一換字式"]
C --> F["多表式換字式"]
E --> G["シーザー暗号"]
F --> H["ヴィジュネル暗号"]
end&lt;/div>
&lt;hr>
&lt;h1 id="3-機械式暗号と世界大戦エニグマとその解読">3. 機械式暗号と世界大戦：エニグマとその解読
&lt;/h1>&lt;p>20世紀に入ると、通信手段は手紙から電信や無線へと移行し、暗号化の速度と複雑さが求められるようになりました。ここで登場したのが、ローター（回転盤）を組み合わせた「機械式暗号」です。&lt;/p>
&lt;h2 id="エニグマenigmaの脅威">エニグマ（Enigma）の脅威
&lt;/h2>&lt;p>第二次世界大戦中、ナチス・ドイツが使用した「エニグマ」は、暗号技術史において最も有名な暗号機です。エニグマは複数のローター（通常3〜4個）と、文字の配線を入れ替えるプラグボード（Steckerbrett）、そしてリフレクター（反転ローター）で構成されていました。&lt;/p>
&lt;p>キーボードで1文字打ち込むたびにローターが回転するため、同じ文字を連続して打っても異なる暗号文字が出力されます（多表式暗号の極地）。その鍵空間（設定の組み合わせ）は約 $1.58 \times 10^{19}$ 通り（約1580京）にも及び、当時の技術では総当たりによる解読は不可能とされていました。&lt;/p>
&lt;h2 id="アランチューリングとボンブbombe">アラン・チューリングと「ボンブ（Bombe）」
&lt;/h2>&lt;p>この難攻不落のエニグマに挑んだのが、ポーランドの数学者マリアン・レイェフスキらの初期の成果を引き継いだ、イギリスのブレッチリー・パークの暗号解読チームです。&lt;/p>
&lt;p>特にアラン・チューリング（Alan Turing）は、暗号文の一部に対応する平文の推測（クリブ: Crib）を利用し、電気機械式の解読機「ボンブ（Bombe）」を開発しました。ボンブは論理的な矛盾を高速に検出し、あり得ないローター設定を次々と排除することで、エニグマの解読に成功しました。この偉業は、連合国側の勝利を数年早めたと言われています。&lt;/p>
&lt;hr>
&lt;h1 id="4-現代暗号の幕開け共通鍵暗号desとaes">4. 現代暗号の幕開け：共通鍵暗号（DESとAES）
&lt;/h1>&lt;p>戦後、コンピュータの登場により、暗号は「文字」の操作から「ビット（0と1）」の操作へと劇的なパラダイムシフトを遂げます。&lt;/p>
&lt;h2 id="クロードシャノンと情報理論">クロード・シャノンと情報理論
&lt;/h2>&lt;p>1949年、クロード・シャノンは論文「秘話系の通信理論」を発表し、現代暗号の数学的基礎を築きました。彼は安全な暗号設計の原則として「混乱（Confusion）」と「拡散（Diffusion）」を提唱しました。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>混乱（Confusion）&lt;/strong>: 鍵と暗号文の関係を可能な限り複雑にすること。（換字・Sボックスによる実現）&lt;/li>
&lt;li>&lt;strong>拡散（Diffusion）&lt;/strong>: 平文の1ビットの変更が、暗号文の多くのビットに影響を与えるようにすること。（転置・並べ替えによる実現）&lt;/li>
&lt;/ul>
&lt;h2 id="des-data-encryption-standard">DES (Data Encryption Standard)
&lt;/h2>&lt;p>1977年、アメリカ国立標準技術研究所（NIST、当時はNBS）は、IBMの設計をベースとした「DES」を標準暗号として制定しました。
DESは「ファイステル構造（Feistel Network）」と呼ばれるアーキテクチャを採用しており、64ビットのブロック長と56ビットの鍵長を持ちます。暗号化と復号のアルゴリズムがほぼ同じ構造になるという実装上の利点がありました。&lt;/p>
&lt;p>しかし、コンピュータの計算能力が向上するにつれ、56ビットの鍵長（約 $7.2 \times 10^{16}$ 通り）では不十分であることが明らかになります。1998年には電子フロンティア財団（EFF）が専用マシン「Deep Crack」を開発し、数日でDESを解読してみせました。&lt;/p>
&lt;h2 id="aes-advanced-encryption-standard">AES (Advanced Encryption Standard)
&lt;/h2>&lt;p>DESに代わる新たな標準として、2001年に制定されたのが「AES」です。公募によって選ばれたベルギーの暗号学者による「Rijndael（ラインダール）」アルゴリズムが採用されました。&lt;/p>
&lt;p>AESはファイステル構造ではなく「SPN構造（Substitution-Permutation Network）」を採用し、ガロア体（有限体） $GF(2^8)$ 上の数学的演算を利用しています。鍵長は128、192、256ビットから選択でき、現在でも世界中で標準的な共通鍵暗号として広く利用されています。&lt;/p>
&lt;div class="mermaid">graph TD
subgraph "AESの1ラウンドの処理 (SPN構造)"
A["入力状態 (128-bit)"] --> B("SubBytes (バイト代換 / S-Box)")
B --> C("ShiftRows (行シフト)")
C --> D("MixColumns (列ミックス / GF(2^8)上の乗算)")
D --> E("AddRoundKey (ラウンド鍵とのXOR)")
E --> F["次のラウンドへ"]
end&lt;/div>
&lt;hr>
&lt;h1 id="5-公開鍵暗号の革命diffie-hellmanからrsaへ">5. 公開鍵暗号の革命：Diffie-HellmanからRSAへ
&lt;/h1>&lt;p>共通鍵暗号には決定的な弱点がありました。それは「鍵配送問題（Key Distribution Problem）」です。暗号通信を始める前に、遠く離れた相手とどうやって安全に「共通の鍵」を共有するのかという問題です。この問題を解決したのが1970年代に誕生した「公開鍵暗号」です。&lt;/p>
&lt;h2 id="diffie-hellman鍵交換">Diffie-Hellman鍵交換
&lt;/h2>&lt;p>1976年、ホイットフィールド・ディフィーとマーティン・ヘルマンは、画期的な論文「New Directions in Cryptography」を発表しました。彼らは「離散対数問題（Discrete Logarithm Problem）」という数学的困難性を利用し、盗聴されている通信経路上でも安全に鍵を共有できる手法を提案しました。&lt;/p>
&lt;ol>
&lt;li>大きな素数 $p$ と生成元 $g$ を公開します。&lt;/li>
&lt;li>Aliceは秘密の値 $a$ を選び、$A = g^a \pmod{p}$ をBobに送信します。&lt;/li>
&lt;li>Bobは秘密の値 $b$ を選び、$B = g^b \pmod{p}$ をAliceに送信します。&lt;/li>
&lt;li>Aliceは $K = B^a \pmod{p}$ を計算し、Bobは $K = A^b \pmod{p}$ を計算します。&lt;/li>
&lt;li>指数法則により $K = (g^b)^a = (g^a)^b = g^{ab} \pmod{p}$ となり、見事に同じ鍵 $K$ を共有できます。&lt;/li>
&lt;/ol>
&lt;h2 id="rsa暗号">RSA暗号
&lt;/h2>&lt;p>翌1977年、ロン・リベスト、アディ・シャミア、レオナルド・エーデルマンの3人によって考案されたのが「RSA暗号」です。これは「巨大な合成数の素因数分解は困難である」という性質に基づいています。&lt;/p>
&lt;p>&lt;strong>RSAの数学的仕組み:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>2つの巨大な素数 $p$ と $q$ を選び、$n = p \times q$ を計算します。&lt;/li>
&lt;li>オイラーのトーティエント関数 $\phi(n) = (p-1)(q-1)$ を計算します。&lt;/li>
&lt;li>$\phi(n)$ と互いに素な整数 $e$（公開鍵）を選びます。&lt;/li>
&lt;li>$e \times d \equiv 1 \pmod{\phi(n)}$ となる整数 $d$（秘密鍵）を計算します。&lt;/li>
&lt;/ol>
&lt;p>暗号化: 平文 $M$ に対して $C \equiv M^e \pmod{n}$
復号: 暗号文 $C$ に対して $M \equiv C^d \pmod{n}$&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># RSA暗号の概念を示すPythonコード（実用向けではありません）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">ext_euclid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 拡張ユークリッドの互除法によるモジュラ逆数の計算&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ext_euclid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">g&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">rsa_example&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 小さな素数を用いた例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">61&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">53&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">17&lt;/span> &lt;span class="c1"># phiと互いに素な値&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ext_euclid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">phi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;公開鍵: (e=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, n=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;秘密鍵: (d=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, n=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># メッセージの暗号化と復号&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">65&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">decrypted&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;平文: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> -&amp;gt; 暗号文: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> -&amp;gt; 復号後: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">decrypted&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">rsa_example&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="6-楕円曲線暗号eccの台頭">6. 楕円曲線暗号（ECC）の台頭
&lt;/h1>&lt;p>RSA暗号は強力ですが、コンピュータの性能向上に伴い、安全性を保つために鍵長を長くする（現在では2048ビットや3072ビット）必要があり、計算コストが増大するという問題が生じました。&lt;/p>
&lt;p>そこで1985年に提案されたのが「楕円曲線暗号（Elliptic Curve Cryptography: ECC）」です。これは有限体上の楕円曲線（一般に $y^2 = x^3 + ax + b$ の形）における点の加算を利用したものです。&lt;/p>
&lt;p>楕円曲線上の離散対数問題（ECDLP）は、素因数分解問題よりもさらに解くのが困難であることが知られており、&lt;strong>RSAの3072ビットと同等の安全性を、ECCならわずか256ビットの鍵長で実現&lt;/strong>できます。これにより、スマートフォンやIoTデバイスなど、計算リソースが限られた環境でも高速かつ安全な暗号通信（ECDSAやECDHなど）が可能になりました。&lt;/p>
&lt;hr>
&lt;h1 id="7-量子コンピュータの脅威と耐量子暗号pqc">7. 量子コンピュータの脅威と耐量子暗号（PQC）
&lt;/h1>&lt;p>暗号技術は盤石に思えましたが、1994年にピーター・ショア（Peter Shor）が発表した「ショアのアルゴリズム」によって大きな衝撃が走ります。&lt;/p>
&lt;p>量子コンピュータは「重ね合わせ」と「量子もつれ」という量子力学の性質を利用して計算を行います。ショアのアルゴリズムを十分な性能の量子コンピュータ上で実行すると、素因数分解問題や離散対数問題が「多項式時間」で解けてしまうことが数学的に証明されたのです。つまり、実用的な量子コンピュータが完成した日（Q-Day）、現在使われているRSAやECCなどの公開鍵暗号はすべて瞬時に破綻します。&lt;/p>
&lt;h2 id="pqcpost-quantum-cryptographyの登場">PQC（Post-Quantum Cryptography）の登場
&lt;/h2>&lt;p>この未曾有の脅威に備え、量子コンピュータでも解読が困難な新しい数学的問題に基づく「耐量子計算機暗号（PQC）」の研究が急ピッチで進められています。NIST（米国国立標準技術研究所）は長年にわたりPQCの標準化プロセスを進めており、主に以下の数学的アプローチが有力視されています。&lt;/p>
&lt;h3 id="1-格子暗号lattice-based-cryptography">1. 格子暗号（Lattice-based Cryptography）
&lt;/h3>&lt;p>現在最も有力なアプローチであり、NISTの標準化アルゴリズム（ML-KEM / Kyber、ML-DSA / Dilithium）にも採用されています。多次元空間の「格子（Lattice）」上で特定の点を見つける問題（最短ベクトル問題: SVPなど）や、LWE（Learning With Errors: 誤差付き学習）問題の困難性に基づいています。&lt;/p>
&lt;p>LWE問題の概念は、連立一次方程式に意図的に「小さなノイズ（誤差）」を加えると、途端に解を求めるのが困難になるという性質を利用しています。
方程式系: $\mathbf{A}\mathbf{s} + \mathbf{e} \equiv \mathbf{b} \pmod{q}$
（$\mathbf{A}$ と $\mathbf{b}$ は公開、$\mathbf{s}$ は秘密鍵、$\mathbf{e}$ は微小なノイズ）&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># LWE問題の概念的疑似コード（学習目的）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">256&lt;/span> &lt;span class="c1"># 次元&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3329&lt;/span> &lt;span class="c1"># 法&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">m&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">512&lt;/span> &lt;span class="c1"># 方程式の数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 秘密鍵 s と小さなエラー e&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 公開行列 A と公開ベクトル b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">A&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 量子コンピュータを使っても、Aとbからsを復元するのは非常に困難とされる&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="2-ハッシュベース暗号hash-based-cryptography">2. ハッシュベース暗号（Hash-based Cryptography）
&lt;/h3>&lt;p>ハッシュ関数の衝突耐性のみに安全性の根拠を置くデジタル署名方式です。数学的な構造を持たないため量子攻撃に強いですが、署名サイズが大きくなる傾向があります（SPHINCS+など）。&lt;/p>
&lt;h3 id="3-符号ベース暗号code-based-cryptography">3. 符号ベース暗号（Code-based Cryptography）
&lt;/h3>&lt;p>誤り訂正符号の理論に基づく暗号方式です。1978年に提案されたMcEliece暗号などが有名で、歴史が古く安全性に定評がありますが、公開鍵のサイズが非常に大きい（数メガバイトに及ぶこともある）という課題があります。&lt;/p>
&lt;div class="mermaid">timeline
title "暗号技術と計算機の進化の歴史"
"古代〜中世" : "シーザー暗号" : "ヴィジュネル暗号" : "頻度分析の誕生"
"1930〜40年代" : "エニグマの運用と解読" : "チューリングマシン・ボンブの開発"
"1970年代" : "DES標準化 (1977)" : "Diffie-Hellman鍵交換 (1976)" : "RSA暗号の誕生 (1977)"
"1980〜90年代" : "楕円曲線暗号 (ECC) の提案" : "ショアのアルゴリズム発表 (1994)"
"2000年代" : "AES標準化 (2001)"
"2010年代〜現在" : "量子コンピュータの研究加速" : "NISTによるPQC標準化プロジェクトの開始"
"近未来 (Q-Day)" : "大規模量子コンピュータの実現？" : "PQC（ML-KEM/ML-DSA）への完全移行"&lt;/div>
&lt;hr>
&lt;h1 id="8-結論終わりのない盾と矛の戦い">8. 結論：終わりのない盾と矛の戦い
&lt;/h1>&lt;p>暗号技術の歴史は、新しい暗号方式（盾）の発明と、それを破る新しい解読手法（矛）の終わりのない戦いの歴史です。&lt;/p>
&lt;p>シーザー暗号は頻度分析に敗れ、無敵を誇ったエニグマはチューリングの天才的頭脳と機械の力に敗れました。そして今、現代インターネット社会の根幹を支えるRSAやECCといった強力な暗号も、量子コンピュータという新たな「矛」の前に脅威に晒されています。&lt;/p>
&lt;p>しかし、人類は既にその先の未来を見据え、耐量子暗号（PQC）という新たな「盾」を準備しつつあります。現在、世界中のITインフラにおいて、既存の公開鍵暗号からPQCへの移行準備（Crypto Agilityの確保）が急務となっています。&lt;/p>
&lt;p>暗号技術は、単なる難解な数学のパズルではなく、私たちのプライバシー、財産、そして社会インフラそのものを守るための最強の防壁なのです。&lt;/p></description></item></channel></rss>