高度暗号化標準(AES )は、元の名前であるRijndael(オランダ語の発音:[ ˈrɛindaːl ]、RAIN -dahl)[ 5 ]としても知られており、2001年に米国国立標準技術研究所(NIST)によって確立された電子データの暗号化の仕様です。[ 6 ]
AESは、ベルギーの暗号学者であるJoan DaemenとVincent Rijmenによって開発されたRijndaelブロック暗号[ 5 ]の変種であり、彼らはAES選定プロセス中にNISTに提案書[ 7 ]を提出した[ 8 ]。Rijndaelは、鍵とブロックサイズが異なる暗号のファミリーである。AESでは、NISTはRijndaelファミリーから3つのメンバーを選定した。それぞれブロックサイズは128ビットだが、鍵長は128、192、256ビットの3種類である。
AESは米国政府に採用されています。これは1977年に発表されたデータ暗号化標準(DES)[ 9 ]に取って代わるものです。AESで説明されているアルゴリズムは対称鍵アルゴリズムであり、データの暗号化と復号化の両方に同じ鍵が使用されます。
米国では、AESは2001年11月26日にNISTによって米国FIPS PUB 197(FIPS 197)標準として発表されました。 [ 6 ]この発表は、15の競合する設計が提示され評価された5年間の標準化プロセスを経て、Rijndael暗号が最も適していると選ばれた後に行われました。
AESはISO / IEC 18033-3規格に含まれています。AESは、ドナルド・エバンス米国商務長官 の承認を経て、2002年5月26日に米国連邦政府の標準規格として発効しました。AESはさまざまな暗号化パッケージで利用可能であり、米国国家安全保障局(NSA)が承認した暗号モジュールで使用される場合、最高機密情報用にNSAが承認した最初(かつ唯一)の公開暗号です。[注3 ]
高度暗号化標準(AES)は、以下の規格で定義されています。
AESは置換・順列ネットワークと呼ばれる設計原理に基づいており、ソフトウェアとハードウェアの両方で効率的です。[ 11 ]前身のDESとは異なり、AESはFeistelネットワークを使用しません。AESはRijndaelの変種で、ブロックサイズは128ビットに固定され、鍵サイズは128、192、または256ビットです。対照的に、Rijndael自体は、最小128ビット、最大256ビットで、32ビットの任意の倍数であるブロックサイズと鍵サイズで規定されています。ほとんどのAES計算は、特定の有限体で行われます。
AESは、 16バイトb0、b1 、 ...、b15の4×4列優先順序配列(状態と呼ばれる)上で動作します。[注4 ]
AES暗号で使用される鍵サイズは、入力(平文と呼ばれる)を最終出力(暗号文と呼ばれる)に変換する変換ラウンドの数を指定します。ラウンド数は次のとおりです。
各ラウンドは複数の処理ステップで構成され、そのうちの1つは暗号鍵自体に依存します。同じ暗号鍵を使用して暗号文を元の平文に戻すために、一連の逆ラウンドが適用されます。

SubBytesステップでは、状態配列の各バイトa i,jは、8 ビット置換ボックスを使用してSubByte S ( a i,j )に置き換えられます。ラウンド 0 の前は、状態配列は単に平文/入力です。この操作により、暗号に非線形性が生じます。使用される S ボックスは、優れた非線形性を持つことが知られているGF (2 8 )上の乗法逆から導出されます。単純な代数的性質に基づく攻撃を回避するために、S ボックスは逆関数と可逆アフィン変換を組み合わせることによって構築されます。S ボックスは、固定点 (したがって置換)、つまりS ( a i,j ) ≠ a i,jおよび反対の固定点、つまりS ( a i,j ) ⊕ a i,j ≠ FF 16を回避するように選択されます。復号化を実行する際には、InvSubBytesステップ( SubBytesの逆)が使用されます。これは、まずアフィン変換の逆変換を行い、次に乗法逆変換を求める必要があります。

ShiftRowsステップは状態の行に対して動作し、各行のバイトを一定のオフセットで巡回的にシフトします。AES の場合、最初の行は変更されません。2 番目の行の各バイトは 1 つ左にシフトされます。同様に、3 番目の行と 4 番目の行はそれぞれ 2 つと 3 つのオフセットでシフトされます。[注 5 ]このようにして、 ShiftRowsステップの出力状態の各列は、入力状態の各列のバイトで構成されます。このステップの重要性は、列が個別に暗号化されることを回避することです。その場合、AES は 4 つの独立したブロック暗号に退化してしまいます。

