Java에서 자주 쓰는 AES 암호화를 알아보겠습니다.
AES는 양방향으로 복호화가 가능하고, 길이에 따라 복잡도를 높일 수 있습니다.
SecretKey는 암호화에 사용되는 고유한 키입니다.
세가지 길이로 설정할 수 있고, 그 외에는 오류가 발생합니다.
import javax.crypto.spec.SecretKeySpec; private final String key = "devfoxstarsecret"; SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
Initialization Vector로 초기화 벡터를 지정합니다.
import javax.crypto.spec.IvParameterSpec; private final String iv = new IvParameterSpec(new byte[16]);
암호화 객체를 생성하고 초기화를 진행합니다.
먼저 암호화 방식을 설정 합니다.
AES/ECB/PKCS5PADDING
AES/CBC/PKCS5PADDING
다음으로 암/복호화 모드를 지정합니다.
import javax.crypto.Cipher; private final String algorithm = "AES/CBC/PKCS5Padding"; Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv);
Base64 인코딩/디코딩을 진행합니다.
Java 1.8 이상
import java.util.Base64;
public String encrypt(String s) throws Exception {
return Base64.getEncoder().encodeToString(encrypted);
}
public String decrypt(String s) throws Exception {
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(s));
}
Java 1.7 이하
import org.apache.commons.codec.binary.Base64;
public String encrypt(String s) throws Exception {
return new String(Base64.encodeBase64(encrypted));
}
public String decrypt(String s) throws Exception {
byte[] decrypted = cipher.doFinal(Base64.decodeBase64(s));
}
package devfoxstar.util;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESCipher {
private final String algorithm = "AES/CBC/PKCS5Padding";
private final String key = "devfoxtarsecret";
private final String iv = new IvParameterSpec(new byte[16]);
public String encrypt(String s) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv);
byte[] encrypted = cipher.doFinal(s.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encrypted);
}
public String decrypt(String s) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv);
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(s));
return new String(decrypted, "UTF-8");
}
}