Advanced Encryption Standard (AES)

Advanced Encryption Standard (AES)

Advanced Encryption Standard (AES) は、DESに代わる新しい標準暗号となる共通鍵暗号アルゴリズム。 DES(Data Encryption Standard)は56ビットの鍵長が短すぎて安全でない為、新たに鍵長は128ビット・192ビット・256ビットの3つが利用できるAESが策定された。

暗号利用モード

AESは固定長のデータ(ブロックと呼ぶ)を単位として処理するブロック暗号で、ブロック長よりも長いメッセージを暗号化するメカニズム(暗号利用モード)を指定する必要がある。

暗号利用モードの種類

  • Electronic Codebook (ECB)
  • Cipher Block Chaining (CBC)
  • Propagating Cipher Block Chaining (PCBC)
  • Cipher Feedback (CFB)
  • Output Feedback (OFB)

ECB

鍵のみで暗号化する。同一鍵で同一の平文を暗号化すると同一の暗号文になる。
暗号文の比較によって解析しやすい為、安全性が低く、他のモードが必要となった。

// 暗号化キーのオブジェクト生成
SecretKeySpec key = new SecretKeySpec(byteKey, "AES");

// Cipherオブジェクト生成
// 暗号化アルゴリズム/暗号利用モード/パディング方式
// 暗号利用モード・・・ブロック長よりも長いメッセージを暗号化するメカニズム
// パディング方式・・・ロック長に満たない場合の補完の方式
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

// Cipherオブジェクトの初期化
cipher.init(Cipher.ENCRYPT_MODE, key);

// 暗号化の結果格納
byte[] byteResult = cipher.doFinal(byteText);

CBC

鍵と初期化ベクトルを元に暗号化する。
初期化ベクトルが異なれば同一鍵で同一の平文を暗号化しても同一の暗号文にならない(鍵と初期化ベクトルが同一なら同一の暗号文になる)。
鍵は非公開である必要があるが、初期化ベクトルは公開しても問題ない。
また、復号化する際は暗号化時に利用した初期化ベクトルと同じものを利用する必要がある。

// 暗号化キーと初期化ベクトルのオブジェクト生成
SecretKeySpec key = new SecretKeySpec(byteKey, "AES");
IvParameterSpec iv = new IvParameterSpec(byteIv);

// Cipherオブジェクト生成
// 暗号化アルゴリズム/暗号利用モード/パディング方式
// 暗号利用モード・・・ブロック長よりも長いメッセージを暗号化するメカニズム
// パディング方式・・・ロック長に満たない場合の補完の方式
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

// Cipherオブジェクトの初期化
cipher.init(Cipher.ENCRYPT_MODE, key, iv);

// 暗号化の結果格納
byte[] byteResult = cipher.doFinal(byteText);