MixColumnsステップでは、状態の各列の4バイトが可逆線形変換を用いて結合されます。MixColumns関数は4バイトを入力として受け取り、4バイトを出力します。入力バイトは4バイトすべての出力バイトに影響を与えます。MixColumnsはShiftRowsと組み合わせることで、暗号における拡散を実現します。
この操作中、各列は固定行列を使用して変換されます(行列を列に左から乗算すると、状態における列の新しい値が得られます)。
行列の乗算は、要素の乗算と加算で構成されます。要素は、次数x 7の多項式の係数として扱われるバイトです。加算は単純な XOR です。乗算は、既約多項式x 8 + x 4 + x 3 + x + 1を法とします。ビットごとに処理する場合、シフト後、シフトされた値が FF 16より大きい場合は、 1B 16との条件付きXOR を実行する必要があります (オーバーフローは、生成多項式の減算によって修正する必要があります)。これらは、GF(2 8 )における通常の乗算の特殊なケースです。
より一般的な意味では、各列はGF(2 8 )上の多項式として扱われ、その後、法を乗算されます。固定された多項式係数は、 GF(2 8 )[ x ]からのビット多項式のバイナリ表現の16進数相当で表示されます。MixColumnsステップは、有限体GF(2 8 )の特定のMDS 行列による乗算と見なすこともできます。このプロセスについては、記事Rijndael MixColumnsでさらに詳しく説明されています。

