共通鍵暗号

**共通鍵暗号**（きょうつうかぎあんごう、）は、暗号化と復号に同一の（共通の）鍵を用いる暗号方式である。**秘密鍵暗号** () 、**対称鍵暗号** ()、**慣用暗号** ()、**共有鍵暗号** () ともいう。

また、広い意味で、鍵を共有した者の間での通信の安全性を保障する暗号技術を共通鍵暗号と呼ぶこともある。この場合、メッセージの秘匿を目的とした暗号方式だけでなく、メッセージの改ざん検出を可能とするメッセージ認証符号（秘匿機能は無い）、暗号とメッセージ認証の機能を併せ持つ認証付き暗号も、広い意味での共通鍵暗号である。広い意味での共通鍵暗号技術は、提供する機能は異なっても、共通の技術を用いているものも多い。例えば、秘匿用のブロック暗号を用いたメッセージ認証用の利用モードなどがある。以下では、秘匿を目的とした狭い意味での共通鍵暗号について扱う。

## 特徴
共通鍵暗号方式の長所は公開鍵暗号方式と比べて処理が高速であること、短所は鍵の受け渡し（鍵交換）に注意を要することである。どんなに複雑な暗号化を施しても、暗号化の方式が既知なら、鍵さえ分かってしまえば誰でも復号できるからである。

共通鍵暗号方式は通常、大量のデータを暗号化するのに適している。ワンタイムパッドを除けば、鍵長が短く、これは保存スペースが少なく、伝送が速いことを意味する。このため、非対称鍵暗号は、共通鍵暗号のための秘密鍵を交換するためにしばしば使用される。

暗号化する側と復号する側とが同じ鍵をもつ必要があり、鍵が漏洩する可能性は、保持者が増えるほど増すことになる。受け渡し相手によってそれぞれ個別の鍵をもてばよいが、その場合は管理すべき鍵の個数が相手の分だけ増加することになる。具体的には2人でだけ受け渡しをする場合は、1種類の鍵があればよいが、3人では3種類、4人では6種類、5人では10種類と増えていく。*n* 人の間で必要な鍵の個数は、n(n-1)/2 である。

## 分類
共通鍵暗号は、方式によってストリーム暗号とブロック暗号に大別される。

ストリーム暗号のほうがロジック量が少なく、処理を高速化できる。メッセージの数字（通常はバイト）、または文字（換字式暗号の場合）を一度に1つずつ暗号化する。例としてChaCha20がある。換字式暗号はよく知られた暗号だが、頻度分析を用いることで容易に解読できる。

ブロック暗号は、一定数のビットをまとめて1つの単位として暗号化し、平文をブロックサイズの倍数にするためにパディングを行う。例えば、2001年12月にNISTによって承認されたAdvanced Encryption Standard（AES）アルゴリズムは、128ビットのブロックを使用する。

ストリーム暗号にはRC4、MUGI、ブロック暗号には、IDEA、AES、Camelliaが分類される。

## 実装

代表的な共通鍵暗号アルゴリズムの例には、Twofish、Serpent、AES（Rijndael）、Camellia、Salsa20、ChaCha20、Blowfish、CAST5、Kuznyechik、RC4、DES、3DES、Skipjack、Safer、IDEAなどがある。

## 共通鍵暗号の構成

多くの現代的なブロック暗号は、ホルスト・ファイステルが提案した構成に基づいている。ファイステル構造は、それ自体は可逆でない他の関数から可逆関数を構築することを可能にする。

## 共通鍵暗号の安全性

共通鍵暗号は歴史的に、既知平文攻撃、選択平文攻撃、差分解読法、線形解読法に対して脆弱であった。各ラウンドの関数を慎重に構成することで、攻撃が成功する可能性を大幅に減らすことができる。 攻撃からより良く保護するために、鍵長を長くしたり、暗号化プロセスのラウンド数を増やしたりすることも可能である。しかし、これはシステムが行う必要のある操作の量のために、処理能力の要求を高め、プロセスの実行速度を低下させる傾向がある。

現代のほとんどの共通鍵アルゴリズムは、ポスト量子暗号の脅威に対して耐性があるように見える 。量子コンピュータは、これらの暗号が解読される速度を指数関数的に増加させると考えられる。特に、グローバーのアルゴリズムは総当たり攻撃に伝統的に必要とされる時間の平方根の時間しかかからないが、これらの脆弱性は鍵長を2倍にすることで補うことができる 。例えば、128ビットのAES暗号は、すべての可能な繰り返しを試すのに必要な時間を1000京年以上から約6ヶ月に短縮するため、このような攻撃に対して安全ではない。対照的に、量子コンピュータが256ビットのAES暗号を解読するのにかかる時間は、従来のコンピュータが128ビットのAES暗号を解読するのにかかる時間と同じである 。このため、AES-256は「耐量子」であると考えられている。

## 鍵管理

## 鍵確立
共通鍵アルゴリズムでは、メッセージの送信者と受信者の両方が同じ秘密鍵を持つ必要がある。初期のすべての暗号システムでは、送信者または受信者が物理的に安全なチャネルを介してその秘密鍵のコピーを何らかの方法で受け取る必要があった。

現代のほとんどすべての暗号システムは、メッセージの大部分を暗号化するために内部的に共通鍵アルゴリズムを使用しているが、ディフィー・ヘルマン鍵交換やその他の公開鍵プロトコルを使用して、各セッション/会話ごとに新しい秘密鍵（前方秘匿性）を安全に合意することにより、物理的に安全なチャネルの必要性を排除している。

## 鍵生成
鍵転送のために非対称暗号と併用する場合、共通鍵暗号のセッション鍵を生成するために、ほぼ常に擬似乱数鍵生成器が使用される。しかし、これらの生成器やその初期化ベクトルにおけるランダム性の欠如は致命的であり、過去には暗号解読の突破口となってきた。したがって、実装では初期化のために高いエントロピーを持つソースを使用することが不可欠である。

## 応用例

* SSL/TLS（HTTPS通信）：インターネット上の通信を暗号化するために、まず公開鍵暗号方式で共通鍵（セッション鍵）を生成し、その後その共通鍵を用いて通信内容を高速に暗号化・復号する。 
* ファイル暗号化：パスワード付きzipファイルなど、共通鍵（パスワード）を事前に共有した上で、特定のファイルを暗号化して保護するために使われる。 
* Wi-Fi接続：Wi-Fiルーターと端末が共通のパスワード（共通鍵）を共有し、無線通信の暗号化と復号を行う。 
* ICカード：ICカードに保存された情報や、カードとリーダー間の通信を安全に保つために共通鍵暗号が使われることがある。 
* オンラインバンキング・クレジットカード：取引情報などを保護するために、共通鍵暗号が使われる場合がある。 

## 歴史
ガイウス・ユリウス・カエサルの考案とされるシーザー暗号もこの方式であり、紀元前から存在するタイプの暗号である。シーザー暗号のアルゴリズムは、原文のそれぞれの文字についてアルファベット上である文字数だけシフトして得られる文字の列を暗号文とするものであり、シフトする文字数が鍵となる。たとえば「ABC」という原文に対してアルファベット上で（鍵）3文字だけ右にシフトすると「DEF」という暗号文が得られる。復号する場合は逆に左に3文字シフトすれば原文が得られる。こういった、アルゴリズムさえ分かってしまえば解読が容易になる暗号は古典暗号として分類され、逆にアルゴリズムは公開しても、鍵さえ漏洩しないように管理していれば安全なタイプは現代暗号として分類される。

1976年のDESが現代暗号の始まりであり、それとともに暗号学も始まったといえる。アルゴリズムを公開してよい、すなわち議論の題材とできるので、研究が活発化した。暗号の解読も、新しい方法が考案されてきた。解読方法の例としては例えば総当たり攻撃という原始的なものがある。また、2大攻撃法として知られるアディ・シャミアによる差分攻撃、松井充による線形攻撃があり、これらによってDESもFEALも解読された。松井が1995年に開発したMISTY1という暗号も、2015年にDivision Propertyという技術を使ったIntegral攻撃によって解読された。

## 脚注

### 出典

## 参考文献
* 
* 

## 関連項目
* 公開鍵暗号
* ハイブリッド暗号

## 外部リンク
*