앙되요

[javascript & java] aes 암호화. javascript 암호화 java 복호화 본문

Ajax & Javascript & JSP

[javascript & java] aes 암호화. javascript 암호화 java 복호화

앙되요 2015. 7. 24. 10:20
미리 자바스크립트 라이브러리 
http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js
이걸 다운 받는다. 아니면 js에 바로 선언해도 되고.


<javascript>


var key = CryptoJS.enc.Hex.parse('01010101010101010101010101010101');

var iv = CryptoJS.enc.Hex.parse('01010101010101010101010101010101');


var encrypted1 = CryptoJS.AES.encrypt(f.a.value, key, { iv: iv });

f.a.value = encrypted1;


위 내용을 보면 010101 -> 이부분은 키값의 16진수 byte[] 형이다. 키값을 16진수로 변환하여 직접 넣어야 문제가 없다.

또한 aes 암호화는 128, 192, 256비트인 키를 사용하기에  키값은 16자리의 문자를 변환하여 사용하여야 한다.

저렇게 해서 form태그 중 a 파라미터로 암호화된 값이 java쪽으로 넘어가게 된다.

참고로 암호회된 encrypted1 값은 base64 encode 되어있다.


<java>


...중략


EnCryto.Decrypt(request.getParameter("a"));


...중략



final static String KEY = "01010101... => 이것의 원래 문자키값";


     public static String Decrypt(String text) throws Exception

     {

           Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

           byte[] b= KEY.getBytes("euc-kr");

           

           SecretKeySpec keySpec = new SecretKeySpec(b, "AES");

           AlgorithmParameterSpec ivSpec = new IvParameterSpec(b);

           

           cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec);

           BASE64Decoder decoder = new BASE64Decoder();

           

           byte[] results = cipher.doFinal(decoder.decodeBuffer(text));

           return new String(results);

     }


이렇게 해주면 javascript에서의 aes 암호화를 복호화 할수 있다.

참고로 byte[] -> string -> byte[] 변환시 자바에서는 버그가 있어서 제대로 된 값이 나오지 않는다고 한다;

이것때문에 얼마나 고생한지..

암튼 완성! 잘된다!