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]
<< ホーム