「Java」AESの暗復号サンプル

AESの暗復号サンプルを書いてみたので、メモしておきます。

■ AESTest.java

import java.security.Key;
import java.util.Random;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AESTest {
  public static void main(String[] args) throws Exception {
    String data = "abcdef";
    
    Key key = genKey();
    IvParameterSpec iv = getIV();
    
    byte[] enc = encrypt(data, key, iv);
    byte[] dec = decrypt(enc, key, iv);
    
    System.out.println(new String(enc));
    System.out.println(new String(dec));
  }

  private static Key genKey() {
    byte[] b = new byte[16];
    Random r = new Random();
    r.nextBytes(b);
    return new SecretKeySpec(b, "AES");
  }
  
  private static IvParameterSpec getIV() {
    byte[] b = new byte[16];
    Random r = new Random();
    r.nextBytes(b);
    return new IvParameterSpec(b);
  }
  
  private static byte[] encrypt(String data, Key key, IvParameterSpec iv) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key, iv);
    return cipher.doFinal(data.getBytes());
  }

  private static byte[] decrypt(byte[] data, Key key, IvParameterSpec iv) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, key, iv);
    return cipher.doFinal(data);
  }
}


・Cipher (Java Platform SE 8 )
https://docs.oracle.com/javase/jp/8/api/javax/crypto/Cipher.html

・Random (Java Platform SE 8 )
http://docs.oracle.com/javase/jp/8/api/java/util/Random.html

・SecretKeySpec (Java Platform SE 8 )
http://www.katsuster.net/javase/jp/8/docs/api/javax/crypto/spec/SecretKeySpec.html

・IvParameterSpec (Java Platform SE 8 )
https://docs.oracle.com/javase/jp/8/api/javax/crypto/spec/IvParameterSpec.html


共通鍵、初期化ベクトル ( IV ) どちらも Random クラスから生成した乱数を使ってコード中で生成している感じです。暗号モードは CBC、パディング方式は PKCS5 としています。

今回は同じコード内で暗復号しているので秘密鍵、IV は使い捨てていますが、別環境の場合は復号側にこれらを渡してあげないといけないのでそれ用にファイルに書き出しておくなりが必要になります ( IV は暗号化したバイト列の先頭にくっつけたりでも )。

あと、共通鍵の鍵長は Java のデフォルトで対応している 128 bit としていますが、256 bit なりの鍵を使いたい場合は以下で提供されているポリシーファイルが必要になります。local_policy.jar と US_export_policy.jar の配置先は JDK の場合 %JAVA_HOME%\jre\lib\security になります。

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8 Download
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html


以上です。

[ 環境情報 ]
Windows 7 SP1
Java SE 8 Update 25