
Protectstar 拡張AES
ブロックサイズ:512ビット(64バイト)
鍵サイズ:128、256、512ビット(16、32、64バイト)(デフォルト256ビット)
動作モード:ECB、CBC、CFB、OFB、CTR(デフォルトCTR)
総ラウンド数:24
概要
本書は、固定長512ビットのブロック長および128、256、512ビットの3種類の鍵長を用いる当社の拡張AES暗号アルゴリズムの詳細を説明します。
1. 動機
標準のAESは128ビットのメッセージブロック長(つまり16バイト)と128ビットの鍵長を使用します。AESは192ビットおよび256ビットの鍵長もサポートしています。128/128(ブロック/鍵)の組み合わせでは、AESのメッセージブロックと鍵は4×4のマトリックスとして実現されます。各マトリックスのセルは1バイトを表し、16(4×4)セルで16バイト、すなわち128ビットとなります。
同様に、拡張AESではメッセージブロックとラウンド鍵を表現するために4×16のマトリックス(4:行数、16:列数)を使用します。拡張AESは元のAESのいくつかの特性や関数(例:ラウンド鍵の加算、列の混合など)をそのまま使用しますが、拡張AES特有の特性や関数(例:総ラウンド数、行のシフトなど)も存在します。
以下のセクションでは、元のAESおよび拡張AESで使用される関連する特性や関数について詳しく説明します。
2. 動作モード
元のAESがサポートするすべての動作モード(電子コードブック(ECB)、暗号ブロック連鎖(CBC)、暗号フィードバック(CFB)、出力フィードバック(OFB)、カウンター(CTR))は拡張AESでも実装されています。
3. 総ラウンド数
単一ブロックの暗号化および復号化には、元のAESアルゴリズムは合計10ラウンドの関数適用を行います。この10という数は以下の式で計算されます:
ラウンド数 = (鍵長またはブロック長をワード単位で表したもの) + 6
定数6は既知の暗号攻撃に基づきAES設計者により指定・固定されています。鍵長が256ビットの場合は14ラウンド(8+6)が必要となります。
拡張AESではブロック長が512ビットに固定されています。これは各ワードが4バイトなので16ワードとなります。上記の式に基づき総ラウンド数は22と計算されます。実際には次のセクションで説明するShiftRow操作により2ラウンド追加が必要となり、結果的に拡張AESは単一ブロックの暗号化および復号化に24ラウンドを適用します。
4. パディング
パディング操作はブロック暗号のメッセージブロックおよび鍵ブロックのパディングに一般的に用いられます。拡張AESではメッセージと鍵の両方にパディングが必要です。
4.1. メッセージパディング
入力メッセージの長さは拡張AESでは512の倍数である必要があります。パディング操作にはRFC 1321で説明されているパディング方式を採用します。この方式では、元の最後のメッセージビットの後に「1」ビットを挿入し、その後「0」ビットを付加して最後のメッセージブロックが512ビットの長さになるまで続けます。追加の「0」ビットを入れる余裕がなければ、新たな512ビットブロックをメッセージの末尾に追加します。
4.2. 鍵パディング
拡張AESは16、32、64バイトの鍵サイズをサポートします。鍵ブロックの初期化にはユーザーが入力したパスワードが使われます。パスワードの文字数が鍵ブロックを満たすのに足りない場合、不足分のバイトはゼロで埋められます。この単純なパディングは元のAESには十分ですが、拡張AESには不十分です。鍵サイズが64バイトの場合、パスワードが鍵ブロックの最初の10バイトのみで残り54バイトがゼロに割り当てられたとします。一方で、この初期鍵ブロックはラウンド鍵の生成に使われます。この場合、多数のラウンド鍵がゼロ値になる問題が発生します。これを防ぐために、拡張AESでは固定鍵を使ったCBCモードでゼロパディングされた鍵ブロックに対し元のAESの暗号化を実行し、その結果をラウンド鍵生成用のパディング鍵とします。これにより多くのゼロ値ラウンド鍵の生成を防ぎます。
5. ラウンド鍵生成
ラウンド鍵は前述の「鍵パディング」セクションで説明したパディング鍵ブロックから生成されます。元のラウンド鍵生成プロセス(Rijndaelブロック暗号仕様書15ページ参照)は拡張AES向けに若干変更されており、以下のアルゴリズムが使用されます:
KeyExpansion(byte Key[4*Nk] word W[Nb*(Nr+1)]) { for(i = 0; i < Nk; i++) W[i] = (key[4*i],key[4*i+1],key[4*i+2],key[4*i+3]); for(i = Nk; i < Nb * (Nr + 1); i++) { temp = W[i - 1]; if (i % Nk == 0 || (I % Nk==4 && Nk>6)) temp = SubByte(RotByte(temp)) ^ Rcon[i / Nk]; else if ((i % Nk == 8 || i % Nk == 12) && Nk>6) temp = SubByte(temp); W[i] = W[i - Nk] ^ temp; } }
6. 関数
元のAESは主に4つの主要な関数を使用します。これらはメッセージブロックとラウンド鍵間のXOR加算操作(AddRoundKey)、Sbox参照(SboxSubstitution)、行のシフト(ShiftRow)、およびマトリックス内の各列の混合(MixColumn)です。
1.1.1. AddRoundKey
ラウンド鍵加算処理は元のAESと拡張AESで違いはありません。
1.1.2. SboxSubstitution
Sbox参照処理も元のAESと拡張AESで同一です。
1.1.3. ShiftRow
行のシフト処理は元のAESと拡張AESで異なります。元のAESは行シフトに{0,1,2,3}のオフセットを適用します。これはShiftRow操作において、第一行のバイトはシフトしない、第二行のバイトは1バイト左へ(暗号化時)、第三行のバイトは2バイト左へ、最後の行のバイトは3バイト左へシフトすることを意味します。ShiftRow操作はAESの各ラウンドで適用され、2ラウンド後にはShiftRowとMixColumn操作の組み合わせによりマトリックス全体に完全な拡散が実現されます。つまり、2ラウンド後には各セルが他のすべてのセルの値に影響を与えます。
しかし、拡張AESに{0,1,2,3}のオフセットを適用すると、完全な拡散は2ラウンドではなく5ラウンド後に達成されます。したがって、より少ないラウンドで完全な拡散を提供する適切なシフトオフセットを見つける必要があります。この目的のため、当社はプログラム(com.crypt.test.OptimumShiftRow.java、配布ソースコード参照)を書き、最適なシフトオフセットを計算しました。結果として、拡張AESの完全な拡散は4ラウンド後にしか達成されないことがわかりました。4ラウンドで完全な拡散を提供する候補が多数あり、その中で{0,1,4,5}のオフセットを拡張AESに採用しました。
1.1.4. MixColumn
MixColumn操作は元のAESと拡張AESで同じです。元のAESでは列数は4ですが、拡張AESでは16列あります。
ソースコードのダウンロード:
Protectstar Extended AES Algorithm (230kb / PDF)
- AES: http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
- Modes of Operation: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
- PKCS #5 v2.1: Password-Based Cryptography Standard (RSA Laboratories, October 5, 2006): ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2_1.pdf