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