언어: 한국어

tools / des

des/

DES 대칭 암호화와 복호화로, 아직 DES를 쓰는 오래된 시스템과 연동할 때 씁니다. 모드, 패딩, 키와 IV 형식, 문자 집합을 모두 고를 수 있고 결과는 Java·CryptoJS와 같으며, 키는 브라우저 밖으로 나가지 않습니다.

평문

암호문

기록

암호화·복호화에 성공할 때마다 자동으로 기록하며, 최근 20건을 이 기기의 브라우저에만 저장합니다. 키는 저장하지 않지만 IV와 복호화한 평문은 저장되므로, 공용 컴퓨터에서는 사용 후 기록을 지워 주세요.

AES, DES, RSA는 무엇이고 어떻게 다른가

AES와 DES는 대칭 암호입니다. 암호화와 복호화에 같은 키를 쓰며, 열쇠 하나로 문을 잠그고 여는 것과 같습니다. 빨라서 많은 데이터에 적합하지만, 그 키를 상대에게 안전하게 전달하는 것이 어려운 점입니다.

DES는 1970년대의 오래된 표준으로 유효 키가 56비트뿐이라, 지금은 전용 하드웨어나 컴퓨터 클러스터로 무차별 대입 해독이 가능합니다. 아직 DES를 쓰는 오래된 시스템과 연동할 때만 쓰세요. AES는 DES를 대체한 표준으로 키는 128·192·256비트이며, 현재 현실적인 해독 방법이 없어 데이터 암호화의 첫 번째 선택입니다.

RSA는 비대칭 암호입니다. 키가 한 쌍이며, 공개 키는 누구에게나 공개해 암호화에 쓰고, 개인 키는 자신만 보관해 복호화에 씁니다. 누구나 편지를 넣을 수 있지만 열쇠는 나만 가진 우편함과 같습니다. 미리 키를 정할 필요가 없지만 느리고 한 번에 수백 바이트만 암호화할 수 있습니다. 실제 시스템은 둘을 함께 써서, 무작위로 만든 AES 키를 RSA로 암호화해 상대에게 보내고 실제 데이터는 AES로 암호화합니다.

암호 모드란 무엇이고 무엇을 고를까

DES는 한 번에 8바이트만 암호화하며, 모드는 긴 데이터를 블록으로 어떻게 나누고 블록끼리 어떻게 연결할지 정합니다. ECB는 블록마다 따로 암호화해 같은 내용이 같은 암호문이 되므로 데이터 패턴이 드러나 권장하지 않습니다. CBC는 각 블록을 직전 암호문과 섞은 뒤 암호화하고 첫 블록은 IV와 섞으며, 가장 흔한 선택입니다. CFB, OFB, CTR은 DES를 키 스트림으로 만들어 데이터와 바이트 단위로 XOR하므로 패딩이 필요 없습니다.

키, IV, 패딩

DES 키는 8바이트지만 각 바이트의 최하위 비트는 패리티 비트라 연산에 쓰이지 않으므로, 유효 키는 56비트뿐입니다. 8바이트보다 길면 앞 8바이트만 쓰며 Java의 DESKeySpec, CryptoJS와 같습니다. 8바이트보다 짧으면 오류가 납니다. ECB를 뺀 모든 모드에 8바이트 IV가 필요하며, 비밀일 필요는 없지만 같은 키로 다시 쓰면 안 됩니다.

ECB와 CBC는 데이터 길이가 8바이트의 배수여야 해서, 모자라면 패딩 방식대로 채웁니다. DES에서 PKCS5Padding과 PKCS7Padding은 완전히 같으며 가장 많이 씁니다. ZeroPadding은 0으로 채우고 복호화할 때 끝의 0바이트를 모두 지우므로, 평문 자체가 0바이트로 끝나면 함께 지워집니다. NoPadding은 아무것도 채우지 않으니 길이를 직접 맞춰야 합니다.

Java·CryptoJS 코드와의 대응

Java의 Cipher.getInstance("DES/CBC/PKCS5Padding")은 CBC와 PKCS5Padding을 고르는 것과 같고, "DES"만 쓰면 기본값은 ECB와 PKCS5Padding입니다. Java의 CTR은 NoPadding만 됩니다. CryptoJS.DES.encrypt의 모드와 패딩은 같은 이름으로 대응하며, CryptoJS.pad.Pkcs7은 PKCS7Padding입니다. 새 시스템에서는 AES를 쓰세요.

자주 묻는 질문

3DES(DESede, TripleDES)를 암호화·복호화할 수 있나요?

안 됩니다. 여기에는 단일 DES만 있습니다. 3DES 키는 16바이트 또는 24바이트인데, 붙여넣어도 앞 8바이트만 쓰여 결과가 3DES와 달라지며, 키 항목 옆에도 "앞 8바이트만 사용"이라고 표시됩니다. 3DES가 필요하면 DESede를 지원하는 도구를 쓰세요.

"키가 N바이트입니다. DES 키는 최소 8바이트여야 합니다"가 나오면 어떻게 하나요?

