インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

概要: キャリーなし乗算命令および AES (Advanced Encryption Standard) 命令用の組込み関数

インテル® C++ コンパイラーでは、キャリーなし乗算を行う組込み関数と、AES (Advanced Encryption Standard) 規格に基づいた暗号化を行う組込み関数が提供されています。キャリーなし乗算組込み関数は、新しい命令 PCLMULQDQ に対応します。AES 拡張組込み関数は、AES 拡張命令に対応します。

AES 拡張命令と PCLMULQDQ 命令の XMM ステートサポートおよび SIMD (single-instruction multiple data) 浮動小数点例外サポートのソフトウェア要件は、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、インテル® ストリーミング SIMD 拡張命令 3 補足命令 (インテル® SSSE3)、インテル® ストリーミング SIMD 拡張命令 4 (インテル® SSE4) と同じです。

32nm プロセス技術で製造されるインテル®64 対応プロセッサーは、AES 拡張命令および PCLMULQDQ 命令をサポートしています。

AES 暗号化および暗号処理

AES 暗号化には、128 ビットの入力データ (プレーンテキスト) を 128 ビットの暗号化されたブロック (暗号文) にする、有限数の反復処理が含まれています。この処理を AES ラウンドと呼びます。暗号解読は、"Inverse Cipher" の代わりに "Equivalent Inverse Cipher" を使用して、この反復処理を逆方向に行います。

各ラウンドの暗号処理には、"状態" と "ラウンドキー" という 2 つの入力データがあります。"ラウンドキー" はラウンドごとに異なります。ラウンドキーは、"キー・スケジュール" アルゴリズムを使用して暗号鍵から生成されます。"キー・スケジュール" アルゴリズムは、暗号/復号のデータ処理から独立しており、暗号/復号フェーズとは別に実行することができます。

AES 規格では、128、192、および 256 ビットの暗号鍵をサポートしています。暗号鍵のサイズは、それぞれ 10、12、および 14 ラウンドの反復に対応しています。

キャリーなし乗算命令および AES 拡張命令

PCLMULQDQ 命令は、最大 64 ビットの 2 つの 2 進数のキャリーなし乗算を実行します。

AES 拡張には次のものが含まれます。

命令のサポートの検出

アプリケーションで PCLMULQDQ や AES 拡張命令を使用する前に、プロセッサーでその命令がサポートされているかどうかを調べる必要があります。

PCLMULQDQ 命令がサポートされているかどうかを調べるには、アプリケーションで次のことを確認する必要があります。

CPUID.01H:ECX.PCLMULQDQ[bit 1] = 1.

AES 拡張命令がサポートされているかどうかを調べるには、アプリケーションで次のことを確認する必要があります。

CPUID.01H:ECX.AES[bit 25] = 1.

SSE ステートをサポートしているオペレーティング・システムは、AES 拡張命令および PCLMULQDQ 命令を使用するアプリケーションもサポートしています。