Home
Java
Java AES 암호화 (128/192/256)
devfoxstar
devfoxstar
May 06, 2023
1 min

Table Of Contents

01
SecretKey
02
IV
03
Cipher
04
Base64
05
전체 코드

Java에서 자주 쓰는 AES 암호화를 알아보겠습니다.
AES는 양방향으로 복호화가 가능하고, 길이에 따라 복잡도를 높일 수 있습니다.

SecretKey


SecretKey는 암호화에 사용되는 고유한 키입니다.
세가지 길이로 설정할 수 있고, 그 외에는 오류가 발생합니다.

  • AES128 = 16 bytes
  • AES192 = 24 bytes
  • AES256 = 32 bytes
import javax.crypto.spec.SecretKeySpec;

private final String key = "devfoxstarsecret";

SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");

IV


Initialization Vector로 초기화 벡터를 지정합니다.

import javax.crypto.spec.IvParameterSpec;

private final String iv = new IvParameterSpec(new byte[16]);

Cipher


암호화 객체를 생성하고 초기화를 진행합니다.
먼저 암호화 방식을 설정 합니다.

  • AES/ECB/PKCS5PADDING

    • SecretKey
    • PlainText
    • Cipher
    • CipherText
  • AES/CBC/PKCS5PADDING

    • SecretKey
    • IV
    • PlainText
    • Cipher
    • CipherText

다음으로 암/복호화 모드를 지정합니다.

  • Cipher.ENCRYPT_MODE
  • Cipher.DECRYPT_MODE
import javax.crypto.Cipher;

private final String algorithm = "AES/CBC/PKCS5Padding";

Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv);

Base64


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

Tags

#Java#AES#AES256#Cipher

Related Posts

Java - Record class (불변 데이터 객체 만들기)
June 11, 2024
1 min
© 2024, All Rights Reserved.

Quick Links

About Me

Media