AES 복호화 도구 — OpenSSL·CryptoJS 호환
온라인 AES 복호화 — GCM/CBC/CTR, 암호 문구 또는 원시 키, OpenSSL·CryptoJS "U2FsdGVkX1" 형식 자동 인식. 브라우저에서만 실행되며 키는 유출되지 않습니다.
고급 옵션
동일한 키로 IV를 재사용하지 마세요. 비워두면 안전한 무작위 IV가 생성됩니다.
AES 복호화는 어떻게 동작하는가
AES 복호화는 암호화의 정확한 역과정입니다: 데이터를 뒤섞었던 동일한 대칭 키가 암호의 라운드를 거꾸로 실행해 원본 바이트를 복원합니다. AES는 대칭 방식이므로 별도의 '복호화 키'는 존재하지 않습니다 — 암호화에 사용된 것과 동일한 키(또는 암호 문구), 모드, IV를 그대로 제공해야 합니다. 매개변수가 정확하면 평문은 바이트 단위로 원래 그대로 돌아오고, 하나라도 틀리면 오류나 깨진 결과를 얻게 됩니다.
올바르게 복호화하려면 네 가지가 암호화 당시와 정확히 일치해야 합니다: 키(또는 암호 문구와 그 키 유도 설정), 운영 모드(GCM, CBC, CTR), IV 또는 논스, 그리고 GCM의 경우 인증 태그입니다. 이 중 하나라도 어긋나면 결과는 명확한 오류(GCM 인증 실패, CBC 패딩 실패)이거나 조용한 깨진 데이터(CTR, 또는 잘못된 IV의 CBC)입니다. 이 도구는 솔트, IV, 태그가 암호문에 포함되어 있을 때 이를 대신 읽어 오고, 무언가 맞지 않을 때는 실패 원인을 진단해 줍니다.
암호문은 몇 가지 서로 다른 형태로 도착하며, 이 도구는 그중 세 가지를 이해합니다. 형식 1은 자기완결형 암호 문구 배치입니다: 16바이트 솔트, 그다음 IV, 그다음 암호문(GCM 모드에서는 끝에 GCM 태그가 붙음) — 암호 문구만으로 복호화할 수 있습니다. 형식 2는 원시 키 배치입니다: IV가 암호문 앞에 붙어 있거나, IV를 별도로 제공해야 하는 '단순' 암호문입니다. 형식 3은 openssl enc 명령과 CryptoJS가 생성하는 OpenSSL 배치입니다.
그 OpenSSL 형식은 눈으로 알아볼 가치가 있습니다. 8개의 ASCII 바이트 Salted__로 시작해 8바이트 솔트, 그다음 암호문이 이어지며, 전체를 Base64로 인코딩하면 앞부분 바이트는 항상 접두어 U2FsdGVkX1로 나타납니다. 그러니 건네받은 암호문이 U2FsdGVkX1로 시작한다면 거의 확실히 openssl enc나 CryptoJS의 AES.encrypt(text, passphrase) 호출로 생성된 것입니다. CryptoJS는 레거시 EVP_BytesToKey 함수로 MD5를 한 번만 실행해 키를 유도하는 반면, 최신 openssl은 PBKDF2를 사용합니다 — 그래서 이런 암호문을 복호화할 때는 올바른 키 유도 함수를 고르는 것이 관건입니다. 입력이 Base64이고 원시 바이트만 보고 싶다면 Base64 디코더가 보여 드립니다. 이런 형식의 암호문을 만들려면 AES 암호화 도구를 사용하세요.
// AES-256-GCM decrypt with a passphrase (PBKDF2-HMAC-SHA256, 600,000 iterations).
// Identical code runs in the browser and in Node.js 20+ via Web Crypto.
async function aesGcmDecrypt(base64, passphrase) {
const enc = new TextEncoder();
const packed = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
const salt = packed.slice(0, 16), iv = packed.slice(16, 28); // salt(16) | iv(12)
const ct = packed.slice(28); // ciphertext + tag
const baseKey = await crypto.subtle.importKey(
'raw', enc.encode(passphrase), 'PBKDF2', false, ['deriveKey']);
const key = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt, iterations: 600000, hash: 'SHA-256' },
baseKey, { name: 'AES-GCM', length: 256 }, false, ['decrypt']);
const plain = await crypto.subtle.decrypt(
{ name: 'AES-GCM', iv }, key, ct); // throws if the tag fails
return new TextDecoder().decode(plain); // recovered plaintext
} 주요 기능
OpenSSL·CryptoJS 출력 자동 인식
U2FsdGVkX1로 시작하는 암호문을 붙여넣으면 도구가 Salted__ 형식을 인식하고 클릭 한 번으로 해당 복호화 흐름으로 전환할 수 있게 해주므로, 막다른 오류와 씨름할 일이 없습니다.
세 가지 키 유도 함수
openssl enc 형식의 모든 세대에 걸쳐 복호화할 수 있습니다: 사용자 지정 반복 횟수의 PBKDF2, SHA-256을 쓰는 EVP_BytesToKey, 또는 CryptoJS가 사용하는 레거시 단일 MD5입니다.
복호화 실패 원인을 설명
막연한 오류 대신 진단 결과를 제공합니다: 키 오류인지 IV 오류인지, GCM 인증 실패, CBC 패딩 오류, Base64 오염, 또는 'MD5 시대 암호문처럼 보이니 EVP-MD5를 시도해 보세요' 같은 안내입니다.
동등한 openssl 명령을 실시간으로 표시
명령줄에서 이 복호화를 그대로 재현하는 정확한 openssl enc -d 명령을 반복 횟수까지 포함해 보여주므로 브라우저 밖에서도 결과를 검증할 수 있습니다.
암호 문구 또는 원시 키, GCM/CBC/CTR 전체 지원
자기완결형 암호 문구 암호문, IV가 앞에 붙거나 별도로 제공되는 원시 키 암호문, 그리고 Web Crypto의 세 가지 모드를 모두 처리합니다.
100% 브라우저에서 실행
암호문과 키는 Web Crypto API로 로컬에서 처리되며 업로드되지 않습니다 — 네트워크 탭이나 오프라인 상태로 직접 확인할 수 있습니다.
AES 복호화 예시
자기완결형 암호 문구 암호문 복호화(GCM)
솔트(16) ‖ IV(12) ‖ 암호문 ‖ 태그(16), Base64 — 암호화 페이지에서 생성
The quick brown fox jumps over the lazy dog.
이것은 암호화 페이지 GCM 예시의 역과정입니다. 암호 문구 hunter2로 생성된 자기완결형 Base64 문자열을 가져와 여기에 붙여넣고, 모드는 GCM, 키 크기는 256, 키 유형은 암호 문구로 설정한 뒤 동일한 암호 문구 hunter2를 입력하면 원래 문장이 그대로 돌아옵니다. 솔트나 IV를 따로 입력할 필요는 없습니다 — 도구가 문자열 앞부분에서 16바이트 솔트와 12바이트 IV를 읽어들이고, PBKDF2-HMAC-SHA256(600,000회 반복)으로 키를 유도한 뒤, 텍스트를 반환하기 전에 뒤에 붙은 128비트 GCM 태그를 검증합니다. 암호화 페이지에서 예시 불러오기를 클릭하면 새 문자열을 생성할 수 있고, 그것을 여기서 복호화해 보세요.
실제 OpenSSL / PBKDF2 출력 복호화
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=
Attack at dawn!
이것은 실제 openssl enc 출력입니다. 이를 붙여넣고 OpenSSL 모드로 전환한 뒤(모드 CBC, 키 유형 암호 문구), 암호 문구 correct-horse를 입력하고 PBKDF2 키 유도 함수를 선택한 다음 반복 횟수를 10,000으로 설정하세요 — 평문은 Attack at dawn!입니다. U2FsdGVkX1 접두어는 이것이 Salted__ 형식임을 도구에 알려주며, 8바이트 솔트는 Base64 안에서 그 헤더 바로 뒤에 위치합니다. 다음 명령줄로 정확히 동일한 복호화를 재현할 수 있습니다: echo 'U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=' | openssl enc -d -aes-256-cbc -pbkdf2 -iter 10000 -pass pass:correct-horse -base64 -A. 비슷한 암호문이 PBKDF2로 실패한다면 CryptoJS로 만들어졌을 가능성이 높습니다 — KDF를 EVP-MD5로 전환해 다시 시도하세요. OpenSSL 예시 불러오기를 클릭하면 이 값들이 자동으로 채워집니다.
AES 암호문 복호화 방법
- 1
암호문 붙여넣기
Base64나 Hex 암호문을 입력란에 넣으세요. U2FsdGVkX1로 시작하면 도구가 이를 OpenSSL/CryptoJS 형식으로 표시하고 올바른 모드로 전환할지 제안합니다.
- 2
형식과 모드 설정
이 도구가 만든 자기완결형 문자열이라면 암호 문구 모드와 일치하는 GCM/CBC/CTR을 유지하세요. OpenSSL/CryptoJS 출력이라면 전환 제안(CBC + 암호 문구)을 수락하세요. 원시 키 데이터라면 원시 키와 인코딩을 선택하고, IV가 앞에 붙어 있지 않다면 직접 입력하세요.
- 3
키 유도 함수 선택
OpenSSL 모드에서는 키가 유도된 방식에 맞춰 PBKDF2(및 반복 횟수), EVP-SHA256, EVP-MD5 중 하나를 선택하세요. EVP-MD5는 CryptoJS가 사용하는 방식입니다.
- 4
암호 문구나 키 입력
정확한 암호 문구를 입력하거나 정확한 원시 키를 16진수나 Base64로 붙여넣으세요. 모든 설정이 일치하는 즉시 오른쪽에 평문이 나타납니다.
- 5
실패하면 진단 결과 확인
복호화 중 오류가 나면 패널이 가능성 있는 원인 — 잘못된 IV, 잘못된 키, 패딩 오류, Base64 오염, KDF 불일치 — 을 알려주므로, 추측 대신 한 번에 하나씩 설정을 조정할 수 있습니다.
AES 복호화가 실패하는 이유와 해결법
GCM 인증 실패
태그가 검증되지 않으면 GCM은 평문 반환을 거부합니다. 원인은 잘못된 암호 문구나 키, 잘못된 모드, 잘못된 IV, 또는 변조·잘림된 암호문일 수 있으며 GCM은 어느 것인지 알려줄 수 없습니다. 데이터가 암호화된 방식과 하나하나 다시 대조해 보세요.
mode: CBC // but the data was encrypted with GCM => Authentication failed
mode: GCM, same passphrase and key size as encryption => plaintext
CBC: 첫 블록이 깨지면 IV가 잘못된 것
CBC에서 IV는 첫 16바이트 블록에만 영향을 줍니다. 첫 블록은 깨졌는데 나머지는 정상으로 디코딩된다면 IV가 잘못된 것이고, 전부 깨졌다면 키가 잘못된 것입니다.
iv: 00000000000000000000000000000000 (wrong IV) => first block corrupt, rest readable
iv: (the exact IV used to encrypt) => Attack at dawn!
CBC / PKCS#7 패딩 오류
패딩 오류는 거의 항상 키가 잘못되었다는 뜻입니다. 암호문이 손상되었거나 잘렸거나, 애초에 PKCS#7 패딩이 아니었다는 의미일 수도 있습니다. 전체 암호문이 제대로 복사되었는지, 암호 문구와 KDF가 일치하는지 확인하세요.
passphrase: hunter3 // one character off => padding error
passphrase: hunter2 // exact => plaintext
Base64(또는 hex) 오염
암호문과 함께 붙여넣은 줄바꿈, 공백, 스마트 따옴표가 디코딩을 깨뜨립니다. 도구는 공백을 자동으로 제거하지만, 문자가 누락되거나 추가되면 여전히 실패합니다.
“U2FsdGVkX1...” (curly quotes and trailing junk copied in)
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ= (clean Base64)
U2FsdGVkX1이 감지되었지만 OpenSSL 모드가 꺼져 있음
입력이 U2FsdGVkX1로 시작한다면 OpenSSL/CryptoJS Salted__ 출력을 보고 있는 것이며, 일반 암호 문구 문자열로는 복호화되지 않습니다. 도구가 배너를 표시하니 OpenSSL 모드로 전환을 클릭하고 KDF를 선택하세요.
OpenSSL compatible: off input: U2FsdGVkX1... => cannot parse
OpenSSL compatible: on, KDF chosen => plaintext
KDF 불일치(CryptoJS 함정)
PBKDF2나 SHA-256으로는 실패하지만 EVP-MD5로는 복호화되는 암호문은 CryptoJS나 openssl 1.0.2 이하 버전에서 생성된 것입니다. 명령줄에서는 -md md5가 필요합니다.
KDF: PBKDF2 // CryptoJS ciphertext => padding error
KDF: EVP-MD5 // matches CryptoJS => plaintext
AES 복호화로 할 수 있는 일
- openssl enc 출력 복호화
- 터미널을 열지 않고도 openssl enc -aes-256-cbc가 생성한 Salted__ 데이터를 읽으세요: Base64를 붙여넣고 암호 문구를 입력한 뒤 KDF를 선택하면 평문을 얻습니다.
- CryptoJS 암호문 복호화
- CryptoJS의 AES.encrypt(text, passphrase)를 사용한 레거시 앱에서 데이터를 복구하세요. 대부분이 놓치는 단계인 단일 MD5 키 유도에 맞추려면 EVP-MD5를 선택하세요.
- 계속 실패하는 복호화 디버깅
- 본인 코드로 무언가를 복호화할 수 없을 때 여기에 붙여넣어, 진단 패널을 이용해 문제가 키인지 IV인지 모드인지 인코딩인지 KDF인지 좁혀보세요.
- 암호화 왕복 검증
- AES 암호화 페이지나 본인 앱에서 나온 암호문이 원본 바이트 그대로 정확히 복호화되는지 확인하세요.
- 미확인 암호문 파악하기
- 형태만 보고 형식을 식별하세요 — U2FsdGVkX1 접두어이거나 IV처럼 보이는 고정 길이 접두어 — 키를 시도하기 전에 어떻게 만들어졌는지 먼저 파악하세요.
AES 복호화 내부 동작과 형식
- GCM 복호화 — 인증됨
- GCM은 암호문에 대해 128비트 태그를 다시 계산해 비교한 뒤에야 평문을 반환합니다. 일치하지 않으면 손상된 데이터를 유출하는 대신 예외를 던집니다. 앞에 붙은 96비트 IV를 사용합니다. GCM 실패는 키, 모드, IV, 암호문 중 무언가가 잘못되었다는 뜻입니다 — 암호 알고리즘은 어느 것인지 알려줄 수 없고, 인증이 실패했다는 것만 알려줍니다.
- CBC 복호화 — 첫 블록과 패딩을 주의 깊게 볼 것
- CBC에는 뚜렷이 다른 두 가지 실패 특징이 있습니다. 첫 16바이트 블록만 깨지고 나머지는 정상으로 보인다면 IV가 잘못된 것입니다. 모든 블록이 깨져 있다면 키가 잘못된 것입니다. PKCS#7 패딩 오류는 대개 키가 잘못되었거나 암호문이 손상되었거나 잘렸다는 뜻입니다. CBC에는 HMAC 같은 인증 구조와 달리 태그가 없으므로, 잘못된 키로도 그럴듯해 보이는 바이트가 나올 수 있습니다.
- CTR 복호화 — 오류 시 조용함
- CTR은 절대 예외를 던지지 않습니다: 잘못된 키는 그저 깨진 결과를 내놓을 뿐이며, 이는 대개 바이트를 텍스트로 디코딩할 때 'UTF-8이 아님' 오류로 드러납니다. 카운터/IV를 정확히 맞추세요. 무결성 검사가 없으므로, 별도로 인증하지 않은 CTR 출력은 항상 의심스럽게 다루세요.
- 암호문 배치(F1 / F2 / F3)
- 형식 1(암호 문구)은 솔트(16) 다음 IV, 다음 암호문 순서이며 GCM 모드에서는 끝에 16바이트 GCM 태그가 붙습니다. 형식 2(원시 키)는 IV 다음 암호문, 또는 IV를 별도로 제공하는 단순 암호문입니다. 형식 3(OpenSSL)은 ASCII 헤더 Salted__ 다음 8바이트 솔트, 다음 암호문입니다. 어떤 배치인지 알면 솔트와 IV가 어디에 있는지 도구에 알려줄 수 있고, 원시 키 자체는 CSPRNG에서 나와야 합니다 — 비밀 키 생성기를 참고하세요.
- 키 유도: 데이터를 암호화한 방식과 일치시키기
- 자기완결형 암호 문구 암호문의 경우 이 도구는 PBKDF2-HMAC-SHA256을 600,000회 반복해 사용합니다. OpenSSL/CryptoJS 암호문의 경우 사용된 KDF를 직접 선택해야 합니다: PBKDF2(openssl -pbkdf2 기본값은 10,000회 반복 — 정확한 횟수를 설정하세요), SHA-256을 쓰는 EVP_BytesToKey(-pbkdf2 없는 openssl 1.1 이상), 또는 MD5를 한 번만 실행하는 EVP_BytesToKey(CryptoJS와 openssl 1.0.2 이하)입니다. 고전적인 '복호화가 안 돼요' 문제는 CryptoJS나 구형 openssl 암호문을 SHA-256으로 시도하는 경우입니다 — EVP-MD5로 전환하면 해결됩니다.
AES 복호화 모범 사례
- 먼저 형식부터 파악할 것
- 설정을 건드리기 전에 암호문을 살펴보세요. U2FsdGVkX1 접두어는 OpenSSL/CryptoJS를 뜻하고, 이 도구가 만든 자기완결형 문자열은 암호 문구 형식이며, 단순한 데이터 덩어리라면 대개 원시 키와 별도의 IV가 필요합니다.
- 키 유도 함수를 정확히 맞출 것
- OpenSSL/CryptoJS 암호문에서는 KDF가 암호 문구만큼이나 중요합니다. PBKDF2가 실패하면 EVP-MD5(CryptoJS, 구형 openssl)를 시도하세요. 알고리즘뿐 아니라 반복 횟수도 일치해야 합니다.
- 암호문을 깔끔하게 붙여넣을 것
- 복사하면서 딸려 온 줄바꿈이나 공백이 Base64를 깨뜨릴 수 있습니다. 이 도구는 공백을 자동으로 제거하지만, 그래도 디코딩이 실패한다면 스마트 따옴표, 누락된 문자, 잘린 복사본이 없는지 확인하세요. Base64 도구로 의심스러운 문자열을 점검할 수 있습니다.
- 잘못된 키 결과를 정직하게 다룰 것
- CTR이나 CBC에서는 잘못된 키가 오류 대신 바이트를 내놓을 수 있습니다. 출력이 깨진 것처럼 보이거나 UTF-8 검사를 통과하지 못한다면 키나 IV가 잘못된 것입니다 — 부분적으로 맞아 보이는 출력을 신뢰하지 마세요.
- 비밀 암호문이나 키를 서버로 절대 보내지 말 것
- 브라우저에서 복호화하는 핵심은 아무것도 페이지를 벗어나지 않는다는 데 있습니다. 업로드하는 도구는 피하세요. 이 도구는 로컬에서 Web Crypto를 사용하며, 네트워크 탭이나 오프라인 상태로 이를 확인할 수 있습니다. AES-256은 강력합니다 — 'TOP SECRET' 등급에 CNSA 2.0으로 승인되었습니다 — 그러니 복호화가 안 된다면 문제는 매개변수에 있지 암호 알고리즘에 있지 않습니다.
AES 복호화 자주 묻는 질문
키 없이 AES를 복호화할 수 있나요?
openssl enc 출력은 어떻게 복호화하나요?
암호문 앞의 U2FsdGVkX1은 무엇을 의미하나요?
CryptoJS 암호문은 어떻게 복호화하나요?
GCM과 CBC — 왜 제 암호문은 한쪽으로는 복호화되고 다른 쪽으로는 안 되나요?
여기서 복호화할 때 암호문이나 키가 업로드되나요?
복호화할 때 암호 문구와 원시 키의 차이는 무엇인가요?
관련 도구
모든 도구 보기 →AES 암호화 도구 — GCM, CBC, CTR 모드
보안 도구
무료 온라인 AES 암호화 도구 — AES-128/192/256, GCM/CBC/CTR, 암호 문구(PBKDF2) 또는 원시 키. 브라우저에서만 실행되고 서버 업로드는 없습니다.
Bcrypt 해시 생성 및 검증 도구
보안 도구
온라인으로 bcrypt 비밀번호 해시를 생성·검증하세요 — 조절 가능한 비용 인자, $2b$/$2a$/$2y$ 접두사 지원. 100% 브라우저에서 실행, 비밀번호는 업로드되지 않습니다.
HMAC 생성기 및 서명 검증 도구
보안 도구
무료 온라인 HMAC 생성·검증 도구. Text/Hex/Base64 키로 HMAC-SHA256/SHA1/SHA384/SHA512를 Hex/Base64/Base64URL로 출력. 100% 브라우저 실행, 키 유출 없음.
JWT 디코더 (JWT Decoder)
보안 도구
무료 JWT 디코더로 JWT 토큰을 온라인에서 즉시 디코딩. 헤더, 페이로드, 서명, 만료, 클레임 확인. 100% 브라우저 기반 — 토큰이 기기를 떠나지 않음. 가입·추적 없음.
JWT 인코더 (JWT Encoder)
보안 도구
무료 온라인 JWT 생성기·인코더. 헤더와 페이로드를 구성하고 HS256, RS256, ES256으로 즉시 서명. 100% 브라우저 기반 — 비밀 키와 개인 키가 기기를 떠나지 않음.
무료 JWT 비밀 키 생성기 — HS256/384/512
보안 도구
온라인으로 HS256/384/512용 강력한 RFC 준수 JWT 비밀 키를 생성하세요. 100% 브라우저 실행, 서버 전송 없음. base64url·base64·hex, .env 복사 지원.