8바이트보다 짧으면 오류가 나며 0을 자동으로 채워 주지 않으므로 직접 8바이트로 맞춰야 합니다. 더 자주 하는 실수는 형식을 잘못 고르는 것입니다. 16글자 hex 키를 키 형식 string으로 입력하면 16바이트짜리 텍스트로 취급되어 앞 8글자만 쓰입니다. 오류는 나지 않고 키 항목 옆과 결과 아래에 "앞 8바이트만 사용"이라는 안내만 표시되며, 결과는 당연히 맞지 않습니다. string 형식에서는 선택한 문자 집합으로 바이트 수를 계산하며, 한글이나 한자 한 글자는 UTF-8에서 3바이트입니다.

"IV는 반드시 8바이트여야 합니다"가 나오면 어떻게 하나요?

DES의 IV는 AES의 16바이트가 아니라 정확히 8바이트여야 하며, ECB를 제외한 모든 모드가 같습니다. 키는 8바이트를 넘으면 앞 8바이트만 쓰지만 IV는 그렇지 않아 길어도 짧아도 오류가 나므로, AES 설정에서 가져온 16바이트 IV는 8바이트로 바꿔야 합니다. 형식도 확인하세요. 16글자 hex는 8바이트이지만 같은 16글자도 string 형식이면 16바이트입니다. ECB는 IV가 필요 없어 IV 항목이 숨겨집니다.

복호화에서 "패딩이 올바르지 않습니다", "8의 배수가 아닙니다"가 나오면 어떻게 하나요?

암호문 길이가 8의 배수가 아니라면 대개 복사가 덜 되었거나 hex와 base64를 바꿔 고른 경우입니다. 패딩 오류는 보통 키, IV, 모드, 패딩 중 하나가 암호화할 때와 다르다는 뜻입니다. ZeroPadding과 NoPadding은 패딩을 검사하지 않아 이 오류가 나지 않지만, 파라미터가 틀리면 결과가 깨진 문자로 나옵니다.

복호화 결과의 앞부분만 깨지거나 "올바른 UTF-8 텍스트가 아닙니다"가 나옵니다

먼저 IV를 확인하세요. 암호문이 한 블록보다 길 때 CBC와 CFB 모드에서 IV가 틀리면 첫 8바이트 블록만 깨지고 나머지는 정상으로 나오며 패딩 오류도 나지 않아, 앞부분만 깨지고 뒤는 맞는 모습이 됩니다. 결과가 올바른 텍스트가 아니라고 나오면 문자 집합이 암호화한 쪽과 다를 수도 있습니다. 예를 들어 상대가 GBK를 쓴 경우입니다. 출력 형식을 hex로 바꾸면 복호화된 바이트 자체가 맞는지 먼저 확인할 수 있습니다.

Java나 CryptoJS와 결과가 맞지 않습니다. 어떻게 확인하나요?

다음 순서로 확인하세요. 모드와 패딩, 키와 IV의 형식 및 바이트 수, 문자 집합, 입력·출력 형식입니다. string 형식의 평문은 앞뒤 공백을 지우지 않으므로 끝에 줄바꿈이 하나만 더 있어도 다른 데이터가 됩니다. CTR, CFB, OFB도 여기서는 선택한 패딩으로 채우기 때문에 PKCS5Padding을 고르면 암호문이 평문보다 길어지며, 백엔드가 NoPadding이면 여기서도 NoPadding을 선택하세요. 여기서 CFB는 64비트 블록 단위 방식이므로 상대가 CFB8을 쓰면 맞지 않습니다.

CryptoJS.DES.encrypt 결과가 U2FsdGVkX1로 시작합니다. 여기서 복호화할 수 있나요?

안 됩니다. CryptoJS.DES.encrypt(평문, 문자열)처럼 문자열을 넘기면 CryptoJS는 이를 암호문구로 취급해 무작위 솔트를 붙이고 OpenSSL 방식으로 키와 IV를 만들어 내며, 결과는 U2FsdGVkX1로 시작합니다. 이 형식은 여기서 지원하지 않습니다. 여기와 결과를 맞추려면 CryptoJS에서 CryptoJS.enc.Utf8.parse로 키를 바이트로 바꿔 넘기고 iv, mode, padding을 명시적으로 지정하세요.

기록에는 무엇이 저장되나요? 업로드되나요?

이 기기 브라우저의 localStorage에만 저장되며 업로드되지 않습니다. 페이지 코드에도 네트워크 요청이 없습니다. 암호화나 복호화에 성공할 때마다 한 건씩 기록되고 최대 20건까지 보관되며, 입력이나 결과가 2만 자를 넘으면 기록되지 않습니다. 기록에는 파라미터, IV, 입력, 결과와 키의 앞 8바이트로 계산한 8자 지문(각 기록의 # 뒤에 있는 문자열로, 같은 키인지 구별하는 용도)이 들어 있지만 키 자체는 저장하지 않으므로, "불러오기" 후에는 키를 다시 입력해야 합니다. 항목은 하나씩 삭제할 수 있고, 공용 컴퓨터에서는 사용 후 "기록 지우기"를 누르세요.