ToolActToolAct

RSA 암호화·복호화 도구

온라인 RSA 비대칭 암호화 - 키 쌍 생성, 공개키 암호화, 개인키 복호화

키 관리

공개키
개인키
입력 내용
문자 수: 0
바이트 수: 0
변환 결과
문자 수: 0
바이트 수: 0

RSA 암호화란?

RSA(Rivest-Shamir-Adleman)는 1977년 MIT 수학자 3명이 발명한 세계 최초의 널리 사용된 비대칭 암호화 알고리즘입니다. AES 같은 대칭 알고리즘과 달리 RSA는 키 쌍을 사용합니다: 공개키로 암호화하고 개인키로 복호화합니다. 공개키는 공개할 수 있지만 개인키는 철저히 관리해야 합니다. RSA의 안전성은 큰 정수의 소인수 분해 수학적 난이도에 기반합니다. 2048비트 이상의 키가 권장됩니다. HTTPS/TLS 핸드셰이크, 디지털 서명, 이메일 암호화(PGP/GPG), 블록체인 거래 서명 등에 사용됩니다. 이 도구는 브라우저 네이티브 Web Crypto API를 사용합니다.

사용 방법

사용 방법

  1. 키 크기를 선택하세요 (2048비트 이상 권장)
  2. 패딩 방식을 선택하세요 (보안 강화를 위해 OAEP 권장)
  3. 해시 알고리즘을 선택하세요 (SHA-256 권장)
  4. '키 쌍 생성'을 클릭해 공개 키와 개인 키를 만드세요.
  5. 암호화: 공개 키 영역에 공개 키를 붙여넣고 평문을 입력하면 암호문이 자동으로 생성됩니다.
  6. 복호화: 개인 키 영역에 개인 키를 붙여넣고 암호문을 입력하면 평문이 자동으로 생성됩니다.
  7. 결과를 복사하거나 '스왑'을 클릭해 입력과 출력을 맞바꾸세요.

매개변수 가이드

  • 새 암호화 테스트에는 RSA-OAEP와 SHA-256 이상을 사용하세요. PKCS#1 v1.5는 레거시 호환 전용입니다.
  • RSA는 작은 데이터만 암호화할 수 있습니다. 대용량 데이터는 무작위 AES 키를 RSA로 암호화하고, 실제 내용은 AES로 처리하세요.
  • 개인 키는 채팅, 티켓, 스크린샷, 공유 로그에 노출하지 마세요. 공개 키는 공유 가능하지만, 개인 키는 반드시 비밀로 유지하세요.

활용 사례

브라우저에서 RSA-OAEP 키 쌍 생성512, 1024, 2048, 3072, 4096비트 모듈러스 길이와 SHA-1, SHA-256, SHA-384, SHA-512 해시를 선택한 뒤 Web Crypto를 통해 내보내기 가능한 PEM 공개키와 개인키를 생성합니다. 키 쌍은 브라우저 탭에 머물며 SPKI(공개키)와 PKCS#8(개인키) PEM 블록으로 내보내집니다. 키 서버를 마련하지 않고도 상호 운용성 테스트를 설계하기에 편리합니다.
짧은 텍스트 페이로드 암호화 및 복호화공개키를 붙여넣어 평문을 Base64 또는 hex로 암호화하거나, 개인키를 붙여넣어 선택한 형식의 암호문을 복호화합니다. 입력과 출력 바이트 수가 페이로드 크기 문제를 드러내며, 이는 2048비트 키의 RSA-OAEP(SHA-256)가 약 190바이트의 평문만 래핑할 수 있기 때문에 중요합니다. 개인키와 메시지는 작업 내내 로컬 탭에 머뭅니다.
외부 도구 없이 키 처리 테스트공개키 또는 개인키 PEM 블록을 복사하고, 실험 시 패널을 전환하며, 하나의 페이지에서 암호화/복호화 모드를 전환할 수 있습니다. RSA-OAEP 의미 학습, openssl과의 상호 운용성 검사, 키 자료가 기기를 벗어나지 않아야 하는 로컬 프로토타이핑에 유용합니다.
상호 운용성 검사를 위한 OAEP 해시 선택OAEP 설정에서 SHA-1, SHA-256, SHA-384, SHA-512를 전환하여 상대 애플리케이션이 사용하는 해시와 일치시키세요. 해시가 불일치하면 Web Crypto에서 일반적인 'OperationError'로 복호화가 실패하므로, 여기서 페어링을 확인하면 Node의 crypto, Python의 cryptography, Java의 javax.crypto 서비스 간 키 연결 시 디버깅 시간을 절약할 수 있습니다.
암호화 전 페이로드 크기 제한 인식RSA-OAEP는 키 모듈러스에서 2*hashLen - 2바이트의 패딩 오버헤드를 뺀 길이보다 짧은 메시지만 암호화할 수 있으므로, 수 킬로바이트의 블롭에 시도하면 InvalidAccessError가 발생합니다. 입력 바이트 카운터와 암호문 출력 길이(OAEP의 경우 키 모듈러스와 같음)를 사용하여 테스트가 제한 내에 있는지 확인한 뒤, 대용량 데이터는 AES와 RSA 래핑 세션 키로 이동하세요.

