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"); } }