tools / aes
aes/
AES 대칭 암호화와 복호화. 모드, 패딩, 키와 IV 형식, 문자 집합을 모두 고를 수 있고 결과는 Java·CryptoJS와 같으며, 키는 브라우저 밖으로 나가지 않습니다.
평문
암호문
기록
암호화·복호화에 성공할 때마다 자동으로 기록하며, 최근 20건을 이 기기의 브라우저에만 저장합니다. 키는 저장하지 않지만 IV와 복호화한 평문은 저장되므로, 공용 컴퓨터에서는 사용 후 기록을 지워 주세요.
AES, DES, RSA는 무엇이고 어떻게 다른가
AES와 DES는 대칭 암호입니다. 암호화와 복호화에 같은 키를 쓰며, 열쇠 하나로 문을 잠그고 여는 것과 같습니다. 빨라서 많은 데이터에 적합하지만, 그 키를 상대에게 안전하게 전달하는 것이 어려운 점입니다.
DES는 1970년대의 오래된 표준으로 유효 키가 56비트뿐이라, 지금은 전용 하드웨어나 컴퓨터 클러스터로 무차별 대입 해독이 가능합니다. 아직 DES를 쓰는 오래된 시스템과 연동할 때만 쓰세요. AES는 DES를 대체한 표준으로 키는 128·192·256비트이며, 현재 현실적인 해독 방법이 없어 데이터 암호화의 첫 번째 선택입니다.
RSA는 비대칭 암호입니다. 키가 한 쌍이며, 공개 키는 누구에게나 공개해 암호화에 쓰고, 개인 키는 자신만 보관해 복호화에 씁니다. 누구나 편지를 넣을 수 있지만 열쇠는 나만 가진 우편함과 같습니다. 미리 키를 정할 필요가 없지만 느리고 한 번에 수백 바이트만 암호화할 수 있습니다. 실제 시스템은 둘을 함께 써서, 무작위로 만든 AES 키를 RSA로 암호화해 상대에게 보내고 실제 데이터는 AES로 암호화합니다.
암호 모드란 무엇이고 무엇을 고를까
AES는 한 번에 16바이트만 암호화하며, 모드는 긴 데이터를 블록으로 어떻게 나누고 블록끼리 어떻게 연결할지 정합니다. ECB는 블록마다 따로 암호화해 같은 내용이 같은 암호문이 되므로 데이터 패턴이 드러나 권장하지 않습니다. CBC는 각 블록을 직전 암호문과 섞은 뒤 암호화하고 첫 블록은 IV와 섞으며, 가장 흔한 선택입니다. CFB, OFB, CTR은 AES를 키 스트림으로 만들어 데이터와 바이트 단위로 XOR하므로 패딩이 필요 없습니다. GCM은 CTR에 인증 태그(Tag)를 더해 암호문이 변조되면 복호화에 실패하며, 현재 가장 권장되는 모드입니다.
IV와 패딩은 무엇을 하나
IV(초기화 벡터)는 같은 내용이라도 매번 다른 암호문이 나오게 합니다. 비밀일 필요는 없어 암호문과 함께 보내도 되지만, 같은 키로 다시 쓰면 안 되며 GCM에서는 특히 그렇습니다. ECB를 뺀 모든 모드에 IV가 필요하며, GCM은 12바이트를 권장하고 나머지는 반드시 16바이트입니다.
ECB와 CBC는 데이터 길이가 16바이트의 배수여야 해서, 모자라면 패딩 방식대로 채웁니다. AES에서 PKCS5Padding과 PKCS7Padding은 완전히 같으며 가장 많이 씁니다. ZeroPadding은 0으로 채우고 복호화할 때 끝의 0바이트를 모두 지우므로, 평문 자체가 0바이트로 끝나면 함께 지워집니다. NoPadding은 아무것도 채우지 않으니 길이를 직접 맞춰야 합니다. GCM은 패딩을 쓰지 않습니다.
Java·CryptoJS 코드와의 대응
Java의 Cipher.getInstance("AES/CBC/PKCS5Padding")은 CBC와 PKCS5Padding을 고르는 것과 같고, "AES"만 쓰면 기본값은 ECB와 PKCS5Padding입니다. Java의 CTR과 GCM은 NoPadding만 되며, GCM의 Tag는 96~128비트만 지원합니다. CryptoJS의 CryptoJS.pad.Pkcs7은 PKCS7Padding이고, ZeroPadding·AnsiX923·Iso10126·Iso97971은 같은 이름으로 대응합니다. CryptoJS.AES.encrypt에 문자열 암호문구를 그대로 넘기면 키를 자동으로 만들어 U2FsdGVkX1로 시작하는 결과를 내는데, 이 방식은 여기서 지원하지 않으니 16·24·32바이트 키와 IV를 넘기세요.
GCM의 Tag와 AAD란
Tag는 GCM이 계산한 검증 값으로, 암호화 결과의 마지막 몇 바이트가 Tag입니다(128비트면 16바이트). AAD는 메시지 헤더 같은 추가 인증 데이터로, 자체는 암호화되지 않지만 검증에 포함되므로 복호화할 때 같은 내용을 넣지 않으면 검증에 실패합니다.
자주 묻는 질문
"키가 N바이트입니다", "IV가 N바이트입니다"가 나오면 어떻게 하나요?
먼저 형식이 맞는지 확인하세요. 같은 32글자라도 string 형식이면 32바이트, hex 형식이면 16바이트입니다. AES 키는 16, 24, 32바이트 중 하나여야 하고, ECB와 GCM을 제외한 모드의 IV는 정확히 16바이트여야 합니다. 자동으로 0을 채우거나 잘라 내지 않으며, 현재 바이트 수는 키와 IV 항목 제목 옆에 표시됩니다. string 형식에서는 선택한 문자 집합으로 바이트 수를 계산하며, 한글이나 한자 한 글자는 UTF-8에서 3바이트입니다. 백엔드가 암호문구에 0 채우기나 해시 같은 처리를 한다면, 먼저 최종 바이트를 구한 다음 hex나 base64 형식으로 입력하세요.
복호화에서 "패딩이 올바르지 않습니다"가 나오면 어떻게 하나요?
복호화한 마지막 블록이 선택한 패딩 규칙에 맞지 않는다는 뜻입니다. 보통 키, IV, 모드, 패딩 중 하나가 암호화할 때와 다르거나 암호문이 덜 복사된 경우입니다. 암호화한 쪽의 파라미터와 하나씩 대조해 보세요. 키 형식이나 암호문 형식(hex와 base64)을 잘못 골라도 같은 오류가 납니다. ZeroPadding과 NoPadding은 패딩을 검사하지 않으므로 이 오류가 나지 않지만, 파라미터가 틀리면 결과가 깨진 문자로 나옵니다.
복호화 결과의 앞부분만 깨지거나 "올바른 UTF-8 텍스트가 아닙니다"가 나옵니다
먼저 IV를 확인하세요. 암호문이 한 블록보다 길 때 CBC와 CFB 모드에서 IV가 틀리면 첫 16바이트 블록만 깨지고 나머지는 정상으로 나오며 패딩 오류도 나지 않아, 앞부분만 깨지고 뒤는 맞는 모습이 됩니다. 결과가 올바른 텍스트가 아니라고 나오면 문자 집합이 암호화한 쪽과 다를 수도 있습니다. 예를 들어 상대가 GBK를 쓴 경우입니다. 출력 형식을 hex로 바꾸면 복호화된 바이트 자체가 맞는지 먼저 확인할 수 있습니다.
GCM 복호화에서 "Tag 검증에 실패했습니다"가 나오면 어떻게 하나요?
키, IV, AAD, Tag 길이 중 하나가 암호화할 때와 다르거나 암호문이 변경되었다는 뜻입니다. 입력의 마지막 부분을 Tag로 보며 길이는 "Tag 길이" 옵션(기본 128비트, 즉 16바이트)을 따르므로 암호문과 Tag를 이어서 입력해야 합니다. 상대가 Tag를 따로 준다면 먼저 암호문 뒤에 붙이세요. AAD 형식의 기본값은 hex이므로 문자열을 넣을 때는 형식을 바꾸고, 암호화할 때 AAD를 쓰지 않았다면 복호화할 때도 비워 두세요.
Java, Python 같은 백엔드와 결과가 맞지 않습니다. 어떻게 확인하나요?
다음 순서로 확인하세요. 모드와 패딩, 키와 IV의 형식 및 바이트 수, 문자 집합, 입력·출력 형식입니다. string 형식의 평문은 앞뒤 공백을 지우지 않으므로 끝에 줄바꿈이 하나만 더 있어도 다른 데이터가 됩니다. CTR, CFB, OFB도 여기서는 선택한 패딩으로 채우기 때문에 PKCS5Padding을 고르면 암호문이 평문보다 길어지며, 백엔드가 NoPadding이면 여기서도 NoPadding을 선택하세요. 여기서 CFB는 128비트 블록 단위 방식이므로 상대가 CFB8을 쓰면 맞지 않습니다.
암호문은 hex와 base64 중 무엇을 골라야 하나요? 잘못 고르면 어떻게 되나요?
상대가 만든 출력에 맞추세요. 0-9와 a-f로만 이루어져 있으면 hex이고, 대소문자가 섞인 영문자나 +, /, 끝의 =가 있으면 base64입니다. 복호화할 때 잘못 골라도 바로 오류가 나지는 않을 수 있는데, hex에 쓰이는 문자가 모두 유효한 base64 문자이기도 하기 때문입니다. 그저 엉뚱한 바이트가 만들어져 나중에 "16의 배수가 아닙니다"나 패딩 오류로 나타납니다. base64의 - 와 _(URL 안전 형식), 생략된 =는 인식되고, hex의 공백, 콜론, 0x 접두사는 무시됩니다.
기록에는 무엇이 저장되나요? 업로드되나요?
이 기기 브라우저의 localStorage에만 저장되며 업로드되지 않습니다. 페이지 코드에도 네트워크 요청이 없습니다. 암호화나 복호화에 성공할 때마다 한 건씩 기록되고 최대 20건까지 보관되며, 입력이나 결과가 2만 자를 넘으면 기록되지 않습니다. 기록에는 파라미터, IV, AAD, 입력, 결과와 키로 계산한 8자 지문(각 기록의 # 뒤에 있는 문자열로, 같은 키인지 구별하는 용도)이 들어 있지만 키 자체는 저장하지 않으므로, "불러오기" 후에는 키를 다시 입력해야 합니다. 항목은 하나씩 삭제할 수 있고, 공용 컴퓨터에서는 사용 후 "기록 지우기"를 누르세요.
무작위 키나 IV를 자동으로 만들어 주나요?
안 됩니다. 생성 버튼이 없어서 키와 IV는 직접 입력해야 합니다. 같은 평문, 키, IV, 파라미터라면 암호화 결과는 항상 같고, ISO10126 패딩만 무작위 바이트를 섞어 결과가 달라집니다. 무작위 값이 필요하면 직접 만드세요. 예를 들어 명령줄에서 openssl rand -hex 16을 실행하면 16바이트가 출력되며, 형식을 hex로 두고 입력하면 됩니다.