AES 텍스트를 복호화하는 방법
- 복호화가 선택되어 있고 예시가 이미 들어 있습니다. 예시의 비밀번호는
correct horse battery staple이므로 먼저 성공하는 과정을 볼 수 있습니다. - 암호화된 Base64에 문자열을 붙여넣으세요. 표준 Base64와 URL-safe Base64 모두 되고,
=가 있어도 없어도 되며, 줄 바꿈은 무시됩니다. - 키 유형이 비밀번호라면 비밀번호를 입력하고, 보낸 사람이 바꿨다면 같은 PBKDF2 반복 횟수(기본값 310,000)도 입력하세요. 원시 키라면 16, 24 또는 32바이트 키를 Base64나 hex로 붙여넣으세요.
- 복호화를 누르거나 비밀번호 칸에서 Enter를 누르세요. 메시지가 복호화된 텍스트에 나타납니다. 내용이 UTF-8 텍스트가 아니면 Base64로 표시되고, 다운로드로 원래 바이트를 저장할 수 있습니다.
성공하면 “복호화 및 인증 완료"라고 표시됩니다. GCM 태그가 일치했다는 뜻이므로, 텍스트는 보낸 사람이 암호화한 그대로입니다.
Base64 복호화인가, Base64 디코딩인가
평범한 Base64 문자열을 갖고 “Base64 복호화"를 검색하는 사람이 많습니다. Base64는 키가 없는 인코딩이므로 이런 문자열은 디코딩만 하면 되고, 그 일은 Base64 디코더가 합니다. 간단히 구분하는 방법이 있습니다. 디코딩했을 때 읽을 수 있는 텍스트나 알아볼 수 있는 파일이 나오면 처음부터 암호화되지 않은 것입니다. 무작위처럼 보이는 바이트가 나오고 누군가 비밀번호를 줬다면 암호문이며, 아래 형식으로 만든 것이라면 이 페이지에서 복호화할 수 있습니다. 차이는 Base64는 암호화가 아닙니다에서 설명합니다.
알려진 값으로 테스트하기
아래 문자열은 형식 문서에 있는 Python encrypt() 함수와 비밀번호 correct horse battery staple로 브라우저 밖에서 암호화한 것입니다.
SD8wB+5V2GRfupy/yEY1xTUE8d5z9fwbzQ0gxeRzbtym1I4O7A9Q2NYnbYxEPYgvwJ4Q7DU5q/sugOx+B1Ro3ujkDXvnl/y2XYuji9A=
복호화하면 Meet me at the usual place at 10.이 나옵니다. 104자는 77바이트로 디코딩되며, 솔트 16, IV 12, 암호문 33, 태그 16바이트로 나뉩니다. 결과 아래의 내역에는 붙여넣은 어떤 문자열이든 같은 방식으로 나눈 값이 표시됩니다.
오류 메시지와 의미
| 메시지 | 흔한 원인 |
|---|---|
| 복호화 실패: 비밀번호나 키가 틀렸거나, 모드가 틀렸거나, 데이터가 변경되었습니다 | 틀린 비밀번호, 다른 반복 횟수, 비밀번호용 암호문에 원시 키를 쓰거나 그 반대, 복사 중 문자 누락 |
| 이 도구로 만든 암호문이라기에는 너무 짧습니다 | 문자열이 잘렸거나 아예 이 도구로 만든 것이 아님 |
| AES 키는 16, 24 또는 32바이트여야 합니다 | 원시 키의 길이가 틀림. Base64인지 hex인지 확인 |
| 이 브라우저는 192비트 AES 키를 지원하지 않습니다 | Chrome과 Edge는 128비트와 256비트 키만 허용. Python이나 Node.js로 복호화 |
| 반복 횟수는 1,000에서 10,000,000 사이여야 합니다 | 반복 횟수 칸에 불가능한 값이 들어 있음 |
GCM은 틀린 비밀번호와 변조된 데이터를 구분하지 않습니다. 어느 경우든 태그가 일치하지 않아 아무것도 출력되지 않습니다. CBC처럼 인증이 없는 모드는 오류 대신 엉터리 데이터를 돌려줄 수 있습니다.
이 도구로 열 수 없는 문자열
이 도구의 형식은 고정되어 있습니다. 비밀번호를 쓰면 Base64( salt[16] ‖ iv[12] ‖ ciphertext ‖ tag[16] ), 원시 키를 쓰면 Base64( iv[12] ‖ ciphertext ‖ tag[16] )이고, AES-GCM과 310,000회 반복하는 PBKDF2-HMAC-SHA256을 사용합니다. 다른 도구는 다른 형식으로 쓰며, 앞 몇 글자만 봐도 알아볼 수 있는 경우가 많습니다.
| 시작 부분 | 만든 도구 | 복호화 방법 |
|---|---|---|
U2FsdGVkX1 | 패스프레이즈를 쓴 openssl enc 또는 CryptoJS(Salted__ 헤더) | 원래 암호와 KDF 옵션으로 openssl enc -d -a |
gAAAAA | Fernet 토큰(Python cryptography) | Fernet(key).decrypt(token) |
-----BEGIN PGP MESSAGE----- | OpenPGP | gpg --decrypt |
-----BEGIN AGE ENCRYPTED FILE----- | age | age --decrypt |
알아볼 수 있는 시작 부분은 자주 보는 Base64 접두사에 더 모아 두었습니다.
Node.js와 Python에서 복호화하기
같은 형식은 브라우저 없이도 쓸 수 있습니다. Node.js에서는 다음과 같습니다.
const crypto = require("crypto");
function decrypt(b64, password) {
const data = Buffer.from(b64, "base64");
const salt = data.subarray(0, 16), iv = data.subarray(16, 28);
const tag = data.subarray(data.length - 16), ct = data.subarray(28, data.length - 16);
const key = crypto.pbkdf2Sync(password, salt, 310000, 32, "sha256");
const d = crypto.createDecipheriv("aes-256-gcm", key, iv);
d.setAuthTag(tag);
return Buffer.concat([d.update(ct), d.final()]).toString("utf8");
}
function encrypt(text, password) {
const salt = crypto.randomBytes(16), iv = crypto.randomBytes(12);
const key = crypto.pbkdf2Sync(password, salt, 310000, 32, "sha256");
const c = crypto.createCipheriv("aes-256-gcm", key, iv);
const ct = Buffer.concat([c.update(text, "utf8"), c.final()]);
return Buffer.concat([salt, iv, ct, c.getAuthTag()]).toString("base64");
}
Python에서 원시 키 문자열을 복호화할 때는 솔트와 PBKDF2를 건너뛰고 IV를 0번째 바이트부터 읽습니다.
import base64
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
def decrypt_raw(b64, key_b64):
data = base64.b64decode(b64)
iv, ct = data[:12], data[12:]
return AESGCM(base64.b64decode(key_b64)).decrypt(iv, ct, None).decode("utf-8")
Python용 비밀번호 버전은 AES 암호화 페이지에 있습니다. 이런 암호화는 한 사람에게서 다른 사람에게 비밀을 전달하기 위한 것입니다. 전달받은 뒤에는 암호문을 계속 갖고 있지 말고 비밀번호 관리자나 시크릿 관리 도구로 옮기세요.
자주 묻는 질문
비밀번호 없이 Base64를 복호화할 수 있나요?
그냥 Base64라면 가능합니다. 애초에 복호화할 것이 없기 때문입니다. Base64 디코더에 붙여넣으세요. Base64로 된 AES 암호문이라면 불가능합니다. 비밀번호나 키 없이는 바이트를 복구할 수 없고, 강력한 비밀번호를 알아맞히는 도구도 없습니다.
비밀번호가 맞는데 왜 틀렸다고 나오나요?
먼저 PBKDF2 반복 횟수를 확인하세요. 이 값은 암호문에 저장되지 않으므로, 보낸 사람이 바꿨다면 그 숫자를 알려 줘야 합니다. 문자열이 빠짐없이 복사되었는지, 정말 이 도구의 형식으로 만든 것인지도 확인하세요.
OpenSSL이나 CryptoJS로 암호화한 텍스트도 복호화할 수 있나요?
아니요. U2FsdGVkX1로 시작하는 문자열에는 OpenSSL의 Salted__ 헤더가 있고, 다른 키 유도 방식과 보통 CBC 모드를 씁니다. 암호화할 때와 같은 옵션으로 openssl enc -d를 실행해 복호화하세요.
복호화된 텍스트는 어떻게 되나요?
페이지에만 표시되고 다른 곳으로는 가지 않습니다. 복호화는 브라우저에서 WebCrypto로 실행되고, 페이지의 콘텐츠 보안 정책이 Cloudflare 조회수 집계를 제외한 모든 네트워크 요청을 차단하므로 비밀번호도 메시지도 전송되지 않습니다.