언어: 한국어

tools / rsa

rsa/

RSA 공개 키로 암호화하고 개인 키로 복호화하며, 개인 키 암호화·공개 키 복호화도 됩니다. 패딩, 키 형식, 입출력 형식, 문자 집합을 모두 고를 수 있고 키는 브라우저 밖으로 나가지 않습니다.

평문

키

암호문

기록

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

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

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

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

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

한 번에 암호화할 수 있는 길이

RSA는 한 번에 짧은 데이터만 암호화할 수 있으며, 상한은 키 길이와 패딩으로 정해집니다. PKCS1Padding은 키 바이트 수에서 11을 뺀 값으로 2048비트 키는 245바이트, OAEP는 키 바이트 수에서 해시 길이의 2배와 2를 뺀 값으로 2048비트 키에 SHA-256이면 190바이트입니다. 긴 데이터는 보통 AES로 암호화하고, 그 AES 키를 RSA로 암호화합니다.

Java 코드와의 대응

패딩 이름은 Java의 Cipher와 같습니다. RSA/ECB/PKCS1Padding은 PKCS1Padding, RSA/ECB/OAEPWithSHA-256AndMGF1Padding은 세 번째 항목을 고르세요(Java의 MGF1 기본값은 SHA-1). OAEPParameterSpec으로 해시를 직접 지정했다면 OAEPPadding을 고르고 OAEP 해시와 MGF1 해시를 각각 선택하세요. 문자 집합도 Java 규칙을 따르며, 예를 들어 UTF-16은 맨 앞에 FE FF를 붙인 빅 엔디언입니다.

암호화 결과가 매번 다른 이유

공개 키로 암호화할 때 PKCS1Padding과 OAEP 모두 패딩에 난수를 넣기 때문에 같은 내용도 매번 다른 암호문이 나오지만, 모두 개인 키로 복호화됩니다. 정상적인 동작입니다. 개인 키 암호화는 패딩이 고정이라 결과가 매번 같습니다. OAEP는 공개 키 암호화와 개인 키 복호화에만 쓸 수 있습니다.

지원하는 키

PEM은 BEGIN PUBLIC KEY, BEGIN RSA PUBLIC KEY, BEGIN PRIVATE KEY, BEGIN RSA PRIVATE KEY 네 가지를 지원하며, 가운데 Base64만 붙여넣어도 됩니다. hex는 같은 내용을 16진수로 쓴 것입니다. 비밀번호가 걸린 개인 키는 먼저 복호화해야 합니다. 키 종류가 공개 키일 때 개인 키를 붙여넣어도 되며, 그 안의 공개 키 부분을 사용합니다.

자주 묻는 질문

복호화에서 "키가 맞지 않거나 키 종류나 패딩이 틀렸다"고 나오면 어떻게 하나요?

세 가지를 차례로 확인하세요. 첫째, 키가 암호화에 쓴 공개 키와 한 쌍인지 봅니다. 공개 키로 암호화한 내용은 짝이 되는 개인 키로만 풀 수 있습니다. 둘째, 키 종류를 개인 키로 선택해야 합니다. 셋째, 패딩이 암호화한 쪽과 같아야 하며, OAEPPadding이라면 OAEP 해시와 MGF1 해시도 같아야 합니다. 마지막으로 입력 형식을 확인하세요. hex와 base64를 바꿔 고르면 복호화에 실패합니다.

키 형식이 틀렸다고 나오거나 CERTIFICATE를 지원하지 않는다고 나오면 어떻게 하나요?

먼저 "키 형식"이 붙여넣은 내용과 맞는지 확인하세요. -----BEGIN으로 시작하면 pem, 긴 16진수 문자열이면 hex를 선택하며, 잘못 골랐을 때는 보통 어느 쪽으로 바꿔야 하는지 알려 줍니다. PEM에는 RSA 공개 키나 개인 키가 들어 있어야 하고 인증서(BEGIN CERTIFICATE)는 그대로 쓸 수 없으므로, 먼저 openssl x509 -in cert.pem -pubkey -noout 으로 공개 키를 꺼내세요. 인증서와 키를 함께 붙여넣으면 그 안의 키 블록을 자동으로 골라 씁니다.

