AES 암호화·복호화 도구

AES-256-GCM으로 텍스트와 파일을 브라우저에서 암호화·복호화. 비밀번호나 키를 직접 쓸 수 있고, 틀리면 인증 실패로 알려 줍니다. 업로드하지 않습니다.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
'비밀번호': 입력한 그대로의 문자열을 UTF-8로 바꾸고, 매번 새로 만드는 16바이트 솔트와 함께 PBKDF2-HMAC-SHA256을 600,000회 돌려 256비트 키를 만듭니다. 암호문은 v2:로 시작합니다. '키 직접 입력': 16·24·32바이트 키를 16진수, Base64, 텍스트(UTF-8 바이트)로 넣으며, 그대로 AES 키로 씁니다. 암호문에 접두사가 없습니다. '생성'은 무작위 256비트 키를 16진수로 채웁니다. 키 형식이 Base64이면 Base64로 채웁니다. '표시'를 누르면 입력한 비밀번호를 볼 수 있습니다.
텍스트는 UTF-8로 암호화합니다. '파일…'을 누르거나 파일을 칸에 끌어다 놓으면 파일을 암호화합니다. 한도는 256MB이고 메모리에 읽어 처리하며, 결과는 원래 이름에 .enc를 붙인 다운로드 버튼으로 나옵니다. 입력하는 동안에는 암호화하지 않습니다. '암호화'를 누르거나 Ctrl+Enter(Mac은 ⌘+Enter)를 누르세요. 복호화한 텍스트도 이 칸에 나옵니다. 도구 안에 포커스가 있을 때 Ctrl+L(⌘+L)을 누르면 두 칸, 비밀번호, 키, IV, AAD, 고른 파일을 비웁니다.
암호문을 붙여 넣습니다. v2: 접두사는 있어도 없어도 됩니다. Base64(표준 문자와 URL 안전 문자 모두, 패딩 생략 가능)나 16진수로 넣으며, 공백과 줄바꿈은 무시합니다. 접두사가 없으면 비밀번호 모드는 PBKDF2 200,000회, 그다음 600,000회 순으로 시도합니다. '복호화'를 누르거나 이 칸에서 Ctrl+Enter(⌘+Enter)를 누르면 텍스트가 평문 칸에 나옵니다. UTF-8이 아닌 바이트는 다운로드로 제공합니다. '파일…'이나 끌어다 놓기로 256MB까지의 암호화 파일을 복호화합니다. '출력'은 새로 암호화하는 텍스트를 Base64와 16진수 중 무엇으로 쓸지 정합니다. '복사'는 이 칸의 내용을 복사합니다.

AES-256-GCM(NIST SP 800-38D) · 비밀번호: PBKDF2-HMAC-SHA256 600,000회, 매번 새 16바이트 솔트 · 매번 새 12바이트 IV · 16바이트 인증 태그 · 이 탭 안에서 처리하며 업로드하지 않음

자세한 가이드 읽기 AES 암호화 도구: 브라우저에서 텍스트를 안전하게 암호화·복호화
예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

예시 1: 비밀번호로 한 문장 암호화

평문 회의 자료는 금요일에 보낼게요, 비밀번호 correct horse battery staple로 한 번 암호화한 결과입니다.

v2:YG1w0RRceJRp9qzhdNMzvbZ7eX8AmQeIuhony1o1zSjfNPaAV5lBkfvl8KT7Q2NZ1XPl+HLtqfttXD8PQ+8IZ8EtFX68wchTNvUT/23rml8L9qRvK/o=

한글 13자는 UTF-8로 39바이트, 공백 3개를 더하면 평문은 42바이트입니다. 그래서 v2: 뒤의 Base64는 86바이트(솔트 16 + IV 12 + 암호문 42 + 태그 16)입니다. 같은 비밀번호로 복호화하면 원문이 나오고, 다시 암호화하면 다른 문자열이 나옵니다. 솔트와 IV를 매번 새로 만들기 때문입니다.

예시 2: 키와 IV를 정해 결과 재현하기

다른 구현과 결과를 맞춰 볼 때는 키와 IV를 고정합니다. 키 종류 “키 직접 입력”, 형식 Hex, 128비트 키 00112233445566778899aabbccddeeff, IV 칸 a1b2c3d4e5f6a7b8c9d0e1f2, 평문 안녕하세요, ZeroTool, 출력 Hex로 암호화하면 매번 다음 값이 나옵니다.

9aabdcab3e4772d01c210ffdd44153dcaed5cfb2d26d821b54da9cfc72d4d337e5b2b770e70a7933d8

41바이트로, 암호문 25바이트와 태그 16바이트입니다(IV 칸을 쓰면 IV는 출력에 넣지 않습니다). IV 칸은 16진수 딱 24자리면 12바이트로, 그 밖에는 텍스트의 UTF-8 바이트로 읽습니다. 고정 IV로 암호화하면 도구가 경고를 띄웁니다. 같은 키로 IV를 재사용하면 GCM의 안전성이 무너지기 때문입니다(NIST SP 800-38D 8절). 실제 데이터는 IV 칸을 비워 두세요.

