この記事は、インテル® デベロッパー・ゾーンに掲載されている「Intel® Advanced Encryption Standard Instructions (AES-NI)」の日本語参考訳です。
はじめに
AES (Advanced Encryption Standard) は、2011 年にアメリカ政府により採用された暗号化基準です。ネットワーク・トラフィック、個人情報、企業の IT インフラストラクチャーを保護するため、ソフトウェア・エコシステム全体で広く利用されています。AES は、複数のラウンドにより暗号化/復号化を行う対称ブロック暗号です。2010 年にリリースされたインテル® Core™ プロセッサー・ファミリー (開発コード名: Westmere) に、新しい命令セットとしてインテル® AES New Instructions (インテル® AES-NI) が追加されました。これらの命令は、AES アルゴリズムの複雑で処理に時間のかかるステップをハードウェアで実装し、高速に実行できるように設計されています。インテル® AES-NI を利用することで、AES 処理のパフォーマンスをソフトウェア実装と比べて 3 ~ 10 倍もスピードアップすることができます。
AES アルゴリズムは、128 ビットのプレーンテキストを複数回のラウンドで暗号化し、最終的な暗号文を生成します。使用されるラウンド回数 (10、12、14 のいずれか) は、暗号キーの長さ (128、192、256 ビットのいずれか) に依存します。各ラウンドは、入力に対して一連のステップを実行して次のラウンドに渡します。各ラウンドは、キー・スケジュールによって生成されたサブキーを用いて暗号化されます。AES の詳細は、この記事の終わりにある [1] を参照してください。
インテル® AES-NI 命令セットは、AES アルゴリズムの計算負荷の高い部分を実行する 6 つの新しい命令で構成されています。これらの命令は、ソフトウェア実装よりもはるかに少ないクロックサイクルで実行できます。新しい命令のうち 4 つは、ラウンドの暗号化/復号化を高速化するためのもので、2 つはラウンドキーを生成するためのものです。以下は、新しい命令の内訳です。
- AESENC: 暗号化の 1 つのラウンドを実行します。AES アルゴリズムの 4 つのステップ (ShiftRows、SubBytes、MixColumns、AddRoundKey) が 1 つの命令にまとめられています。
- AESENCLAST: 暗号化の最終ラウンドを実行します。AES アルゴリズムの ShiftRows、SubBytes、AddRoundKey ステップが 1 つの命令にまとめられています。
- AESDEC: 復号化の 1 つのラウンドを実行します。AES アルゴリズムの 4 つのステップ (InvShiftRows、InvSubBytes、InvMixColumns、AddRoundKey) が 1 つの命令にまとめられています。
- AESDECLAST: 復号化の最終ラウンドを実行します。AES アルゴリズムの InvShiftRows、InvSubBytes、AddRoundKey ステップが 1 つの命令にまとめられています。
- AESKEYGENASSIST : 暗号化に使用されるラウンドキーを生成します。
- AESIMC : Equivalent Inverse Cipher を使って、暗号化ラウンドキーを復号化で利用できる形式に変換します。
各命令とその使用法の詳細は、この記事の終わりにあるホワイトペーパー [3] を参照してください。
インテル® AES-NI の利点
パフォーマンスの向上
インテル® AES-NI によってもたらされるパフォーマンスの向上は、アプリケーションとその実行時間に占める暗号化/復号化の割合に依存します。アルゴリズム・レベルで、インテル® AES-NI は AES のパフォーマンスを大幅に向上します。CBC 暗号化などのシリアルな AES 操作では、ソフトウェア実装と比べて 2 ~ 3 倍、CBC 復号化や CTR などの並列化可能な AES 操作では 10 倍スピードアップします。パフォーマンスの詳細は、この記事の終わりにある [3] を参照してください。
インテルは、命令セット拡張の一環として AES 向けの命令セット・アーキテクチャー (ISA) をリリースしました。ホワイトペーパー [3] では、インテル® Core™ i7-980X プロセッサー エクストリーム・エディションのインテル® AES-NI によってもたらされる、AES アルゴリズムの優れたパフォーマンスを紹介しています。さまざまなコア数とスレッド数の組み合わせにおいて、すべてのキーサイズのシリアルおよび並列モードのパフォーマンスを比較しています。パフォーマンスの測定には、シングルコアのインテル® Core™ i7-980X プロセッサー エクストリーム・エディション上で、並列モードの AES-128 で 1 バイトあたり 約1.3 サイクルを達成可能な高度に最適化された AES 関数の実装が使用されました。このホワイトペーパーでは、これらのパフォーマンスを達成するためのコーディング方法について説明し、ソースコードも紹介しています。(詳しくは、ホワイトペーパー「Breakthrough AES Performance with Intel® AES New Instructions」 (https://software.intel.com/sites/default/files/m/d/4/1/d/8/10TB24_Breakthrough_AES_Performance_with_Intel_AES_New_Instructions.final.secure.pdf) をお読みください。)
セキュリティーの向上
パフォーマンスの向上に加えて、インテル® AES-NI は、最近見つかった AES へのサイドチャネル攻撃の対応にも役立ちます。インテル® AES-NI 命令は、すべての暗号化/復号化をハードウェアで行い、ソフトウェア・ルックアップ・テーブルを必要としないため、サイドチャネル攻撃のリスクを低減するだけでなく、AES パフォーマンスを大幅に向上します。詳細は、この記事の終わりにある [3] を参照してください。
インテル® AES-NI の利用について
インテル® AES-NI 命令は、AES 暗号化を実装するすべてのアプリケーションで利用できます。AES は、ネットワーク暗号化、ディスクおよびファイルの暗号化など、さまざまなアプリケーションで幅広く使用されています。ファイル/ディスクの暗号化アプリケーションではディスクに保存されているデータの保護に、ネットワーク暗号化アプリケーションでは、SSL、TLS、IPsec、HTTPS、FTP、SSH などの多様なプロトコルによって転送されるデータの保護に使用されます。
新たにコーディングする場合も、既存のアプリケーションを最適化する場合も、インテル® AES-NI を活用する方法はいくつかあります。この節では、インテル® AES-NI のいくつかの使用法を示します。
標準ライブラリーを使用する
AES を含む暗号化機能を提供する既存の暗号化ライブラリーを使用している場合、最新のライブラリーがリンクされるようにアプリケーションを再コンパイルするだけで済みます。次の表は、インテル® AES-NI 向けに最適化されているライブラリーとそのバージョンの一覧です。
ライブラリー | 説明 | インテル® AES-NI 対応 バージョン |
Open SSL* | SSL と TLS のオープンソース・ライブラリー実装。AES を含むいくつかの暗号化関数をサポート。 |
1.0 (試験的なバージョン) で対応
0.9.8k 以前はパッチで対応 |
インテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP) 暗号化 | マルチコア対応の高度に最適化された、AES を含む暗号化アルゴリズムの広範囲なライブラリー。 | 6.1 以降 |
Microsoft* CNG (Cryptography API: Next Generation)1 | Microsoft* オペレーティング・システムに含まれる API でアプリケーションに暗号化サービスを提供。 | Windows* 7 |
C/C++ またはアセンブリーを使用する
AES アルゴリズムの既存の C/C++ またはアセンブリー実装がある場合は、標準的なコンパイラーで提供されている機能を利用することができます。その場合、関連するコードブロックを等価なインテル® AES-NI 命令に変更する必要があります。インテル® AES-NI 命令は、インライン・アセンブリーか、組込み関数と呼ばれる特別な関数を使って C/C++ から呼び出せます。各組込み関数は、新しい命令に対応しています。組込み関数を使用すると、インライン・アセンブリー言語の代わりに C/C++ の関数呼び出しと変数を使ってコーディングできます。
インテル® AES-NI をアセンブリー言語で使用する場合は、対応する命令をコードで直接呼び出せます。
以下のコンパイラーは、C/C++ とアセンブリーでインテル® AES-NI をサポートしています。
コンパイラー | 説明 | インテル® AES-NI 対応バージョン |
gcc/g++ | オープンソースの GNU C/C++ コンパイラー | 4.4 以降 |
インテル® C/C++ コンパイラー | C/C+ 向けインテル® コンパイラー | 11.1 以降 |
Microsoft* Visual C++* | Windows* 向け C/C++ コンパイラー | 2008 SP1 以降 |
関連情報 (英語)
[1] Advanced Encryption Standard (AES) – http://en.wikipedia.org/wiki/Advanced_Encryption_Standard [2] インテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP) Web ページ – http://software.intel.com/en-us/intel-ipp/ [3] インテル® AES-NI に関するホワイトペーパー – http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-aes-instructions-set [4] インテル® C/C++ コンパイラー – http://software.intel.com/en-us/intel-compilers/ [5] インテル® AES-NI サンプルのダウンロード – http://software.intel.com/en-us/articles/download-the-intel-aesni-sample-library [6] OpenSSL* ライブラリー – http://www.openssl.org/ [7] ホワイトペーパー「Securing the Enterprise with Intel® AES-NI」 – http://www.intel.com/Assets/en_US/PDF/whitepaper/323587.pdf [8] ホワイトペーパー「Breakthrough AES Performance with Intel® AES New Instructions」 – http://software.intel.com/sites/default/files/m/d/4/1/d/8/10TB24_Breakthrough_AES_Performance_with_Intel_AES_New_Instructions.final.secure.pdf1 Microsoft* CNG (Cryptography API: Next Generation) の古いバージョンである Microsoft* Crypto API は、インテル® AES-NI 向けに最適化されていません。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。