2011年8月5日金曜日

Javaによる暗号化・複合化についての云々

今回はなんか釈然としないことについて.
Cipherクラスを使った暗号化・複合化を行う際,故意に暗号化したものとは違う鍵で複合化したとする.
そうすると何故かBadPaddingExceptionを返してくれる.
しかもエラーの内容は「Given final block not properly padded」とか言いやがります.もちろん暗号化する際にはpaddingしているにもかかわらず.毎回こんな風になるんならPaddingする意味って何なのさ!

一応今回テストで作ったプログラムを以下に記載.
AES+ECB+PKCS5Paddingの組み合わせで暗号化・複合化を行うもの.
public static void main(String[] args) {
  String data = "encryption and decryption test";
  String key = "aaaaa";
  byte[] enc = encrypt(data.getBytes(), key);
  String dec1 = new String(decrypt(enc, key));
  System.out.println(dec1);
  key = "bbbbb";
  String dec2 = new String(decrypt(enc, key));
  System.out.println(dec2);
 }

 private static byte[] encrypt(byte[] data, String key) {
  byte[] res = null;
  try {
   MessageDigest mg = MessageDigest.getInstance("MD5");
   mg.update(key.getBytes());
   SecretKeySpec sks = new SecretKeySpec(mg.digest(), "AES");
   Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
   cipher.init(Cipher.ENCRYPT_MODE, sks);
   byte[] encrypted = cipher.doFinal(data);
   res = encrypted;
  } 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 res;
 }

 private static byte[] decrypt(byte[] data, String key) {
  byte[] res = null;
  try {
   MessageDigest mg = MessageDigest.getInstance("MD5");
   mg.update(key.getBytes());
   SecretKeySpec sks = new SecretKeySpec(mg.digest(), "AES");
   Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
   cipher.init(Cipher.DECRYPT_MODE, sks);
   byte[] encrypted = cipher.doFinal(data);
   res = encrypted;
  } 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 res;
 }

ラベル: ,

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

<< ホーム