노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.


AES , 암호화(encryption) / 복호화(decryption)




말레이시아 Payment Gateway업체 연동중에 구현...



-- Wiki ( 나무위키, Wikipedia )


Advance Encryption Standard, 벨기에의 2명의 암호학자가 만든 알고리즘이며,

NIST(National Institute for Standard and Testing)가 제정하고, 미국 정부가 채택한 후 확산.



대칭 암호화 표준규격으로, HW와 SW 양쪽에 효율적이도록 디자인 되었다

지원하는 Block 길이는 128 bits, 192bits, 256 bits이다




PHP, Java 예제 소스



아래 암호화 결과는 문자의 코드화로 생기는 문제로 인해서 base64로 부호화된다.



http://aesencryption.net/ (128 bits )



http://boxfoxs.tistory.com/270 (128 bits)





Java에서 Base64 codec으로 commons.apache.org의 Components->Codec받기


위치 : http://commons.apache.org/proper/commons-codec/


최신 버젼 : http://commons.apache.org/proper/commons-codec/download_codec.cgi





JavaScript 예제 소스



http://ironnip.tistory.com/80 (128 bits)




256 bits


import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

/**
 *  
 * 
 * 
 * HashValue.java
 * 
* @author admin * @date 2016. 10. 26. * @Version : 0.1 */ public class HashValue { private SecretKeySpec secretKey = null; private String encryptString = ""; public void setKey(String myKey) throws UnsupportedEncodingException, NoSuchAlgorithmException { byte[] key1 = null; byte[] keyDigest; MessageDigest sha = null; // Set Key key1 = myKey.getBytes("UTF-8"); System.out.println("setKey.key1.length = " + key1.length ); // SHA-256 sha = MessageDigest.getInstance("SHA-256"); keyDigest = sha.digest(key1); setSecretKey ( new SecretKeySpec(keyDigest,"AES") ); } public String encryption( String unhashedValue ) { Cipher cipher = null; try { cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); if ( secretKey == null ) { System.out.println("encryption.SecretKey is not ready."); return ""; } cipher.init(Cipher.ENCRYPT_MODE, getSecretKey()); setEncryptString ( Base64.encodeBase64String ( cipher.doFinal( unhashedValue.getBytes("UTF-8") )) ); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } 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 encryptString; } public String getEncryptString() { return encryptString; } private void setEncryptString(String encryptString) { this.encryptString = encryptString; } private SecretKeySpec getSecretKey() { return secretKey; } private void setSecretKey(SecretKeySpec secretKey) { this.secretKey = secretKey; } }

* AES에서는 기본값으로 128 bits 키를 지원하며, 만약에 192 bits 또는 256 bits의 key를 사용하게 되면, java 컴파일러는 illegal key size, invalid key exception을 일으킨다.


java.security.InvalidKeyException: Illegal key size or default parameters
 at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
 at javax.crypto.Cipher.implInit(Cipher.java:801)
 at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
 at javax.crypto.Cipher.init(Cipher.java:1249)
 at javax.crypto.Cipher.init(Cipher.java:1186)


해결 방법은 JCE( Java Cryptography Extension)을 JRE version(Java 6,7,8)에 맞게 다운로드 해야 하고,

1) local_policy.jar와 2) US_export_policy.jar를

/jre/lib/security위치의 파일과 교체해야 한다.


-- 관련 이슈 논의글

http://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters



--  jce-7-download


--  jce-8-download

블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,