AES256 암호화
AES (Advanced Encryption Standard) 는 미국 표준 기술 연구소(NIST)에 의해 제정된 대칭키 암호화 방식입니다. Easypay는 보안 수준을 높이기 위해 256비트 키 길이를 사용하는 AES256-CBC 방식을 사용하여 가맹점의 중요 데이터를 안전하게 보호합니다.
🔐 암호화 규격 (Specification)
제공되는 Key와 IV는 보안을 위해 Base64로 인코딩되어 있으므로, 사용 시 반드시 디코딩 절차를 거쳐야 합니다.
| 구분 | 설정값 | 비고 |
|---|---|---|
| 알고리즘 | AES | 대칭키 암호화 표준 |
| 운영 모드 | CBC | Cipher Block Chaining |
| 키 길이 | 256 bit | 32 Byte (디코딩 후 기준) |
| 패딩 (Padding) | PKCS7Padding | PKCS5Padding과 호환 가능 |
| 인코딩 | UTF-8 | 문자열 처리 기준 |
| 출력 형식 | Base64 | 암호화된 데이터를 전송하기 위한 포맷 |
| IV (Base64) | "a2ljY2Vhc3lwYXkyMDE4IQ==" | "kicceasypay2018!"의 Base64 값 |
| Key (Base64) | 가맹점 Secret Key | 영업담당자에게서 발급받은 Base64 인코딩 키 |
주의사항
- Secret Key와 IV는 영업담당자에게 요청하시면 신속하게 제공받을 수 있습니다.
- 제공받은 Secret Key와 IV 문자열을 그대로 바이트로 변환하지 말고, 반드시 Base64 Decode를 수행한 뒤 암호화 엔진에 입력해야 합니다.
💻 언어별 구현 예제
- Java
- Node.js
- Python
- PHP
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AesUtil {
public static String encrypt(String plainText, String base64Key, String base64Iv) throws Exception {
// 1. Base64 인코딩된 Key와 IV를 디코딩하여 바이트 배열 획득
byte[] keyBytes = Base64.getDecoder().decode(base64Key);
byte[] ivBytes = Base64.getDecoder().decode(base64Iv);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
// 2. AES/CBC/PKCS5Padding 설정 (Java 표준)
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
// 3. 최종 결과물 Base64 인코딩
return Base64.getEncoder().encodeToString(encrypted);
}
}
const crypto = require('crypto');
function encryptAES256(plainText, base64Key, base64Iv) {
// 1. Base64 문자열을 Buffer(바이트 배열)로 변환
const key = Buffer.from(base64Key, 'base64');
const iv = Buffer.from(base64Iv, 'base64');
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encrypted = cipher.update(plainText, 'utf8', 'base64');
encrypted += cipher.final('base64');
return encrypted;
}
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
def encrypt_aes256(plain_text, base64_key, base64_iv):
# 1. Base64 디코딩
key_bytes = base64.b64decode(base64_key)
iv_bytes = base64.b64decode(base64_iv)
data_bytes = plain_text.encode('utf-8')
cipher = AES.new(key_bytes, AES.MODE_CBC, iv_bytes)
# 2. PKCS7 패딩 후 암호화
encrypted_bytes = cipher.encrypt(pad(data_bytes, AES.block_size))
# 3. Base64 인코딩 반환
return base64.b64encode(encrypted_bytes).decode('utf-8')
<?php
function encryptAES256($plainText, $base64Key, $base64Iv) {
// 1. Base64 디코딩하여 원본 바이트 데이터 획득
$key = base64_decode($base64Key);
$iv = base64_decode($base64Iv);
// 2. openssl_encrypt 호출 (OPENSSL_RAW_DATA 옵션으로 바이너리 결과 획득)
$encrypted = openssl_encrypt(
$plainText,
'aes-256-cbc',
$key,
OPENSSL_RAW_DATA,
$iv
);
// 3. 결과를 Base64로 인코딩하여 반환
return base64_encode($encrypted);
}
?>