브라우저에서 RSA 키 쌍을 생성하고, RSA-OAEP로 암호화·복호화하고, RSA-PSS 또는 PKCS#1 v1.5로 서명하고, SPKI·PKCS#8·PKCS#1 PEM 형식 사이에서 키를 변환합니다. 모든 것이 WebCrypto 엔진으로 로컬에서 동작합니다 — 키도 메시지도 이 페이지를 떠나지 않습니다.
RSA의 용도: 작은 메시지와 서명이지 대량 데이터가 아닙니다. RSA는 호출마다 최대 k−2·hashLen−2바이트(SHA-256과 2048비트 키면 190바이트)를 암호화하고 AES보다 약 1000배 느립니다. 실제 시스템은 하이브리드 암호화를 씁니다: RSA가 무작위 AES 키를 감싸고 AES가 데이터를 암호화합니다(AES 도구 참고). 이 페이지는 학습, 테스트, 상호 운용 확인용입니다.
1. 키 쌍 생성(WebCrypto, 로컬; 네 가지 PEM 형식이 함께 만들어집니다)
모듈러스 크기:
공개 키 — SPKI(-----BEGIN PUBLIC KEY-----, 흔한 "RSA 공개 키" 형식)
공개 키 — PKCS#1(-----BEGIN RSA PUBLIC KEY-----, 모듈러스 + 지수만)
개인 키 — PKCS#8(-----BEGIN PRIVATE KEY-----, 암호화 안 됨; 암호처럼 다루세요)
개인 키 — PKCS#1(-----BEGIN RSA PRIVATE KEY-----, 고전 OpenSSL 형식)
브라우저에서 키를 생성해도 암호화되지 않습니다. 저장하려면 실제 키 금고로 옮기거나 오프라인에서 암호화하세요.
2. 또는 기존 키 가져오기(네 가지 PEM 형식 중 아무거나 붙여넣으세요)
3. 암호화 / 복호화 (RSA-OAEP)- 방향은 현재 키를 따름: 공개 키 = 암호화, 개인 키 = 복호화
해시:레이블:
PKCS#1 v1.5 암호화는 일부러 구현하지 않았습니다: 암호문 무결성이 없고 패딩 오라클 공격(Bleichenbacher)에 무너집니다. 새 설계가 써야 하는 유일한 암호화 모드는 OAEP입니다.
4. 서명 (개인 키 필요)- PSS (무작위화, 현대적) 또는 PKCS#1 v1.5 (결정적, 레거시 호환)
방식:해시:
5. 검증 (공개 키 필요)- 메시지와 서명을 붙여넣으세요
방식:해시:
RSA 호출 하나는 얼마나 실을 수 있나?OAEP 메시지 한도 = 키 바이트 − 2×해시 바이트 − 2:
모듈러스
SHA-256
SHA-384
SHA-512
1024비트
62바이트
30바이트
0바이트
2048비트
190바이트
126바이트
62바이트
3072비트
318바이트
254바이트
190바이트
4096비트
446바이트
382바이트
318바이트
서명에는 메시지 한도가 없습니다 — 메시지는 먼저 해시됩니다. 서명 자체는 항상 정확히 키 크기입니다(2048비트면 256바이트).
키 강도와 수명(NIST SP 800-57 Part 1 Rev. 5): 1024비트는 2013년 이후 새 사용 금지. 2048비트가 오늘날의 최소값이며 2030년까지 허용됩니다. 3072비트 이상이 2031+의 안심 선택입니다. 8192비트도 여기서 동작하지만 브라우저에서 생성에 1분 이상 걸릴 수 있고 지금 아무도 필요로 하지 않는 보안을 삽니다 — 3072/4096을 권합니다.
OpenSSL 상호 운용 — 이 페이지가 만든 PEM은 명령줄에서 왕복됩니다: openssl pkeyutl -encrypt -pubin -inkey pub.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256 openssl pkeyutl -decrypt -inkey priv.pem -pkeyopt rsa_padding_mode:oaep ... openssl dgst -sha256 -sign priv.pem -out msg.sig msg.txt(PKCS#1 v1.5) / openssl dgst -sha256 -verify pub.pem -signature msg.sig msg.txt PSS: 두 dgst 호출에 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 추가. 키 형식 변환: openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem가 디스크에서 SPKI ↔ PKCS#1을 하며, 이 페이지는 브라우저에서 합니다.
자체 테스트 페이지 엔진을 독립 기준값에 대해 구동합니다: 세 가지 모듈러스 크기의 키 생성, OAEP 암호화/복호화 왕복, 여러 해시에 걸친 PSS와 PKCS#1 v1.5 서명/검증, 독립 네이티브 구현이 생성한 결정적 v1.5 서명 벡터의 바이트 단위 대조, 이 페이지가 복호화/검증해야 하는 OpenSSL 제작 고정 OAEP 암호문과 PSS 서명(교차 구현 상호 운용), PEM 형식 변환 왕복, 부정 테스트(변조된 서명, 잘못된 키는 실패해야 함). 아무것도 전송되지 않습니다.
RSA 암호화와 서명 처음부터 설명
한 문장으로: RSA는 공개 키 암호입니다 — 누구나 공개 키로 당신에게 암호화하거나 당신의 서명을 검증할 수 있지만, 복호화와 서명은 개인 키만 할 수 있습니다 — 그리고 그 보안은 2048비트 수를 두 소수로 인수분해하는 것이 어떤 컴퓨터의 손에도 닿지 않는다는 사실에 서 있습니다.
RSA가 실제로 계산하는 것
두 소수와 덫문. RSA 키는 두 큰 무작위 소수 p와 q에서 시작합니다. 그 곱 n(모듈러스, 그래서 "2048비트 키")이 지수 e(거의 언제나 65537)와 함께 공개 키로 발행됩니다. 개인 키는 e의 모듈러 역원 d — p와 q에서 계산됨 — 와 개인 키 연산을 4배 가속하는 소수 유래 지름길입니다.
암호화와 서명은 같은 지수 연산. 메시지 블록 m을 암호화하는 것은 me mod n을 계산하는 것이고, 복호화는 cd mod n입니다. 미리 형식화된 블록을 개인 지수로 서명하고 공개 지수로 검증하는 것은 같은 연산의 반대 방향입니다. 이 페이지의 나머지 전부 — OAEP, PSS, PKCS#1 — 는 원시 지수 연산이 절대 드러나지 않도록 그 블록을 안전하게 포장하는 일입니다.
느린 이유. 2048비트 키의 RSA 연산 하나는 AES로 블록 하나를 암호화하는 것보다 자릿수 백만 배의 CPU를 씁니다. 그래서 TLS는 RSA(또는 ECC)로 무작위 AES 키에 합의하는 데만 쓰고 곧 전환합니다. 당신이 만드는 무엇에도 같은 규칙이 적용됩니다: 키에는 RSA, 데이터에는 AES.
키 크기. 모듈러스 길이가 보안 다이얼입니다: 1024비트는 정책적으로 깨짐(인수분해가 국가급 역량에 근접), 2048비트 ≈ 대칭 112비트, 3072비트 ≈ 128비트, 256비트 대칭 키와 맞추려면 15360비트가 필요합니다. 양자 후 참고: Shor 알고리즘은 큰 양자 컴퓨터에서 RSA를 곧바로 깹니다 — 키 수명을 유한하게 유지할 이유가 하나 더 있습니다.
OAEP: 써야 하는 유일한 암호화 패딩
원시 RSA의 문제. 교과서 RSA(원시 메시지에 me mod n)는 결정적이고 조작 가능합니다: 같은 메시지는 같게 암호화되고, 공격자는 2를 암호화한 값을 암호문에 곱해 평문을 두 배로 만들 수 있으며, 짧은 메시지는 중간자 만남에 무너집니다. 직접 쓰면 안 됩니다.
OAEP가 하는 일. OAEP(PKCS#1 v2, RFC 8017)는 지수 연산 전에 메시지를 무작위 시드와 해시 기반 파이스텔 망으로 섞습니다. 결과: 암호화가 무작위화되고(같은 평문도 매번 다른 암호문 — OAEP 샘플을 두 번 돌려 비교해 보세요), 변조가 복호화에서 적발되며, 메시지는 해시 자리를 남기고 모듈러스 안에 들어가야 합니다 — 위 표의 k−2·hashLen−2 한도.
레이블. 패딩에 묶는 선택적 공개 문자열입니다. 양쪽 모두 동일한 레이블을 제공해야 합니다. 아니면 복호화가 실패합니다 — AES-GCM의 AAD처럼 암호문을 맥락(파일 이름, 알고리즘 ID)에 묶는 수단입니다. 비워 두는 것이 보통입니다.
PKCS#1 v1.5 암호화가 없는 이유. 1993년형 패딩은 무결성이 없고 복호화 오류 거동으로 정보를 새어 보냅니다(Bleichenbacher의 1998년 공격은 패딩 오라클을 수백만 개의 조작된 암호문으로 완전 복호화로 바꾸며, ROBOT(2017)으로 지금도 실제 시스템을 깹니다). WebCrypto가 구현을 거부하고 이 페이지도 그렇습니다.
PSS 대 PKCS#1 v1.5 서명
서명 = 해시, 패딩, 지수 연산. 두 방식 모두 메시지를 해시하고(여기서는 SHA-256/384/512), 다이제스트를 블록으로 만들고, 개인 지수를 적용합니다. 검증은 공개 키로 블록을 다시 만들어 비교합니다. 차이는 포장입니다:
방식
블록 내용
성질
RSASSA-PKCS1-v1_5
다이제스트 + digest-info 헤더, 결정적
같은 메시지의 모든 서명이 바이트 단위로 동일합니다(자체 테스트가 이를 검증)
RSA-PSS
다이제스트 + 해시 길이의 무작위 솔트, MGF1 마스킹
무작위화됨 — 서명마다 다릅니다. 난수 예언자 모형에서 증명된 보안.
무엇을 고를까. 새 설계: PSS. 기존 인증서, JWT(RS256), 오래된 상대와의 상호 운용: v1.5. 둘 다 서명 방식으로는 안전합니다 — v1.5의 참사 이야기는 *암호화* 패딩에 관한 것으로, 이름이 비슷해도 다른 구성입니다.
PKCS#1 대 PKCS#8 대 SPKI: 같은 키에 PEM이 네 가지인 이유
PEM은 그냥 base64로 싼 DER. PEM 파일은 레이블 + DER(바이너리 ASN.1) 구조의 base64입니다. 레이블이 어느 구조인지 말해 줍니다 — 그것이 이 페이지가 만드는 네 형식의 차이 전부입니다:
PEM 레이블
DER 구조
내용물
-----BEGIN PUBLIC KEY-----
SubjectPublicKeyInfo (SPKI)
알고리즘 OID + 공개 키 (n, e). 어디서나 쓰이는 기본 "공개 키".
-----BEGIN RSA PUBLIC KEY-----
PKCS#1 RSAPublicKey
모듈러스 (n, e)만. 오래된 OpenSSL과 일부 임베디드 스택.
-----BEGIN PRIVATE KEY-----
PKCS#8 PrivateKeyInfo
알고리즘 OID + 개인 키. 알고리즘 독립 컨테이너, 현대적 기본값.
-----BEGIN RSA PRIVATE KEY-----
PKCS#1 RSAPrivateKey
n, e, d, p, q, …. 고전 OpenSSL genrsa 출력.
같은 키, 다른 포장. 생성 후 위의 네 상자는 모두 같은 키 쌍을 담습니다 — SPKI와 PKCS#1 공개는 동일한 n, e를, PKCS#8과 PKCS#1 개인은 동일한 개인 값을 담습니다. 이 페이지는 브라우저에서 무손실 변환합니다(자체 테스트가 변환을 왕복 검증). 형식 혼동은 도구 사이에 키를 붙여넣을 때 "invalid key" 오류의 가장 흔한 원인입니다.
암호화된 PEM(-----BEGIN ENCRYPTED PRIVATE KEY-----)은 암호 기반 암호화 층이 붙은 PKCS#8입니다. 이 페이지는 받지 않습니다 — 먼저 오프라인에서 복호화하세요(openssl pkcs8 -in enc.pem -out plain.pem).
흔한 실수
RSA로 대량 데이터 암호화. OAEP 크기 한도를 넘는 것도 문제지만 속도가 터무니없이 느립니다. 패턴은: 무작위 AES 키를 생성하고, AES 키를 RSA-OAEP로 암호화하고, 데이터를 AES-GCM으로 암호화하고, 둘 다 보냅니다.
"테스트니까"라며 개인 키를 배포. 이 페이지 벡터에 심어 둔 샘플 키는 일부러 공개된 것입니다 — 테스트 데이터에만 서명할 수 있습니다. 당신의 키는 그렇지 않습니다.
개인 키로 검증. 수학적으로는 보통 "되고" 허용하는 도구도 있지만, 검증자들에게 개인 키를 뿌리는 순간 모델 전체가 무너집니다. 공개 키로 검증하세요(이 페이지가 강제합니다).
코드 점검이라며 서명을 바이트 단위로 비교. PSS(와 OAEP)는 무작위화됩니다: 올바른 실행 두 번도 다른 출력을 냅니다. 같음이 아니라 검증으로 비교하세요 — 결정적인 것은 v1.5 서명뿐입니다.
"빠르니까" 1024비트 키. 자금이 충분한 인수분해의 손에 닿는 크기이기도 합니다. 속도 논거는 하이브리드 암호화와 함께 죽었습니다: RSA는 바이트당이 아니라 세션마다 한 번 돕니다.
PSS 솔트 길이를 해시 길이 외의 값으로 하드코딩. 검증자가 동의해야 합니다. 해시 길이(이 페이지의 선택이자 OpenSSL의 -sigopt rsa_pss_saltlen:32)가 상호 운용 가능한 기본값입니다.
FAQ
복호화가 "잘못된 키, 잘못된 해시 또는 손상된 암호문"으로 실패하는 이유는? OAEP 복호화는 다음 중 하나라도 어긋나면 실패합니다: 짝이 아닌 개인 키, 암호화 쪽과 다른 해시, 다른 레이블, 변경된 암호문 바이트. 오류가 모든 경우에 똑같은 것은 일부러입니다 — 어느 검사가 실패했는지 드러내는 것 자체가 패딩 오라클 누출입니다.
개인 키에서 공개 키를 얻을 수 있나요? 네 — 개인 형식에도 n과 e가 들어 있습니다. 이 페이지는 생성 후 둘 다 표시합니다. OpenSSL은 openssl pkey -in priv.pem -pubout으로 합니다.
왜 지수가 65537인가요? 소수이고, 1비트가 두 개뿐이라(빠른 지수 연산) e=3에 걸리는 저지수 공격을 피할 만큼 큽니다. 1990년대부터 표준 선택이며, "이상한" 지수는 보통 약하거나 비표준 키를 뜻합니다.
양자 컴퓨터 때문에 RSA는 죽었나요? 아직은 아닙니다 — 2048비트 모듈러스에 Shor 알고리즘을 돌릴 수 있는 기계는 없습니다. 하지만 2030년대 이후까지 비밀이어야 하는 데이터는 이미 이전 중입니다. PQC 하이브리드 방식이 공학적 답입니다.
openssl rsautl은요?pkeyutl의 폐기된 조상입니다. 기본값이 v1.5 암호화 패딩입니다 — 은퇴한 이유가 하나 더.