AES , 암호화(encryption) / 복호화(decryption)
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
'Web Tech. > Spring Framework' 카테고리의 다른 글
java.util Collection Framework (0) | 2016.11.14 |
---|---|
에러 : java.lang.IllegalArgumentException: Document base (2) | 2016.11.11 |
메모리 누수, Memory Leak (0) | 2016.09.27 |
Spring Boot 소개 (3) - JPA , MySQL (1) | 2016.09.22 |
Spring Boot 소개 (2) - Actuator (0) | 2016.09.22 |