#author("2021-12-14T01:53:31+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(おもしろかった[51],そうでもない[6])
#vote(おもしろかった[64],そうでもない[6])


#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS