Java AES 256 暗合・複合

過去に何度も書いた Java AES 暗合・複合
秘密鍵、初期ベクトルをどう作成するか、いろんな方法あるが、
改めて、256bit で、SHA-256 ハッシュ値を使う方法。

暗合

public static String encrypt(String passwd, String message){
   try{
      byte[] key = passwd.getBytes();
      MessageDigest sha = MessageDigest.getInstance("SHA-256");
      key = sha.digest(key);
      key = Arrays.copyOf(key, 32);
      SecretKeySpec keyObj = new SecretKeySpec(key, "AES");
      IvParameterSpec ivObj = new IvParameterSpec(Arrays.copyOf(key, 16));
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
      cipher.init(Cipher.ENCRYPT_MODE, keyObj, ivObj);
      byte[] byteCipherText = cipher.doFinal(message.getBytes());
      return Base64.getEncoder().encodeToString(byteCipherText);
   }catch(Exception e){
      throw new RuntimeException(e);
   }
}

複合

public static String decrypt(String passwd, String cryptText){
   try{
      byte[] key = passwd.getBytes();
      MessageDigest sha = MessageDigest.getInstance("SHA-256");
      key = sha.digest(key);
      key = Arrays.copyOf(key, 32);
      SecretKeySpec keyObj = new SecretKeySpec(key, "AES");
      IvParameterSpec ivObj = new IvParameterSpec(Arrays.copyOf(key, 16));
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
      cipher.init(Cipher.DECRYPT_MODE, keyObj, ivObj);
      byte[] cipherBytes = Base64.getDecoder().decode(cryptText);
      byte[] byteDecryptedText = cipher.doFinal(cipherBytes);
      return new String(byteDecryptedText);
   }catch(Exception e){
      throw new RuntimeException(e);
   }
}

Java8では、このままでは、java.security.InvalidKeyException: Illegal key size
となってしまうので、
JCEポリシーの制限を無くすために下記から policy の JAR をダウンロード
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8 Download

jre/lib/security の下の
local_policy.jar
US_export_policy.jar

を置き換える。

Java9 では、

      Security.getProperty("crypto.policy");

の結果が、 unlimited  であるので、Java8のように置き換えは不要。

Security.setProperty("crypto.policy", "limited")

を実行すれば、制限かかって、InvalidKeyException になる。