#author("2020-03-12T08:56:09+00:00","","") // 下階層用テンプレート #topicpath ---- //ここにコンテンツを記述します。 Javaで共通鍵暗号方式で暗号化を行うやりかたです。AES暗号化には AES/ECB/ISO10126Padding AES/ECB/PKCS5Padding AES/CBC/ISO10126Padding AES/CBC/PKCS5Padding などがありますが以下のサンプルは AES/ECB/PKCS5Padding で暗号化をしています。 ** サンプルコード [#p4ca86cb] 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== ** 共通鍵をランダムに生成する [#w3b5839b] 上のように明示的に指定して共通鍵を作ることもできるし、ランダムに鍵を生成することもできます。 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"); [[Utilsについてはこちら>Java/TIPS集#xf90100f]] -[[共通鍵暗号化と復号>http://www1.u-netsurf.ne.jp/~ysk-net/JSpe/Java/Security/SymmetricCrypto.html]] -[[共通鍵の生成>http://www1.u-netsurf.ne.jp/~ysk-net/JSpe/Java/Security/GenSymmetricKey.html]] ---- この記事は #vote(おもしろかった[52],そうでもない[6]) #comment #topicpath SIZE(10){現在のアクセス:&counter;}