개인 키에 비밀번호가 걸려 있어 먼저 복호화하라고 나옵니다. 어떻게 하나요?

비밀번호가 걸린 개인 키(BEGIN ENCRYPTED PRIVATE KEY, 또는 PEM 헤더에 Proc-Type: 4,ENCRYPTED가 있는 키)는 지원하지 않습니다. 먼저 내 컴퓨터에서 비밀번호를 제거한 뒤 붙여넣으세요. 예를 들어 openssl rsa -in 원본파일 -out 새파일 을 실행하고 안내에 따라 비밀번호를 입력합니다. 비밀번호를 제거한 파일은 평문 개인 키와 같으니 사용 후 잘 관리하세요.

"내용이 상한을 넘었습니다"가 나옵니다. 한글은 몇 글자까지 암호화할 수 있나요?

상한은 글자 수가 아니라 바이트로 셉니다. 2048비트 키에 PKCS1Padding이면 최대 245바이트이고, UTF-8에서는 한글이나 한자 한 글자가 3바이트라 약 81글자입니다. 문자 집합을 GBK로 하면 한자 한 글자가 2바이트라 약 122글자입니다. 암호화할 때 키를 붙여넣으면 키 제목 옆에 현재 키와 패딩 기준의 "최대 N바이트 암호화"가 표시됩니다. 넘으면 오류가 나며 자동으로 나눠서 암호화하지는 않습니다.

브라우저에서 JSEncrypt나 Web Crypto로 암호화한 데이터는 어떻게 복호화하나요?

JSEncrypt는 PKCS1Padding을 쓰고 출력은 Base64입니다. 따라서 여기서는 패딩을 PKCS1Padding, 입력 형식을 base64로 고릅니다. 브라우저 Web Crypto의 RSA-OAEP는 OAEP와 MGF1에 같은 해시를 쓰므로, 여기서는 OAEPPadding을 고르고 OAEP 해시와 MGF1 해시를 같은 값, 예를 들어 둘 다 SHA256으로 맞춥니다. 두 경우 모두 키 종류는 개인 키로 선택합니다.

"암호문이 키 길이보다 깁니다", "암호문 값이 키 범위를 벗어납니다"는 무슨 뜻인가요?

RSA 암호문의 길이는 키의 바이트 수와 같습니다. 2048비트 키라면 256바이트이고 hex로는 512글자이며, 그보다 길어지지 않습니다. 복호화할 때 키 제목 옆에 "암호문 N바이트"가 표시되므로 입력란 옆의 바이트 수와 비교해 보세요. 키보다 길다면 대개 입력 형식을 잘못 골랐거나 내용을 더 복사한 경우입니다. 값이 범위를 벗어난다면 이 키와 짝인 공개 키로 암호화한 암호문이 아니라는 뜻이니 올바른 키로 바꾸세요.

개인 키로 암호화하고 공개 키로 복호화하는 방식을 서명과 검증에 쓸 수 있나요?

그대로는 서명에 쓸 수 없습니다. 여기서 개인 키로 암호화한다는 것은 입력한 내용에 PKCS1Padding을 적용해 개인 키로 연산하는 것뿐이고 해시는 계산하지 않습니다. 반면 SHA256withRSA 같은 서명은 먼저 해시를 계산한 뒤 그 해시를 정해진 구조(DigestInfo)에 담아 연산합니다. 그래서 표준 서명을 여기서 공개 키로 복호화하면 원문이 아니라 그 구조가 나옵니다. 서명이나 검증에는 SHA256withRSA 같은 알고리즘을 지원하는 라이브러리나 도구를 쓰세요.

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

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