기술 원리

RSA는 1977년 Rivest-Shamir-Adleman 공개키 암호 시스템입니다. 키 생성 시 두 개의 큰 무작위 소수 p와 q를 선택하고, 모듈러스 n = p · q를 설정하며, 오일러 피 함수 φ(n) = (p-1)(q-1)를 계산하고, φ(n)과 서로소인 공개 지수 e(낮은 해밍 가중치로 모듈러 지수 연산을 가속화하는 e = 65537 = 2^16 + 1이 사실상 표준)를 선택한 뒤, 확장 유클리드 알고리즘으로 개인 지수 d ≡ e^-1 (mod φ(n))를 도출합니다. 암호화는 c = m^e mod n, 복호화는 m = c^d mod n입니다. 보안은 충분히 큰 n에 대해 n을 p와 q로 소인수 분해하는 것이 어렵다는 추측에 기반합니다. 순수 RSA는 결정적이고 유연할 수 있으므로, 모든 실제 배포에서는 메시지를 패딩 스킴으로 감쌉니다. RFC 8017(PKCS#1 v2.2)에 정의된 RSA-OAEP는 SHA-256(또는 SHA-1/384/512)에 대한 MGF1 마스크 생성 함수를 사용하여 의미적 보안을 제공합니다: 동일한 평문이 호출마다 다른 암호문으로 암호화되고, 패딩 무결성 검사가 선택 암호문 공격을 방지합니다. 이전 PKCS#1 v1.5 패딩은 하위 호환성을 위해 여전히 흔하지만 Bleichenbacher 백만 메시지 오라클 공격에 취약합니다. 서명의 경우 동일한 이유로 PKCS#1 v1.5 서명보다 RSASSA-PSS가 선호됩니다. 키 크기 선택은 성능과 최신 소인수 분해 기록 모두에 의해 제한됩니다. NIST SP 800-57은 현재 ≥ 2048비트, 2030년 이후 ≥ 3072비트를 요구합니다. 타원 곡선 암호화는 256비트(NIST P-256, Curve25519)만으로 RSA 3072에 상당하는 보안을 제공하며, 이것이 대부분의 새 TLS 배포가 ECDHE + ECDSA를 선호하는 이유입니다. 2048비트 키의 RSA-OAEP는 최대 ⌊키크기/8⌋ − 2·해시길이 − 2 바이트(≈ SHA-256의 경우 190바이트)의 평문만 래핑할 수 있으므로, 프로덕션 시스템은 RSA를 새 대칭 세션 키 래핑에만 사용하고 AES-GCM이 페이로드를 담당하게 합니다 — 모든 TLS 핸드셰이크 이면의 하이브리드 패턴입니다. 브라우저에서는 Web Crypto API(window.crypto.subtle)가 PEM/DER(공개키는 SPKI, 개인키는 PKCS#8) 또는 JWK를 온더와이어 형식으로 하여 키 생성, 가져오기, 암호화, 복호화를 처리합니다.

  • 수학: 소수 p, q 선택; n = p·q; φ(n) = (p-1)(q-1); e 선택(일반적으로 65537 = 2^16+1); d = e^-1 mod φ(n) 계산; 암호화 c = m^e mod n; 복호화 m = c^d mod n
  • 패딩: 새 코드에는 RFC 8017(PKCS#1 v2.2)의 RSA-OAEP + MGF1+SHA-256 사용; 레거시 호환에는 PKCS#1 v1.5만, Bleichenbacher(CVE-2017-13099 등)에 취약
  • 키 크기: NIST SP 800-57은 현재 최소 2048비트, 2030년부터 3072비트; 1024비트 RSA는 이미 깨진 것으로 간주, 4096비트는 CPU 비용이 현저히 높음
  • 페이로드 제한: RSA-OAEP는 최대 ⌊k/8⌋ − 2·hashLen − 2 바이트(2048비트 + SHA-256의 경우 ≈ 190바이트)만 래핑 가능; 더 큰 데이터는 RSA로 AES-GCM 세션 키를 래핑
  • 비교 가능 강도: RSA 3072 ≈ ECC 256(NIST P-256 또는 Curve25519) @ ~128비트 대칭 보안; ECC는 키 크기와 서명 속도에서 유리, RSA는 검증에서 유리
  • 브라우저 API 및 형식: window.crypto.subtle.generateKey('RSA-OAEP'); SPKI PEM(공개키)과 PKCS#8 PEM(개인키) 또는 JWK로 내보내기; 개인키는 평문으로 절대 로컬 환경 밖으로 나가서는 안 됨

예시

기본 암호화

1. 2048비트 키 쌍 생성
2. 공개키 복사
3. 평문 입력: Hello, RSA!
4. OAEP + SHA-256 선택
5. 출력: Base64 인코딩된 암호문

RFC: RFC 8017 (PKCS#1 v2.2)은 RSAES-OAEP 암호화 방식을 정의합니다

일반적인 워크플로

송신자:
1. 수신자의 공개키 획득
2. 공개키로 메시지 암호화
3. 암호문 전송

수신자:
1. 개인키로 복호화
2. 원본 메시지 읽기

참고: RSA 암호화는 기밀성을 제공하며, 무결성을 위해서는 RSA 서명(RFC 8017의 RSASSA-PSS)과 결합하여 사용합니다

하이브리드 암호화 (RSA + AES)

RSA는 작은 데이터(예: 세션 키)에 적합합니다
큰 데이터에는 하이브리드 암호화를 사용합니다:
1. 무작위 AES-256 키 생성
2. RSA로 AES 키 암호화 (OAEP-SHA256은 최대 약 190바이트)
3. AES-GCM으로 실제 데이터 암호화
4. RSA로 암호화한 키 + AES 암호문 + IV + 인증 태그 전송

이 방식은 RSA의 키 분배와 AES의 속도를 결합한 것으로, TLS, PGP, S/MIME의 표준 패턴입니다.
RFC: RFC 8017 7.1절에서 키 캡슐화를 위한 RSAES-OAEP를 다룹니다

자주 묻는 질문

키 크기는 얼마로 생성해야 하나요?

오늘날 RSA-2048이 실용적인 최소 기준이며 TLS 인증서가 수년간 사용해 온 크기입니다. NIST SP 800-57에 따른 보수적 기본값은 RSA-3072입니다. RSA-4096은 대부분의 용도에 과한 편(훨씬 느림)이지만 장기 서명 키에 적합합니다. RSA-1024는 정책상 깨진 것으로 간주되니 새 키로 생성해서는 안 됩니다.

공개 키와 개인 키, 어느 쪽이 암호화하고 어느 쪽이 복호화하나요?

기밀성을 위해서는 공개 키로 암호화하고 개인 키로 복호화합니다. 누구나 당신에게 메시지를 암호화해 보낼 수 있고, 개인 키 소유자만 읽을 수 있습니다. 서명에서는 반대로 개인 키로 서명하고 공개 키로 검증합니다.

같은 평문을 두 번 암호화했는데 왜 결과가 다르죠?

권장 패딩 방식인 RSA-OAEP는 무작위성을 더해 동일한 평문이 매번 다른 암호문을 만들어내도록 합니다. 이는 의도된 설계로, 선택 암호문 공격을 막기 위함입니다. 패딩 없는 RSA(교과서 RSA)는 결정적이며 안전하지 않으니 사용하지 마세요.

RSA는 왜 AES보다 그렇게 느린가요?

RSA는 큰 정수의 모듈러 거듭제곱을 계산하지만, AES는 작은 블록에 대한 고정 크기 비트 연산을 합니다. 2048비트 RSA 암호화는 AES-128 암호화보다 수천 배 느립니다. 그래서 실무에서는 RSA로 작은 AES 세션 키만 감싸고, 실제 데이터는 AES로 암호화합니다.

RSA 키 하나로 암호화할 수 있는 최대 데이터 크기는?

SHA-256과 함께 쓰는 RSA-OAEP는 한 번에 약 (key_size_in_bits / 8 - 66) 바이트를 암호화할 수 있습니다. 2048비트는 190바이트, 3072비트는 318바이트, 4096비트는 446바이트 정도. 그보다 큰 데이터를 암호화하려면 AES 키를 RSA로 암호화하고 데이터는 AES로 암호화하세요.

키 생성은 무작위이고 로컬에서 이뤄지나요?

네. 키 생성에는 Web Crypto API의 crypto.subtle.generateKey를 사용하며, OS의 CSPRNG에서 시드를 가져옵니다. 키는 브라우저를 떠나지 않습니다. 페이지를 새로고침하면 키가 폐기되고 새로 생성됩니다. 운영 환경의 개인 키를 어떤 웹페이지에도 붙여 넣지 마세요.

RSA는 양자 내성(quantum-safe)인가요?

아니요. 충분히 큰 양자 컴퓨터에서 Shor 알고리즘을 돌리면 어떤 실용적인 키 크기의 RSA도 깨집니다. NIST는 2024년에 양자 이후 대안(ML-KEM, ML-DSA)을 표준화했습니다. 수십 년 뒤에도 기밀이 유지되어야 하는 데이터는 마이그레이션을 계획하세요. 짧게 사용되는 TLS 세션이라면 RSA는 아직 괜찮습니다.