오류 메시지의 뜻

입력메시지
예시 1의 암호문을 다른 비밀번호로 복호화인증 실패: 비밀번호나 키가 틀렸거나, 암호문이 바뀌었거나 잘렸습니다.
U2FsdGVkX1…로 시작하는 암호문OpenSSL enc 또는 CryptoJS의 출력입니다…
v2:를 v3:로 바꿈알 수 없는 암호문 버전 “v3:“입니다.
암호문 중간에 전각 문자가 섞임N번째 문자 ”…”는 Base64 문자가 아닙니다.
”키 직접 입력”인 채로 v2: 암호문을 복호화비밀번호로 암호화된 것입니다. 키 종류를 “비밀번호”로 바꾸세요.

키는 맞지만 복호화 결과가 UTF-8 텍스트가 아니면 깨진 글자를 보여 주지 않고 파일로 내려받게 합니다.

KCMVP와의 관계

한국인터넷진흥원의 KCMVP 검증대상 암호알고리즘 목록(2026-09-30 확인)에는 블록암호로 ARIA, SEED, LEA, HIGHT와 함께 AES가 있고, AES의 운영모드로 기밀성/인증용 CCM, GCM이 올라 있습니다. 다만 KCMVP는 알고리즘이 아니라 이를 구현한 암호모듈을 검증하는 제도이며, 이 도구와 브라우저의 Web Crypto 구현은 KCMVP 검증을 받은 모듈이 아닙니다. 검증필 모듈이 필요한 시스템에서는 쓰지 말고, 개인적인 메모나 개발 중 암호문 확인 같은 용도로 쓰세요.

암호문 형식과 Python 코드

  • 비밀번호: v2: + “솔트 16 | IV 12 | 암호문 | 태그 16”의 Base64(또는 16진수). 키는 PBKDF2-HMAC-SHA256을 600,000회(OWASP Password Storage Cheat Sheet 권장값) 돌려 32바이트로 유도합니다.
  • 접두사 없음: 같은 구성이며, 2026-09-30 이전에 이 페이지가 만든 것(200,000회)입니다. 도구는 200,000회, 이어서 600,000회를 시도하므로 같은 구성으로 쓰는 다른 프로그램의 출력도 읽습니다.
  • 키 직접 입력: “IV 12 | 암호문 | 태그 16”. IV 칸을 쓰면 “암호문 | 태그”만 나옵니다.
  • 파일: Base64로 바꾸지 않은 같은 바이트이며, 비밀번호 모드 파일은 v2: 3바이트로 시작합니다.

다음 Python 코드(cryptography 45)는 도구와 서로 암호화·복호화할 수 있습니다.

import base64, os
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

def _key(password: str, salt: bytes, iterations: int) -> bytes:
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=salt, iterations=iterations)
    return kdf.derive(password.encode("utf-8"))

def encrypt(text: str, password: str) -> str:
    salt, iv = os.urandom(16), os.urandom(12)
    ct = AESGCM(_key(password, salt, 600_000)).encrypt(iv, text.encode("utf-8"), None)
    return "v2:" + base64.b64encode(salt + iv + ct).decode()

def decrypt(token: str, password: str) -> str:
    # "v2:"는 600,000회, 접두사 없음은 2026-09-30 이전 형식(200,000회)
    token = token.strip()
    iterations = 600_000 if token.startswith("v2:") else 200_000
    data = base64.b64decode(token.removeprefix("v2:"))
    salt, iv, ct = data[:16], data[16:28], data[28:]
    return AESGCM(_key(password, salt, iterations)).decrypt(iv, ct, None).decode("utf-8")

def decrypt_raw(token: str, key_hex: str) -> str:
    # 키 직접 입력, IV 칸이 빈 출력: iv(12) | 암호문 | 태그(16)의 Base64 또는 16진수
    token = token.strip()
    is_hex = all(c in "0123456789abcdefABCDEF" for c in token)
    data = bytes.fromhex(token) if is_hex else base64.b64decode(token)
    return AESGCM(bytes.fromhex(key_hex)).decrypt(data[:12], data[12:], None).decode("utf-8")

OpenSSL과 CBC 암호문

openssl enc는 이 형식을 읽지 못합니다. openssl-enc 매뉴얼은 CCM, GCM 같은 인증 암호화 모드를 지원하지 않으며 앞으로도 지원하지 않는다고 밝히고 있고, OpenSSL 3.6.1에 -aes-256-gcm을 주면 enc: AEAD ciphers not supported가 나옵니다.

U2FsdGVkX1로 시작하는 문자열은 “Salted__“의 Base64로, openssl enc나 CryptoJS AES.encrypt(텍스트, “암호 문구”)의 출력입니다(보통 AES-256-CBC). CBC에는 인증 태그가 없어서 비밀번호가 틀려도 깨진 결과가 나올 수 있습니다. 이 도구는 이 형식을 알아보고 안내만 합니다. 복호화는 다음 명령으로 하세요(2026-09-30 실행 확인).

