Top / Java / 暗号化

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");

Utilsについてはこちら


この記事は

選択肢 投票
おもしろかった 21  
そうでもない 4  

Top / Java / 暗号化

現在のアクセス:59195


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