AddRoundKeyステップでは、サブキーが状態と結合されます。各ラウンドにおいて、Rijndaelのキースケジュールを使用してメインキーからサブキーが生成されます。各サブキーのサイズは状態と同じです。サブキーは、状態とサブキーの対応するバイトをビットごとのXOR演算で結合することにより追加されます。
32 ビット以上のワードを持つシステムでは、SubBytesおよびShiftRowsステップをMixColumnsステップと組み合わせ、それらをテーブル参照のシーケンスに変換することで、この暗号の実行を高速化できます。これには、4 つの 256 エントリの 32 ビット テーブル (合計で 4096 バイト) が必要です。その後、16 回のテーブル参照操作と 12 回の 32 ビット排他的論理和操作でラウンドを実行でき、続いてAddRoundKeyステップで 4 回の 32 ビット排他的論理和操作を実行します。[ 12 ] あるいは、単一の 256 エントリの 32 ビット テーブル (1024 バイト) とそれに続く円形回転操作でテーブル参照操作を実行することもできます。
バイト指向のアプローチを使用すると、SubBytes、ShiftRows、およびMixColumnsステップを単一のラウンド操作に組み合わせることができます。[ 13 ]
国家安全保障局(NSA)は、Rijndaelを含むすべてのAES最終候補を審査し、それらすべてが米国政府の非機密データに対して十分なセキュリティを備えていると述べた。2003年6月、米国政府はAESが機密情報の保護に使用できると発表した。
AESアルゴリズムのすべての鍵長(128、192、256)の設計と強度は、SECRETレベルまでの機密情報を保護するのに十分です。TOP SECRET情報には、192または256の鍵長を使用する必要があります。国家安全保障システムおよび/または情報を保護することを目的とした製品にAESを実装する場合は、取得および使用前にNSAによる審査と認証を受ける必要があります。[ 14 ]
AESは、128ビット鍵の場合は10ラウンド、192ビット鍵の場合は12ラウンド、256ビット鍵の場合は14ラウンドの暗号化方式を採用しています。
しかし、 NSAの最近のガイダンスでは、機密情報の暗号化には256ビットの鍵長のみが許可されています。128ビットと192ビットでは、機密情報の暗号化にはもはや十分ではありません。[ 15 ]
暗号学者にとって、暗号学的「突破」とは、総当たり攻撃(つまり、考えられるすべての鍵に対して順番に1回ずつ復号を試行すること)よりも速いものすべてを指します。したがって、突破には、現在の技術では実現不可能な結果が含まれる可能性があります。理論的な突破は、実用的ではないものの、脆弱性のパターンに関する洞察を提供する場合があります。広く実装されているブロック暗号アルゴリズムに対する、公に知られている最大の総当たり攻撃の成功例は、2006年にdistributed.netが行った64ビットRC5鍵に対する攻撃です。 [ 16 ]
鍵長が1ビット増えるごとに鍵空間は2倍になり、鍵のすべての可能な値が等確率であると仮定すると、これは鍵長が1ビット増えるごとに総当たり攻撃による鍵探索の平均時間が2倍になることを意味します。つまり、総当たり攻撃の労力は鍵長に対して指数関数的に増加するということです。鍵長自体は攻撃に対する安全性を保証するものではありません。なぜなら、非常に長い鍵を持つ暗号でも脆弱性が発見されているからです。
AES は比較的単純な代数的フレームワークを持っています。[ 17 ] 2002 年に、ニコラ・クルトワとヨゼフ・ピエプジクによって「 XSL 攻撃」と呼ばれる理論的な攻撃が発表され、非線形コンポーネントの複雑さが低いことなどが原因で AES アルゴリズムに弱点があると主張しました。[ 18 ]それ以降、他の論文では、最初に提示された攻撃は実行不可能であることが示されています。ブロック暗号に対する XSL 攻撃を参照してください。
AES の選定プロセス中、競合アルゴリズムの開発者は Rijndael のアルゴリズムについて「 セキュリティ上重要なアプリケーションでの使用について懸念している」と述べている。[ 19 ]しかし、2000 年 10 月、AES 選定プロセスの終了時に、競合アルゴリズムTwofishの開発者であるBruce Schneier は、Rijndael に対する学術的な攻撃がいつか開発されるだろうと考えているものの、「Rijndael の通信を読み取ることができる攻撃が発見されるとは誰も思っていない」と述べている。[ 20 ]
2006年までに最もよく知られた攻撃は、128ビット鍵の場合は7ラウンド、192ビット鍵の場合は8ラウンド、256ビット鍵の場合は9ラウンドに対するものでした。[ 21 ]
2009 年 5 月まで、完全な AES に対する公開された攻撃で成功したものは、特定の実装に対するサイドチャネル攻撃のみでした。2009 年に、 AES の鍵スケジュールの単純さを悪用する新しい関連鍵攻撃が発見され、その複雑さは 2 119でした。2009 年 12 月に、その複雑さは 2 99.5に改善されました。[ 2 ]これは、2009 年初頭にAlex Biryukov、Dmitry Khovratovich、および Ivica Nikolićによって発見された攻撃の続編であり、2 35 個の鍵のうち 1 つに対して2 96の複雑さでした。 [ 22 ]しかし、適切に設計された暗号プロトコルでは、関連鍵攻撃は問題になりません。適切に設計されたプロトコル (つまり、実装ソフトウェア) は、関連鍵を許可しないように注意し、本質的には、関連性に基づいて鍵を選択する攻撃者の手段を制限します。
別の攻撃は、2009 年 7 月 30 日に Bruce Schneier [ 3 ]によってブログに投稿され 、 2009 年 8 月 3 日にプレプリント[ 23 ]として公開されました。この新しい攻撃は、Alex Biryukov、 Orr Dunkelman、Nathan Keller、Dmitry Khovratovich、およびAdi Shamirによって行われ、2 つの関連キーのみを使用する AES-256 を対象としており、9 ラウンドバージョンの完全な 256 ビットキーを復元するのに 2 39時間、より強力なタイプの関連サブキー攻撃を使用した 10 ラウンドバージョンでは2 45時間、11 ラウンドバージョンでは 2 70時間かかります。256 ビット AES は 14 ラウンドを使用するため、これらの攻撃は完全な AES に対しては効果的ではありません。
より強力な関連鍵を用いたこれらの攻撃の実用性は批判されており、[ 24 ]例えば、2010年にVincent Rijmenが執筆したAES-128に対する中間鍵選択関係攻撃に関する論文[ 25 ]で批判されている。
2009 年 11 月、 AES-128 の 8 ラウンド版に対する最初の既知鍵識別攻撃がプレプリントとして公開されました。 [ 26 ] この既知鍵識別攻撃は、AES のような順列に対するリバウンド攻撃、または中間から開始する攻撃の改良版で、連続する 2 ラウンドの順列をいわゆる Super-S-box の適用とみなします。これは、AES-128 の 8 ラウンド版で動作し、時間計算量は 2 48、メモリ計算量は 2 32です。128 ビット AES は 10 ラウンドを使用するため、この攻撃は完全な AES-128 に対しては有効ではありません。
完全な AES に対する最初の鍵回復攻撃は、 Andrey Bogdanov、Dmitry Khovratovich、および Christian Rechberger によって行われ、2011 年に発表されました。[ 27 ]この攻撃はバイクリック攻撃であり、総当たり攻撃よりも約 4 倍高速です。AES -128 の鍵を回復するには2126.2回の操作が必要です。AES-192 と AES-256 の場合は、それぞれ2190.2回と2254.6回の操作が必要です。この結果は、Biaoshuai Tao と Hongjun Wu によって 2015 年の論文でさらに改善され、AES-128 では2126.0回、AES-192 では2189.9回、 AES-256 では2254.3回となり、現在 AES に対する鍵回復攻撃で最良の結果となっています。[ 28 ]
これは非常に小さな利点です。126 ビットの鍵 (128 ビットではなく) では、現在のハードウェアや将来予測されるハードウェアで総当たり攻撃を行うのに依然として数十億年かかります。また、著者らは、128 ビットの鍵を使用した AES に対する彼らの手法による最良の攻撃には 2 88ビットのデータを保存する必要があると計算しています。これは約 38 兆テラバイトのデータに相当し、2016 年に地球上のすべてのコンピュータに保存されていたすべてのデータよりも多い量です。[ 29 ] 2015 年の論文では、空間計算量が 2 56ビットに改善されました。[ 28 ]これは 9007 テラバイトです (時間計算量は依然として約 2 126のままです)。
スノーデン文書によると、NSAはタウ統計に基づく暗号攻撃がAESの解読に役立つかどうかを研究している。[ 30 ]
現時点では、鍵を知らない者が、正しく実装されたAESで暗号化されたデータを読み取ることを可能にするような、既知の実用的な攻撃方法は存在しない。
サイドチャネル攻撃は、暗号をブラックボックスとして攻撃するものではないため、古典的な文脈で定義される暗号のセキュリティとは関係ありませんが、実際には重要です。サイドチャネル攻撃は、意図せずデータを漏洩させてしまうハードウェアまたはソフトウェアシステム上の暗号の実装を攻撃します。AESのさまざまな実装に対して、このような既知の攻撃がいくつか存在します。
2005 年 4 月、D. J. Bernstein は、 OpenSSLの AES 暗号化を使用するカスタム サーバーを破るために使用したキャッシュ タイミング攻撃を発表しました。 [ 31 ]この攻撃には 2 億を超える選択平文が必要でした。[ 32 ]カスタム サーバーは、可能な限り多くのタイミング情報を提供するように設計されていました (サーバーは暗号化操作にかかったマシン サイクル数を返します)。しかし、Bernstein が指摘したように、「サーバーのタイム スタンプの精度を下げたり、サーバーの応答からタイム スタンプを削除したりしても、攻撃は阻止されません。クライアントはローカル クロックに基づく往復タイミングを使用し、より多くのサンプルで平均化することでノイズの増加を補償します。」[ 31 ]
2005 年 10 月、Dag Arne Osvik、Adi Shamir、およびEran Tromer はdm-crypt、OpenSSL および Linux のパーティション暗号化機能に実装されている AES に対するいくつかのキャッシュタイミング攻撃を示す論文を発表しました。 [ 33 ]ある攻撃では、暗号化をトリガーする 800 回の操作だけで、合計 65 ミリ秒で AES キー全体を取得することができました。この攻撃では、攻撃者は AES を実行しているシステムまたはプラットフォームと同じシステムまたはプラットフォームでプログラムを実行できる必要があります。
2009年12月、差分障害解析を用いて鍵の復元を可能にする、一部のハードウェア実装に対する攻撃が発表された。この攻撃は2³²の複雑さを持つ鍵の復元を可能にする。[ 34 ]
2010 年 11 月、Endre Bangerter、David Gullasch、Stephan Krenn は、暗号文も平文も必要とせずに AES-128 から秘密鍵を「ほぼリアルタイム」で復元する実用的なアプローチを説明した論文を発表しました。このアプローチは、OpenSSL などの圧縮テーブルを使用する AES-128 実装でも機能します。[ 35 ]以前の攻撃のいくつかと同様に、この攻撃では、AES 暗号化を実行するシステム上で非特権コードを実行できる能力が必要ですが、これは、root アカウントを乗っ取るよりもはるかに簡単にマルウェア感染によって達成できます。[ 36 ]
2016年3月、C. Ashokkumar、Ravi Prakash Giri、Bernard Menezesは、わずか6~7ブロックの平文/暗号文で完全な128ビットAES鍵を復元できるAES実装に対するサイドチャネル攻撃を発表しました。これは、100回から100万回の暗号化を必要とする従来の研究に比べて大幅な改善です。[ 37 ]提案された攻撃には標準的なユーザー権限が必要で、鍵取得アルゴリズムは1分以内に実行されます。
多くの最新のCPUには、タイミング関連のサイドチャネル攻撃から保護するAES用のハードウェア命令が組み込まれています。 [ 38 ] [ 39 ]
AES-256 は、128ビットのセキュリティで従来の非量子攻撃に対する AES-128 の耐性と同様の量子耐性を持つため、量子耐性があるとみなされています。AES-192 と AES-128 は、鍵サイズが小さいため、量子耐性があるとはみなされていません。AES-192 は量子攻撃に対して 96 ビットの強度を持ち、AES-128 は量子攻撃に対して 64 ビットの強度を持つため、どちらも安全ではありません。[ 40 ] [ 41 ]
暗号モジュール検証プログラム(CMVP)は、米国政府の国立標準技術研究所(NIST)コンピュータセキュリティ部門とカナダ政府の通信保安局(CSE)が共同で運営しています。米国政府は、機密だが非機密(SBU)以上の分類を持つすべてのデータの暗号化に、NIST FIPS 140-2に準拠して検証された暗号モジュールの使用を義務付けています。NSTISSP #11「情報保証の取得に関する国家政策」より:「機密情報を保護するための暗号化製品はNSAによって認証され、機密情報を保護することを目的とした暗号化製品はNIST FIPS 140-2 に従って認証される。」[ 42 ]
カナダ政府はまた、各省庁の非機密用途において、 FIPS 140認証済みの暗号モジュールを使用することを推奨している。
NIST発行文書197(「FIPS 197」)はAESアルゴリズムを網羅した唯一の文書ですが、ベンダーは通常、FIPS 140に基づいてCMVPに申請し、Triple DESやSHA1などの複数のアルゴリズムの同時検証を依頼します。そのため、FIPS 197のみで検証された暗号モジュールは稀であり、NIST自身もFIPS 197で検証されたモジュールを個別に公開Webサイトに掲載することは通常ありません。その代わりに、FIPS 197の検証は、通常、FIPS 140で検証された暗号モジュールの現在のリストに「FIPS承認済み:AES」という表記(特定のFIPS 197証明書番号付き)として記載されるだけです。
暗号アルゴリズム検証プログラム(CAVP)[ 43 ]は、AESアルゴリズムの正しい実装を独立して検証することを可能にします。検証に成功すると、NIST検証ページに掲載されます。[ 44 ]このテストは、FIPS 140-2モジュール検証の前提条件です。ただし、CAVP検証に成功したからといって、そのアルゴリズムを実装する暗号モジュールが安全であることを意味するものではありません。FIPS 140-2検証を受けていない、またはNSAによる特定の承認を受けていない暗号モジュールは、米国政府によって安全とはみなされず、政府データの保護には使用できません。[ 42 ]
FIPS 140-2 の検証は、技術的にも財政的にも達成が困難です。[ 45 ]標準化された一連のテストとソースコードレビューの要素があり、これらを数週間かけてクリアする必要があります。承認されたラボでこれらのテストを実行するコストは高額になる可能性があり(例えば、30,000米ドルをはるかに超える場合)[ 45 ]、検証のためにモジュールを記述、テスト、文書化、準備するのにかかる時間は含まれていません。検証後、モジュールが何らかの形で変更された場合は、再提出して再評価する必要があります。セキュリティ機能に変更がない場合は、簡単な書類の更新で済む場合もあれば、変更によってセキュリティ機能に影響が出た場合は、より大規模な再テストが必要になる場合もあります。
テストベクトルとは、特定の入力と鍵に対する既知の暗号の集合です。NISTは、AESテストベクトルの参照をAES既知解答テスト(KAT)ベクトルとして配布しています。[注6 ]
高速性と低RAM要件は、AES選定基準の一部でした。採用されたアルゴリズムであるAESは、8ビットスマートカードから高性能コンピュータまで、幅広いハードウェアで優れた性能を発揮しました。
Pentium Proでは、AES 暗号化には 1 バイトあたり 18 クロックサイクル (cpb) が必要であり、[ 46 ]スループットは約 100 バイトに相当します。11 MiB/sで200MHz プロセッサ。
AES-NI命令セット拡張をサポートするIntel CoreおよびAMD Ryzen CPUでは、スループットは数GiB/sに達する可能性があります。[ 47 ] Intel Westmere CPUでは、AES-NIを使用したAES暗号化には約AES-128の場合は1.3 cpb、 AES-256の場合、1.8 cpb 。 [ 48 ]