# openssl enc -pbkdf2로 암호화한 경우
openssl enc -d -aes-256-cbc -pbkdf2 -a -A -in message.txt
# CryptoJS 4.2.0 AES.encrypt(텍스트, "암호 문구")로 암호화한 경우
openssl enc -d -aes-256-cbc -md md5 -a -A -in message.txt

다른 AES 도구와의 차이(실측)

2026-09-30 데스크톱 Chromium에서 같은 텍스트로 페이지가 보내는 요청을 확인했습니다.

  • CoderTools(codertools.net, 한국어판): 브라우저 안에서 처리하며, 기본값은 CBC이고 키를 텍스트 그대로 씁니다. 틀린 키로 복호화하면 결과 칸이 비기만 하고 메시지는 없습니다.
  • Go Tools(go-tools.org): 브라우저 안에서 처리합니다. 영어판에서 확인한 암호 문구 방식은 AES-GCM, PBKDF2 600,000회로 이 도구와 같은 바이트 구성(접두사 없음)이며, 그 출력은 이 도구에서 그대로 복호화됐습니다.
  • devglan.com: 텍스트와 키를 devglan.com/online-tools/aes-encryption으로 POST 전송해 서버에서 암호화합니다.

이 도구는 실패 종류마다 메시지를 보여 주고, IV와 추가 데이터를 지정하는 키 직접 입력과 파일 암호화를 지원하며, 페이지에서 분석 태그나 광고를 불러오지 않습니다.

제한 사항

  • GCM만 지원하며 CBC, ECB, CTR은 다루지 않습니다. openssl enc나 CryptoJS 출력은 위 명령으로 복호화하세요.
  • 비밀번호 모드 형식은 고정입니다(PBKDF2-HMAC-SHA256, 600,000회, 16바이트 솔트, 추가 데이터 없음). 태그는 항상 128비트입니다.
  • 파일은 256 MB까지이며 전체를 메모리에서 처리합니다. 테스트 노트북에서 200 MB 파일은 약 0.8초, 5 MB 텍스트는 약 1.7초(대부분 텍스트 칸 그리기)였습니다.
  • 무작위 96비트 IV를 쓸 때 NIST SP 800-38D 8.3절에 따라 한 키로 암호화할 수 있는 횟수는 232번입니다. 비밀번호 모드는 매번 새 키를 유도합니다.
  • 파일 이름은 암호화되지 않습니다(회의자료.pdf.enc에서 원래 이름이 보입니다). 암호화 파일 자체에는 파일 이름을 저장하지 않습니다.
  • 약한 비밀번호는 암호화해도 약합니다. 비밀번호 생성기로 만들고, 복호화한 파일은 파일 해시 검사기로 SHA-256을 대조할 수 있습니다.

FAQ

AES의 어떤 모드를 쓰나요?

AES-GCM만 씁니다. 비밀번호 모드는 AES-256-GCM이고 키는 PBKDF2-HMAC-SHA256으로 유도합니다. 키 직접 입력 모드는 키 길이에 따라 AES-128, AES-192, AES-256이 됩니다. GCM은 16바이트 인증 태그를 붙이므로 비밀번호가 틀리거나 암호문이 바뀌면 깨진 평문 대신 "인증 실패"를 표시합니다.

같은 평문과 비밀번호인데 왜 매번 다른 암호문이 나오나요?

암호화할 때마다 16바이트 솔트와 12바이트 IV를 새로 무작위로 만들기 때문입니다. NIST SP 800-38D는 같은 키로 IV를 재사용하지 않도록 요구하며, 새 솔트에서는 새 키가 유도됩니다. 어느 암호문이든 같은 평문으로 복호화됩니다.

OpenSSL로 복호화할 수 있나요?

없습니다. openssl enc는 GCM을 지원하지 않고, 매뉴얼에는 앞으로도 지원하지 않는다고 적혀 있습니다. 이 페이지의 Python 코드, Web Crypto API, 또는 AES-GCM을 지원하는 라이브러리로 아래 바이트 구성에 맞춰 복호화하세요. 반대로 openssl enc나 CryptoJS 출력(U2FsdGVkX1로 시작)을 붙여 넣으면 도구가 이를 알아보고 쓸 openssl 명령을 안내합니다.

텍스트, 비밀번호, 파일이 전송되나요?

전송하지 않습니다. 암호화와 복호화는 브라우저 탭 안에서 Web Crypto API로 처리합니다. 입력은 저장하지 않고 URL에도 넣지 않으며, 이 페이지는 Google 애널리틱스와 AdSense를 불러오지 않습니다.

공공기관 시스템에 이 도구의 암호화를 써도 되나요?

권하지 않습니다. AES와 GCM은 KCMVP(암호모듈 검증제도)의 검증대상 알고리즘 목록에 있지만, 검증은 알고리즘이 아니라 암호모듈 단위로 받습니다. 이 웹 도구는 KCMVP 검증을 받은 모듈이 아닙니다.