Javaで共通鍵暗号方式で暗号化を行うやりかたです。AES暗号化には AES/ECB/ISO10126Padding AES/ECB/PKCS5Padding AES/CBC/ISO10126Padding AES/CBC/PKCS5Padding などがありますが以下のサンプルは AES/ECB/PKCS5Padding で暗号化をしています。 サンプルコード †import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.security.AlgorithmParameters; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class EncryptSample { public static void main(String[] args) throws Exception { String key = "aaaaaaaaaabbbbbb"; // <-128bitのキー byte[] keyBytes = key.getBytes(); // バイト列に変換 byte[] enBytes = EncryptSample.encryptECB("abcdefg hijklmn".getBytes(), keyBytes); // "abcdefg hijklmn" という文字を共通鍵で暗号化 // System.out.println(new String(enBytes)); byte[] deBytes = EncryptSample.decryptECB(enBytes, keyBytes); // 共通鍵暗号化なので、同じカギで復号できる System.out.println(new String(deBytes)); // 暗号化したデータをBase64してみる byte[] bs = Base64.encodeBase64(enBytes, false); System.out.println(new String(bs)); } public static byte[] encryptECB(byte[] data, byte[] secret_key) { SecretKeySpec sKey = new SecretKeySpec(secret_key, "AES"); try { Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, sKey); return cipher.doFinal(data); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return new byte[0]; } public static byte[] decryptECB(byte[] encData, byte[] secret_key) { SecretKeySpec sKey = new SecretKeySpec(secret_key, "AES"); try { Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, sKey); return cipher.doFinal(encData); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return new byte[0]; } } 実行結果は以下の通り abcdefg hijklmn zhzF4Q/BcnoKCWruBNWcsg== 共通鍵をランダムに生成する †上のように明示的に指定して共通鍵を作ることもできるし、ランダムに鍵を生成することもできます。 private static Key genKey() throws NoSuchAlgorithmException { KeyGenerator generator = KeyGenerator.getInstance("AES"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); generator.init(128, random); Key key = generator.generateKey(); return key; } このキークラスから byte[] keyBytes = key.getEncoded(); とやってキーのバイト列を取得することができます。このバイト列をファイルに保存しておけば鍵ファイルができます。 Utils.byte2File(keyBytes, "hoge.key"); この記事は 現在のアクセス:59551 |