<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=RSA_%EC%95%94%ED%98%B8</id>
	<title>RSA 암호 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=RSA_%EC%95%94%ED%98%B8"/>
	<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=RSA_%EC%95%94%ED%98%B8&amp;action=history"/>
	<updated>2026-07-22T16:35:53Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.gaonwiki.com/w/index.php?title=RSA_%EC%95%94%ED%98%B8&amp;diff=108008&amp;oldid=prev</id>
		<title>Gaon12: 시작</title>
		<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=RSA_%EC%95%94%ED%98%B8&amp;diff=108008&amp;oldid=prev"/>
		<updated>2026-01-12T05:38:50Z</updated>

		<summary type="html">&lt;p&gt;시작&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 개요 ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;RSA 암호&amp;#039;&amp;#039;&amp;#039;(RSA cryptosystem)는 1977년 [[론 라이베스트]](Ron Rivest), [[아디 샤미르]](Adi Shamir), [[레너드 애들먼]](Leonard Adleman) 세 사람이 개발한 [[공개키 암호]] 시스템이다.&amp;lt;ref&amp;gt;세 사람의 성(姓)의 첫 글자를 따서 RSA라고 명명했다.&amp;lt;/ref&amp;gt; &lt;br /&gt;
&lt;br /&gt;
현대 인터넷 보안의 근간을 이루는 암호화 기술로, [[HTTPS]], [[SSL/TLS]], [[전자서명]], [[VPN]] 등 우리가 매일 사용하는 수많은 보안 시스템에서 활용되고 있다.&amp;lt;ref&amp;gt;당신이 지금 보고 있는 이 웹페이지도 RSA로 암호화되어 있을 가능성이 높다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RSA의 가장 큰 특징은 &amp;#039;&amp;#039;&amp;#039;암호화 키와 복호화 키가 서로 다르다&amp;#039;&amp;#039;&amp;#039;는 것이다. 기존의 [[대칭키 암호]]와 달리, 공개키로 암호화한 데이터는 오직 대응하는 개인키로만 복호화할 수 있다. 이 혁신적인 아이디어 덕분에 사전에 비밀 키를 교환할 필요 없이 안전하게 통신할 수 있게 되었다.&lt;br /&gt;
&lt;br /&gt;
== 역사 ==&lt;br /&gt;
=== 탄생 배경 ===&lt;br /&gt;
1976년, [[위트필드 디피]](Whitfield Diffie)와 [[마틴 헬먼]](Martin Hellman)이 혁명적인 논문 &amp;quot;New Directions in Cryptography&amp;quot;를 발표하면서 &amp;#039;&amp;#039;&amp;#039;공개키 암호&amp;#039;&amp;#039;&amp;#039;라는 개념을 처음 제시했다. 그러나 이들은 구체적인 구현 방법은 제시하지 못했다.&amp;lt;ref&amp;gt;개념만 던져놓고 &amp;quot;누가 만들어봐~&amp;quot;한 셈이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RSA의 탄생 ===&lt;br /&gt;
1977년, [[MIT]]의 세 교수가 이 문제를 해결했다. 론 라이베스트가 알고리즘을 고안했고, 아디 샤미르가 수학적 증명을 담당했으며, 레너드 애들먼은 보안성을 분석했다.&amp;lt;ref&amp;gt;사실 애들먼은 처음엔 &amp;quot;이거 안 될 거야&amp;quot;라고 회의적이었다고 한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
재미있는 일화가 있다. 라이베스트는 1977년 [[유월절]] 전날 밤, 친구들과 와인을 마신 후 집에 돌아와 소파에 누워 있다가 갑자기 RSA 알고리즘을 떠올렸다고 한다. 그는 새벽까지 논문을 완성했고, 이것이 암호학 역사상 가장 중요한 논문 중 하나가 되었다.&amp;lt;ref&amp;gt;천재의 영감은 소파에서 나온다는 교훈...&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 특허와 공개 ===&lt;br /&gt;
RSA 알고리즘은 1983년 미국에서 특허를 받았고(US 4,405,829), 2000년 9월 특허가 만료되었다. 특허 기간 동안 &amp;#039;&amp;#039;&amp;#039;RSA Security&amp;#039;&amp;#039;&amp;#039;라는 회사가 라이선스를 관리했으며, 상당한 수익을 올렸다.&lt;br /&gt;
&lt;br /&gt;
한편 영국의 [[GCHQ]](정보통신본부)에서는 RSA보다 &amp;#039;&amp;#039;&amp;#039;4년 먼저&amp;#039;&amp;#039;&amp;#039; 같은 원리의 암호를 개발했다는 사실이 1997년에 공개되었다. [[제임스 엘리스]], [[클리퍼드 콕스]], [[말콤 윌리엄슨]]이 1973년에 이미 공개키 암호를 개발했지만, 군사 기밀로 분류되어 공개되지 못했다.&amp;lt;ref&amp;gt;역시 군대는 뭐든 먼저 만들고 숨긴다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 작동 원리 ==&lt;br /&gt;
RSA는 &amp;#039;&amp;#039;&amp;#039;큰 소수의 곱셈은 쉽지만, 그 결과를 다시 소인수분해하는 것은 매우 어렵다&amp;#039;&amp;#039;&amp;#039;는 수학적 난제를 기반으로 한다.&lt;br /&gt;
&lt;br /&gt;
=== 기본 개념 ===&lt;br /&gt;
RSA는 다음과 같은 특징을 가진다:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;공개키&amp;#039;&amp;#039;&amp;#039;(Public Key): 누구에게나 공개되며, 데이터를 암호화하는 데 사용&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;개인키&amp;#039;&amp;#039;&amp;#039;(Private Key): 자신만 가지고 있으며, 데이터를 복호화하는 데 사용&lt;br /&gt;
* 공개키로 암호화한 것은 대응하는 개인키로만 복호화 가능&lt;br /&gt;
* 개인키로 서명한 것은 대응하는 공개키로만 검증 가능&lt;br /&gt;
&lt;br /&gt;
=== 키 생성 과정 ===&lt;br /&gt;
RSA 키를 생성하는 과정은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1단계: 두 개의 큰 소수 선택&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 서로 다른 두 개의 큰 소수 p와 q를 무작위로 선택한다.&lt;br /&gt;
* 예시: p = 61, q = 53&amp;lt;ref&amp;gt;실제로는 수백 자리의 소수를 사용한다. 61이나 53 같은 건 초등학생도 소인수분해할 수 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2단계: n 계산&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* n = p × q를 계산한다.&lt;br /&gt;
* 예시: n = 61 × 53 = 3233&lt;br /&gt;
* 이 n이 &amp;#039;&amp;#039;&amp;#039;RSA 모듈러스&amp;#039;&amp;#039;&amp;#039;(RSA modulus)라고 불리며, 공개키와 개인키 모두에 포함된다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3단계: 오일러 함수 φ(n) 계산&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* φ(n) = (p-1) × (q-1)을 계산한다.&lt;br /&gt;
* 예시: φ(3233) = 60 × 52 = 3120&lt;br /&gt;
* φ(n)은 n보다 작으면서 n과 서로소인 양의 정수의 개수를 의미한다.&amp;lt;ref&amp;gt;[[오일러]]가 만든 함수다. 수학자들은 그리스 문자를 정말 좋아한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4단계: 공개 지수 e 선택&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 1 &amp;lt; e &amp;lt; φ(n)이면서 φ(n)과 서로소인 정수 e를 선택한다.&lt;br /&gt;
* 보통 e = 65537 (= 2^16 + 1)을 많이 사용한다.&amp;lt;ref&amp;gt;65537은 [[페르마 소수]]다. 계산이 빠르면서도 보안성이 좋아서 자주 쓰인다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* 예시: e = 17&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;5단계: 개인 지수 d 계산&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* d × e ≡ 1 (mod φ(n))을 만족하는 d를 구한다.&lt;br /&gt;
* 즉, d는 e의 모듈러 역원이다.&lt;br /&gt;
* [[확장 유클리드 호제법]]을 사용하여 계산한다.&lt;br /&gt;
* 예시: d = 2753&amp;lt;ref&amp;gt;왜냐하면 2753 × 17 = 46801 = 15 × 3120 + 1이기 때문&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;6단계: 키 생성 완료&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;공개키&amp;#039;&amp;#039;&amp;#039;: (n, e) = (3233, 17)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;개인키&amp;#039;&amp;#039;&amp;#039;: (n, d) = (3233, 2753)&lt;br /&gt;
* p, q, φ(n)은 &amp;#039;&amp;#039;&amp;#039;반드시 폐기&amp;#039;&amp;#039;&amp;#039;해야 한다!&amp;lt;ref&amp;gt;이걸 남겨두면 보안이 뚫린다. 마치 금고를 만든 후 설계도를 버리지 않는 것과 같다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 암호화 과정 ===&lt;br /&gt;
평문 메시지 M을 암호화하여 암호문 C를 만드는 과정:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;수식:&amp;#039;&amp;#039;&amp;#039; C ≡ M^e (mod n)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;예시:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 평문: M = 123&lt;br /&gt;
* 공개키: (n=3233, e=17)&lt;br /&gt;
* 암호화: C = 123^17 mod 3233 = 855&lt;br /&gt;
&lt;br /&gt;
이제 누구든 공개키 (3233, 17)을 알면 메시지를 암호화할 수 있지만, 개인키 없이는 복호화할 수 없다!&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;실제 계산 과정:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
123^17 mod 3233을 직접 계산하는 것은 비효율적이다. 대신 &amp;#039;&amp;#039;&amp;#039;제곱-곱셈 알고리즘&amp;#039;&amp;#039;&amp;#039;(Square-and-Multiply)을 사용한다:&lt;br /&gt;
* 17 = 2^4 + 2^0 = 16 + 1&lt;br /&gt;
* 123^17 = 123^16 × 123^1&lt;br /&gt;
* 123^2 mod 3233 = 15129 mod 3233 = 1926&lt;br /&gt;
* 123^4 mod 3233 = 1926^2 mod 3233 = 2830&lt;br /&gt;
* 123^8 mod 3233 = 2830^2 mod 3233 = 2746&lt;br /&gt;
* 123^16 mod 3233 = 2746^2 mod 3233 = 2728&lt;br /&gt;
* 123^17 mod 3233 = 2728 × 123 mod 3233 = 855&lt;br /&gt;
&lt;br /&gt;
=== 복호화 과정 ===&lt;br /&gt;
암호문 C를 복호화하여 평문 M을 복원하는 과정:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;수식:&amp;#039;&amp;#039;&amp;#039; M ≡ C^d (mod n)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;예시:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 암호문: C = 855&lt;br /&gt;
* 개인키: (n=3233, d=2753)&lt;br /&gt;
* 복호화: M = 855^2753 mod 3233 = 123&lt;br /&gt;
&lt;br /&gt;
원래 평문 123이 복원되었다!&amp;lt;ref&amp;gt;마법같지만 수학이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 왜 작동하는가? ===&lt;br /&gt;
RSA가 작동하는 이유는 [[페르마의 소정리]]와 [[오일러 정리]]에 기반한다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;수학적 증명:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* M^(ed) ≡ M (mod n)임을 증명해야 한다.&lt;br /&gt;
* d × e ≡ 1 (mod φ(n))이므로, d × e = 1 + k × φ(n) (k는 정수)&lt;br /&gt;
* 따라서 M^(ed) = M^(1 + k×φ(n)) = M × (M^φ(n))^k&lt;br /&gt;
* [[오일러 정리]]에 의해 M^φ(n) ≡ 1 (mod n) (M과 n이 서로소일 때)&lt;br /&gt;
* 따라서 M^(ed) ≡ M × 1^k ≡ M (mod n)&lt;br /&gt;
&lt;br /&gt;
이 증명은 &amp;#039;&amp;#039;&amp;#039;M과 n이 서로소&amp;#039;&amp;#039;&amp;#039;일 때 성립한다. 만약 M이 p나 q의 배수라면? 그래도 [[중국인의 나머지 정리]]를 사용하면 증명할 수 있다.&amp;lt;ref&amp;gt;수학자들은 구멍을 남기지 않는다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 구체적인 예제 ==&lt;br /&gt;
=== 작은 숫자로 이해하기 ===&lt;br /&gt;
실제 상황에서는 수백 자리 숫자를 사용하지만, 원리를 이해하기 위해 작은 숫자로 예를 들어보자.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;앨리스와 밥의 통신:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. 밥의 키 생성&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 밥이 두 소수 선택: p = 3, q = 11&lt;br /&gt;
* n = 3 × 11 = 33&lt;br /&gt;
* φ(n) = 2 × 10 = 20&lt;br /&gt;
* 공개 지수 선택: e = 3 (20과 서로소)&lt;br /&gt;
* 개인 지수 계산: d = 7 (3 × 7 = 21 = 1 + 1×20)&lt;br /&gt;
* 밥의 공개키: (33, 3)&lt;br /&gt;
* 밥의 개인키: (33, 7)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2. 앨리스의 암호화&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 앨리스가 보낼 메시지: M = 4&lt;br /&gt;
* 밥의 공개키 (33, 3)으로 암호화&lt;br /&gt;
* C = 4^3 mod 33 = 64 mod 33 = 31&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3. 밥의 복호화&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 받은 암호문: C = 31&lt;br /&gt;
* 밥의 개인키 (33, 7)로 복호화&lt;br /&gt;
* M = 31^7 mod 33 = ?&lt;br /&gt;
&lt;br /&gt;
31^7을 계산해보자:&lt;br /&gt;
* 31^2 = 961 mod 33 = 4&lt;br /&gt;
* 31^4 = 4^2 = 16 mod 33 = 16&lt;br /&gt;
* 31^7 = 31^4 × 31^2 × 31 = 16 × 4 × 31 mod 33 = 1984 mod 33 = 4&lt;br /&gt;
&lt;br /&gt;
원래 메시지 4가 복원되었다!&lt;br /&gt;
&lt;br /&gt;
=== 텍스트 암호화하기 ===&lt;br /&gt;
실제로 문자를 암호화하려면 어떻게 할까?&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;방법:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 각 문자를 숫자로 변환 (예: A=01, B=02, ..., Z=26)&lt;br /&gt;
* 메시지 &amp;quot;HI&amp;quot;를 암호화한다면:&lt;br /&gt;
** H = 08, I = 09 → 메시지 = 0809 또는 따로따로 암호화&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;예시 (키: n=3233, e=17, d=2753):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 평문: &amp;quot;HI&amp;quot; = 08, 09&lt;br /&gt;
* 암호화: &lt;br /&gt;
** 08^17 mod 3233 = 2082&lt;br /&gt;
** 09^17 mod 3233 = 2489&lt;br /&gt;
* 암호문: [2082, 2489]&lt;br /&gt;
* 복호화:&lt;br /&gt;
** 2082^2753 mod 3233 = 08&lt;br /&gt;
** 2489^2753 mod 3233 = 09&lt;br /&gt;
* 평문: &amp;quot;HI&amp;quot; 복원!&lt;br /&gt;
&lt;br /&gt;
실제 시스템에서는 텍스트를 바이너리로 변환하고, 패딩을 추가하며, 여러 블록으로 나누어 암호화한다.&amp;lt;ref&amp;gt;[[PKCS#1]] 같은 표준이 이런 세부사항을 정의한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 수학적 배경 ==&lt;br /&gt;
=== 소인수분해의 어려움 ===&lt;br /&gt;
RSA의 보안성은 &amp;#039;&amp;#039;&amp;#039;큰 수의 소인수분해가 어렵다&amp;#039;&amp;#039;&amp;#039;는 데 기반한다.&lt;br /&gt;
&lt;br /&gt;
예를 들어:&lt;br /&gt;
* 61 × 53 = 3233은 계산하기 쉽다. (1초도 안 걸림)&lt;br /&gt;
* 하지만 3233 = ? × ?를 알아내는 것은 상대적으로 어렵다.&lt;br /&gt;
&lt;br /&gt;
만약 n이 수백 자리의 수라면?&lt;br /&gt;
* 곱셈: 매우 빠름 (다항 시간)&lt;br /&gt;
* 소인수분해: 매우 느림 (지수 시간)&amp;lt;ref&amp;gt;현재까지 알려진 가장 빠른 알고리즘은 [[일반 수체 체 알고리즘]](GNFS)이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;예시:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* RSA-2048 (617자리 수)를 소인수분해하려면 현대 슈퍼컴퓨터로도 수천 년이 걸린다고 추정된다.&amp;lt;ref&amp;gt;물론 [[양자 컴퓨터]]가 나오면 얘기가 달라지지만...&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 모듈러 산술 ===&lt;br /&gt;
RSA는 &amp;#039;&amp;#039;&amp;#039;모듈러 연산&amp;#039;&amp;#039;&amp;#039;(modular arithmetic)에 크게 의존한다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;기본 개념:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* a ≡ b (mod n): a를 n으로 나눈 나머지가 b를 n으로 나눈 나머지와 같다&lt;br /&gt;
* 예: 17 ≡ 5 (mod 12) (시계 산술과 같다)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;중요한 성질:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* (a + b) mod n = ((a mod n) + (b mod n)) mod n&lt;br /&gt;
* (a × b) mod n = ((a mod n) × (b mod n)) mod n&lt;br /&gt;
* (a^k) mod n을 효율적으로 계산할 수 있다&lt;br /&gt;
&lt;br /&gt;
=== 오일러 정리 ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;오일러 정리:&amp;#039;&amp;#039;&amp;#039; a와 n이 서로소이면, a^φ(n) ≡ 1 (mod n)&lt;br /&gt;
&lt;br /&gt;
이것이 RSA가 작동하는 핵심 이유다!&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;특별한 경우 - 페르마의 소정리:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* n이 소수 p일 때, φ(p) = p-1&lt;br /&gt;
* 따라서 a^(p-1) ≡ 1 (mod p)&lt;br /&gt;
* [[페르마]]가 발견한 아름다운 정리다.&amp;lt;ref&amp;gt;페르마는 증명을 &amp;quot;여백이 부족해서&amp;quot;라는 말과 함께 남기지 않았다. RSA는 그의 정리를 실용화한 셈이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 중국인의 나머지 정리 ===&lt;br /&gt;
RSA 복호화를 빠르게 하기 위해 &amp;#039;&amp;#039;&amp;#039;[[중국인의 나머지 정리]]&amp;#039;&amp;#039;&amp;#039;(Chinese Remainder Theorem, CRT)를 사용한다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;기본 아이디어:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* M^d mod n을 직접 계산하는 대신&lt;br /&gt;
* M^d mod p와 M^d mod q를 각각 계산하고&lt;br /&gt;
* 결과를 결합한다&lt;br /&gt;
&lt;br /&gt;
이렇게 하면 &amp;#039;&amp;#039;&amp;#039;4배 정도 빠르다&amp;#039;&amp;#039;&amp;#039;!&amp;lt;ref&amp;gt;실제 구현에서는 거의 항상 CRT를 사용한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 보안성 ==&lt;br /&gt;
=== 안전한 키 길이 ===&lt;br /&gt;
RSA의 보안성은 키의 길이에 크게 의존한다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 키 길이 !! 보안 수준 !! 상태&lt;br /&gt;
|-&lt;br /&gt;
| 512비트 || 매우 약함 || 1999년 RSA-155 (512비트) 인수분해됨&lt;br /&gt;
|-&lt;br /&gt;
| 768비트 || 약함 || 2009년 RSA-768 인수분해됨&lt;br /&gt;
|-&lt;br /&gt;
| 1024비트 || 위험 || 2030년까지 안전하지 않을 것으로 예상&lt;br /&gt;
|-&lt;br /&gt;
| 2048비트 || 안전 || 현재 권장 최소 길이&lt;br /&gt;
|-&lt;br /&gt;
| 3072비트 || 매우 안전 || 2030년 이후 권장&lt;br /&gt;
|-&lt;br /&gt;
| 4096비트 || 극도로 안전 || 장기 보안이 필요한 경우&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NIST 권장사항 (2024년 기준):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 2048비트: 2030년까지 사용 가능&lt;br /&gt;
* 3072비트: 2030년 이후 권장&lt;br /&gt;
* 4096비트: 최상위 보안이 필요한 경우&amp;lt;ref&amp;gt;하지만 키가 길어질수록 연산 속도는 느려진다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 알려진 공격 방법 ===&lt;br /&gt;
==== 1. 작은 소수 공격 ====&lt;br /&gt;
p나 q가 너무 작으면 쉽게 소인수분해된다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;방어:&amp;#039;&amp;#039;&amp;#039; p와 q는 충분히 큰 소수를 사용해야 한다. (최소 1024비트)&lt;br /&gt;
&lt;br /&gt;
==== 2. 공통 모듈러스 공격 ====&lt;br /&gt;
같은 n을 여러 사용자가 공유하면 위험하다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;공격 시나리오:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 앨리스와 밥이 같은 n을 사용하지만 다른 e, d를 사용&lt;br /&gt;
* 공격자가 두 공개키를 알면 개인키를 계산할 수 있다!&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;방어:&amp;#039;&amp;#039;&amp;#039; 각 사용자는 자신만의 n을 생성해야 한다.&lt;br /&gt;
&lt;br /&gt;
==== 3. 작은 지수 공격 ====&lt;br /&gt;
공개 지수 e가 너무 작고 평문이 작으면 취약하다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;예시:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* e = 3이고 M^3 &amp;lt; n이면&lt;br /&gt;
* C = M^3이 되고, 단순히 세제곱근을 구하면 M을 알 수 있다!&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;방어:&amp;#039;&amp;#039;&amp;#039; [[패딩]] 스킴(OAEP 등)을 사용해야 한다.&lt;br /&gt;
&lt;br /&gt;
==== 4. 타이밍 공격 ====&lt;br /&gt;
복호화 시간을 측정하여 개인키를 추정하는 공격.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;원리:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 개인키의 비트에 따라 연산 시간이 달라진다&lt;br /&gt;
* 여러 번 측정하면 패턴을 찾을 수 있다&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;방어:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
* [[블라인딩]](Blinding) 기법 사용&lt;br /&gt;
* 상수 시간 알고리즘 구현&lt;br /&gt;
&lt;br /&gt;
==== 5. 부채널 공격 ====&lt;br /&gt;
전력 소비, 전자기파 방출 등을 분석하여 키를 추정.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;방어:&amp;#039;&amp;#039;&amp;#039; 하드웨어 수준의 보안 조치 필요.&lt;br /&gt;
&lt;br /&gt;
==== 6. 소인수분해 알고리즘의 발전 ====&lt;br /&gt;
현재까지 알려진 최선의 소인수분해 알고리즘:&lt;br /&gt;
* [[일반 수체 체 알고리즘]](General Number Field Sieve, GNFS)&lt;br /&gt;
* [[타원 곡선 인수분해]](Elliptic Curve Factorization)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;기록:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 2020년 2월: RSA-250 (829비트) 인수분해 성공&amp;lt;ref&amp;gt;2700 코어-년의 계산이 필요했다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 양자 컴퓨터의 위협 ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[쇼어 알고리즘]]&amp;#039;&amp;#039;&amp;#039;(Shor&amp;#039;s Algorithm)은 양자 컴퓨터로 소인수분해를 &amp;#039;&amp;#039;&amp;#039;다항 시간&amp;#039;&amp;#039;&amp;#039;에 해결할 수 있다는 것을 보였다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;현재 상황:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 2019년: [[IBM]]이 53큐비트 양자 컴퓨터 개발&lt;br /&gt;
* 2023년: [[IBM]]이 1121큐비트 Condor 프로세서 발표&lt;br /&gt;
* RSA-2048을 깨려면 수천~수만 큐비트가 필요할 것으로 추정&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;대응:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [[양자내성암호]](Post-Quantum Cryptography, PQC) 개발 중&lt;br /&gt;
* [[NIST]]가 표준화 진행 중&amp;lt;ref&amp;gt;격자 기반 암호, 코드 기반 암호 등이 후보다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* RSA를 대체할 새로운 암호 시스템 준비 중&lt;br /&gt;
&lt;br /&gt;
== 장점과 단점 ==&lt;br /&gt;
=== 장점 ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;키 배송 문제 해결&amp;#039;&amp;#039;&amp;#039;: 사전에 비밀 키를 공유할 필요가 없다&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;전자서명 가능&amp;#039;&amp;#039;&amp;#039;: 개인키로 서명하고 공개키로 검증&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;널리 사용됨&amp;#039;&amp;#039;&amp;#039;: 표준화되어 있고 검증된 기술&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;수학적으로 증명됨&amp;#039;&amp;#039;&amp;#039;: 안전성이 수학적으로 근거가 있다&lt;br /&gt;
&lt;br /&gt;
=== 단점 ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;느린 속도&amp;#039;&amp;#039;&amp;#039;: 대칭키 암호(AES 등)보다 100~1000배 느리다&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;키 크기&amp;#039;&amp;#039;&amp;#039;: 같은 보안 수준을 위해 대칭키보다 훨씬 긴 키 필요&lt;br /&gt;
** AES-128 = RSA-3072 수준&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;양자 컴퓨터에 취약&amp;#039;&amp;#039;&amp;#039;: 쇼어 알고리즘으로 깨질 수 있다&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;구현 복잡도&amp;#039;&amp;#039;&amp;#039;: 올바르게 구현하기 어렵다&amp;lt;ref&amp;gt;패딩, 타이밍 공격 방어 등 신경 쓸 게 많다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 하이브리드 암호화 ===&lt;br /&gt;
RSA의 단점을 극복하기 위해 &amp;#039;&amp;#039;&amp;#039;하이브리드 암호화&amp;#039;&amp;#039;&amp;#039;를 사용한다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;방법:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# 세션 키(대칭키)를 무작위로 생성&lt;br /&gt;
# 세션 키로 데이터를 AES 등으로 암호화 (빠름!)&lt;br /&gt;
# 세션 키를 RSA로 암호화 (작은 데이터만)&lt;br /&gt;
# 암호화된 데이터와 암호화된 세션 키를 전송&lt;br /&gt;
&lt;br /&gt;
이렇게 하면 &amp;#039;&amp;#039;&amp;#039;RSA의 보안성 + 대칭키의 속도&amp;#039;&amp;#039;&amp;#039;를 모두 얻을 수 있다!&amp;lt;ref&amp;gt;[[SSL/TLS]]가 정확히 이 방식을 사용한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 활용 사례 ==&lt;br /&gt;
=== HTTPS / SSL/TLS ===&lt;br /&gt;
웹사이트에 접속할 때 주소창에 자물쇠 아이콘이 보이는가? 그것이 바로 RSA가 작동하는 증거다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;과정:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# 브라우저가 서버의 &amp;#039;&amp;#039;&amp;#039;공개키&amp;#039;&amp;#039;&amp;#039;를 받는다 (인증서에 포함)&lt;br /&gt;
# 브라우저가 &amp;#039;&amp;#039;&amp;#039;세션 키&amp;#039;&amp;#039;&amp;#039;를 생성&lt;br /&gt;
# 세션 키를 서버의 공개키로 암호화하여 전송&lt;br /&gt;
# 서버가 개인키로 세션 키를 복호화&lt;br /&gt;
# 이후 세션 키로 대칭키 암호화 통신&lt;br /&gt;
&lt;br /&gt;
=== 전자서명 ===&lt;br /&gt;
RSA는 암호화뿐만 아니라 &amp;#039;&amp;#039;&amp;#039;전자서명&amp;#039;&amp;#039;&amp;#039;에도 사용된다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;원리:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 암호화와 반대로, 개인키로 &amp;quot;암호화&amp;quot;하고 공개키로 &amp;quot;복호화&amp;quot;&lt;br /&gt;
* 개인키를 가진 사람만 서명할 수 있다&lt;br /&gt;
* 누구나 공개키로 서명을 검증할 수 있다&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;실제 과정:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# 문서의 해시(예: [[SHA-256]])를 계산&lt;br /&gt;
# 해시를 개인키로 &amp;quot;암호화&amp;quot; (서명)&lt;br /&gt;
# 문서와 서명을 함께 전송&lt;br /&gt;
# 수신자가 서명을 공개키로 &amp;quot;복호화&amp;quot;&lt;br /&gt;
# 문서의 해시를 계산하여 비교&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;용도:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 소프트웨어 배포 (코드 서명)&lt;br /&gt;
* 이메일 서명 ([[PGP]], [[S/MIME]])&lt;br /&gt;
* 문서 인증&lt;br /&gt;
* 블록체인 ([[비트코인]]은 RSA 대신 [[ECDSA]]를 사용하지만)&amp;lt;ref&amp;gt;타원곡선 암호가 더 효율적이기 때문&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SSH ===&lt;br /&gt;
리눅스/Unix 서버에 원격 접속할 때 사용하는 [[SSH]]도 RSA를 사용한다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;과정:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# 서버의 공개키를 클라이언트에 등록 (또는 반대로)&lt;br /&gt;
# RSA를 사용하여 세션 키 교환&lt;br /&gt;
# 이후 대칭키 암호화로 통신&lt;br /&gt;
&lt;br /&gt;
=== VPN ===&lt;br /&gt;
[[VPN]] 연결 시 RSA로 안전한 터널을 구축한다.&lt;br /&gt;
&lt;br /&gt;
=== 암호화폐 ===&lt;br /&gt;
일부 암호화폐는 RSA를 사용하지만, 대부분은 더 효율적인 [[타원곡선 암호]](ECC)를 선호한다.&lt;br /&gt;
&lt;br /&gt;
=== 전자상거래 ===&lt;br /&gt;
신용카드 정보 전송, 전자결제 시스템에서 RSA가 사용된다.&lt;br /&gt;
&lt;br /&gt;
== 구현 ==&lt;br /&gt;
=== 프로그래밍 언어별 구현 ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Python:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from Crypto.PublicKey import RSA&lt;br /&gt;
from Crypto.Cipher import PKCS1_OAEP&lt;br /&gt;
&lt;br /&gt;
# 키 생성&lt;br /&gt;
key = RSA.generate(2048)&lt;br /&gt;
public_key = key.publickey()&lt;br /&gt;
&lt;br /&gt;
# 암호화&lt;br /&gt;
cipher = PKCS1_OAEP.new(public_key)&lt;br /&gt;
ciphertext = cipher.encrypt(b&amp;quot;Hello RSA!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 복호화&lt;br /&gt;
decipher = PKCS1_OAEP.new(key)&lt;br /&gt;
plaintext = decipher.decrypt(ciphertext)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Java:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.security.*;&lt;br /&gt;
import javax.crypto.Cipher;&lt;br /&gt;
&lt;br /&gt;
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(&amp;quot;RSA&amp;quot;);&lt;br /&gt;
keyGen.initialize(2048);&lt;br /&gt;
KeyPair pair = keyGen.generateKeyPair();&lt;br /&gt;
&lt;br /&gt;
Cipher cipher = Cipher.getInstance(&amp;quot;RSA&amp;quot;);&lt;br /&gt;
cipher.init(Cipher.ENCRYPT_MODE, pair.getPublic());&lt;br /&gt;
byte[] encrypted = cipher.doFinal(&amp;quot;Hello RSA!&amp;quot;.getBytes());&lt;br /&gt;
&lt;br /&gt;
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());&lt;br /&gt;
byte[] decrypted = cipher.doFinal(encrypted);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;JavaScript (Node.js):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const crypto = require(&amp;#039;crypto&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// 키 생성&lt;br /&gt;
const { publicKey, privateKey } = crypto.generateKeyPairSync(&amp;#039;rsa&amp;#039;, {&lt;br /&gt;
  modulusLength: 2048,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// 암호화&lt;br /&gt;
const encrypted = crypto.publicEncrypt(&lt;br /&gt;
  publicKey,&lt;br /&gt;
  Buffer.from(&amp;#039;Hello RSA!&amp;#039;)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// 복호화&lt;br /&gt;
const decrypted = crypto.privateDecrypt(privateKey, encrypted);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 주의사항 ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;절대 직접 구현하지 마라!&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;심각하다. 정말로 하지 마라.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* 타이밍 공격, 부채널 공격 등 고려할 게 너무 많다&lt;br /&gt;
* 패딩, 난수 생성 등을 잘못하면 보안이 무너진다&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;검증된 라이브러리를 사용&amp;#039;&amp;#039;&amp;#039;하라&lt;br /&gt;
** [[OpenSSL]]&lt;br /&gt;
** [[PyCryptodome]]&lt;br /&gt;
** [[Bouncy Castle]]&lt;br /&gt;
** [[libsodium]]&amp;lt;ref&amp;gt;사실 libsodium은 RSA 대신 더 현대적인 암호를 권장한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 변형과 개선 ==&lt;br /&gt;
=== RSA-OAEP ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[OAEP]]&amp;#039;&amp;#039;&amp;#039;(Optimal Asymmetric Encryption Padding)는 RSA의 보안성을 강화하는 패딩 방식이다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;특징:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 작은 지수 공격 방어&lt;br /&gt;
* 결정론적 암호화 방지&amp;lt;ref&amp;gt;같은 평문이 매번 다른 암호문으로 나온다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[무작위 오라클]] 모델에서 증명됨&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;표준:&amp;#039;&amp;#039;&amp;#039; [[PKCS#1]] v2.0 이상에서 권장&lt;br /&gt;
&lt;br /&gt;
=== RSA-PSS ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[PSS]]&amp;#039;&amp;#039;&amp;#039;(Probabilistic Signature Scheme)는 RSA 서명을 위한 안전한 방식이다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;장점:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 선택 메시지 공격에 안전&lt;br /&gt;
* 보안성 증명 가능&lt;br /&gt;
&lt;br /&gt;
=== Multi-Prime RSA ===&lt;br /&gt;
2개가 아닌 3개 이상의 소수를 사용하는 변형.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;장점:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* CRT를 사용하면 더 빠른 복호화&lt;br /&gt;
* 같은 보안 수준에서 더 작은 개인키&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;단점:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 보안성 분석이 덜 됨&lt;br /&gt;
* 표준화되지 않음&lt;br /&gt;
&lt;br /&gt;
== 관련 암호 ==&lt;br /&gt;
=== 타원곡선 암호 (ECC) ===&lt;br /&gt;
[[타원곡선 암호]](Elliptic Curve Cryptography)는 RSA의 대안이다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;비교:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;키 길이&amp;#039;&amp;#039;&amp;#039;: ECC-256 ≈ RSA-3072&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;속도&amp;#039;&amp;#039;&amp;#039;: ECC가 더 빠름&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;성숙도&amp;#039;&amp;#039;&amp;#039;: RSA가 더 오래되고 검증됨&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;양자 컴퓨터&amp;#039;&amp;#039;&amp;#039;: 둘 다 취약&amp;lt;ref&amp;gt;쇼어 알고리즘은 타원곡선에도 적용된다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ElGamal ===&lt;br /&gt;
[[ElGamal 암호]]는 RSA와 비슷한 시기에 개발된 공개키 암호다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;차이점:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [[이산대수 문제]]에 기반 (소인수분해가 아님)&lt;br /&gt;
* 암호문 크기가 평문의 2배&lt;br /&gt;
* 특허 없음&amp;lt;ref&amp;gt;RSA는 특허가 있었지만 ElGamal은 처음부터 자유로웠다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rabin 암호 ===&lt;br /&gt;
[[Rabin 암호]]는 RSA와 매우 유사하지만 e=2를 사용한다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;특징:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 소인수분해와 직접 동치&amp;lt;ref&amp;gt;즉, Rabin을 깨는 것 = 소인수분해. RSA는 이론적으로 소인수분해 없이도 깰 수도 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* 복호화 시 4개의 평문 후보가 나옴&lt;br /&gt;
* 실용적이지 않아서 잘 안 쓰임&lt;br /&gt;
&lt;br /&gt;
== RSA 챌린지 ==&lt;br /&gt;
[[RSA Laboratories]]는 1991년부터 2007년까지 &amp;#039;&amp;#039;&amp;#039;RSA Factoring Challenge&amp;#039;&amp;#039;&amp;#039;를 운영했다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;목적:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 소인수분해의 난이도 측정&lt;br /&gt;
* 암호학 연구 촉진&lt;br /&gt;
* 상금 제공&amp;lt;ref&amp;gt;처음에는 $10,000부터 시작&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;주요 결과:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 번호 !! 비트 수 !! 인수분해 연도 !! 상금&lt;br /&gt;
|-&lt;br /&gt;
| RSA-100 || 330 || 1991 || 없음&lt;br /&gt;
|-&lt;br /&gt;
| RSA-129 || 426 || 1994 || $100&lt;br /&gt;
|-&lt;br /&gt;
| RSA-140 || 463 || 1999 || $7,500&lt;br /&gt;
|-&lt;br /&gt;
| RSA-155 || 512 || 1999 || $10,000&lt;br /&gt;
|-&lt;br /&gt;
| RSA-160 || 530 || 2003 || 없음&lt;br /&gt;
|-&lt;br /&gt;
| RSA-200 || 663 || 2005 || 없음&lt;br /&gt;
|-&lt;br /&gt;
| RSA-768 || 768 || 2009 || 챌린지 종료 후&lt;br /&gt;
|-&lt;br /&gt;
| RSA-250 || 829 || 2020 || 챌린지 종료 후&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;미해결 숫자들:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* RSA-617 (617비트)&lt;br /&gt;
* RSA-704 (704비트)&lt;br /&gt;
* RSA-896 (896비트)&lt;br /&gt;
* RSA-1024 (1024비트)&lt;br /&gt;
* RSA-1536 (1536비트)&lt;br /&gt;
* RSA-2048 (2048비트)&amp;lt;ref&amp;gt;이건 인류가 깰 수 있을지 의문이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 흥미로운 사실 ==&lt;br /&gt;
* RSA-129는 원래 &amp;#039;&amp;#039;&amp;#039;4천조 년&amp;#039;&amp;#039;&amp;#039;이 걸릴 것으로 예상되었으나, 분산 컴퓨팅으로 &amp;#039;&amp;#039;&amp;#039;8개월&amp;#039;&amp;#039;&amp;#039;만에 깨졌다.&amp;lt;ref&amp;gt;기술의 발전 속도를 보여주는 사례&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RSA 알고리즘은 &amp;#039;&amp;#039;&amp;#039;무기&amp;#039;&amp;#039;&amp;#039;로 분류되어 미국 수출 규제 대상이었다. 1990년대까지 암호 기술을 인쇄된 책으로만 수출할 수 있었다.&amp;lt;ref&amp;gt;그래서 RSA 소스 코드를 책으로 인쇄해서 수출한 사례도 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 2015년, 연구자들이 타이완의 &amp;#039;&amp;#039;&amp;#039;국민신분증 카드&amp;#039;&amp;#039;&amp;#039;에 사용된 RSA-1024 키를 생성할 때 약한 난수 생성기를 사용했다는 것을 발견했다. 이론상 모든 키를 깰 수 있었다!&amp;lt;ref&amp;gt;암호는 구현이 전부다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RSA의 세 발명자는 2002년 [[튜링상]]을 수상했다. 컴퓨터 과학계의 노벨상이라 불리는 상이다.&lt;br /&gt;
&lt;br /&gt;
* 처음 RSA 논문이 제출되었을 때, 한 심사위원이 &amp;quot;이건 너무 간단해서 누군가 이미 발명했을 것&amp;quot;이라고 말했다고 한다.&amp;lt;ref&amp;gt;결과적으로 영국 정보기관이 먼저 발명하긴 했지만...&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 일부 국가에서는 강력한 암호 사용을 &amp;#039;&amp;#039;&amp;#039;불법&amp;#039;&amp;#039;&amp;#039;으로 규정한다. 중국, 러시아 등에서는 정부가 복호화할 수 있는 암호만 허용한다.&amp;lt;ref&amp;gt;프라이버시 vs 국가안보의 영원한 논쟁&amp;lt;s&amp;gt;이라 하고 검열이라 읽는다&amp;lt;/s&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RSA-2048을 [https://zenodo.org/records/18205268 깼다고 주장]하는 사람이 나왔다. &amp;lt;s&amp;gt;근데 p랑 q가 [[소수(Prime Number)|소수]]가 아니라 RSA가 아닌게 함정&amp;lt;/s&amp;gt; 당연히 거짓 논문이다. 자세한 내용은 [[Roughness of Area 엔진]] 문서를 참고하자.&lt;br /&gt;
&lt;br /&gt;
== 같이 보기 ==&lt;br /&gt;
* [[공개키 암호]]&lt;br /&gt;
* [[대칭키 암호]]&lt;br /&gt;
* [[AES]]&lt;br /&gt;
* [[디피-헬먼 키 교환]]&lt;br /&gt;
* [[타원곡선 암호]]&lt;br /&gt;
* [[전자서명]]&lt;br /&gt;
* [[SSL/TLS]]&lt;br /&gt;
* [[양자내성암호]]&lt;br /&gt;
* [[소인수분해]]&lt;br /&gt;
* [[오일러 정리]]&lt;br /&gt;
* [[페르마의 소정리]]&lt;br /&gt;
* [[중국인의 나머지 정리]]&lt;br /&gt;
&lt;br /&gt;
== 참고 문헌 ==&lt;br /&gt;
* R. L. Rivest, A. Shamir, and L. Adleman, &amp;quot;A Method for Obtaining Digital Signatures and Public-Key Cryptosystems,&amp;quot; &amp;#039;&amp;#039;Communications of the ACM&amp;#039;&amp;#039;, vol. 21, no. 2, pp. 120–126, 1978.&lt;br /&gt;
* Dan Boneh, &amp;quot;Twenty Years of Attacks on the RSA Cryptosystem,&amp;quot; &amp;#039;&amp;#039;Notices of the American Mathematical Society&amp;#039;&amp;#039;, vol. 46, no. 2, pp. 203–213, 1999.&lt;br /&gt;
* Victor Shoup, &amp;quot;OAEP Reconsidered,&amp;quot; &amp;#039;&amp;#039;Journal of Cryptology&amp;#039;&amp;#039;, vol. 15, no. 4, pp. 223–249, 2002.&lt;br /&gt;
&lt;br /&gt;
== 외부 링크 ==&lt;br /&gt;
* [http://www.rsa.com RSA Security 공식 웹사이트]&lt;br /&gt;
* [https://www.openssl.org/ OpenSSL 프로젝트]&lt;br /&gt;
* [https://csrc.nist.gov/projects/post-quantum-cryptography NIST 양자내성암호 프로젝트]&lt;br /&gt;
&lt;br /&gt;
== 각주 ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[분류:암호학]]&lt;br /&gt;
[[분류:정보보안]]&lt;br /&gt;
[[분류:공개키 암호]]&lt;br /&gt;
[[분류:수학]]&lt;/div&gt;</summary>
		<author><name>Gaon12</name></author>
	</entry>
</feed>