최종 점화식 완성: 괄호 안의 식들이 곧 새로운 si와 ti가 됩니다. si=si−2−qi−1⋅si−1 ti=ti−2−qi−1⋅ti−1
초기값 (Base Cases): 이 루프를 시작하기 위한 초기 세팅입니다. s0=1,t0=0 (초기식 I0=1⋅I0+0⋅I1 을 만족하기 위해) s1=0,t1=1 (초기식 I1=0⋅I0+1⋅I1 을 만족하기 위해)
3. 오일러 파이 함수 (Euler's Phi Function, Phi(m))
정의: 어떤 수 M이 주어졌을 때, M보다 작으면서 M과 서로소(최대공약수가 1)인 양의 정수의 개수를 의미합니다.
예시 1: M = 6일 때, 6과 서로소인 수는 1과 5 두 개이므로 Phi(6) = 2 입니다.
예시 2 (큰 수의 계산법): RSA 암호화에 쓰이는 매우 큰 수들은 일일이 셀 수 없으므로 소인수분해 공식을 사용합니다.
공식: M을 소인수분해한 결과가 P1^E1 P2^E2 ... 라면,
Phi(M) = (P1^E1 - P1^(E1 - 1)) (P2^E2 - P2^(E2 - 1)) ... 와 같이 계산합니다.
필기 상단에 적힌 이 정리는 소수(Prime Number)의 아주 특별한 성질을 보여줍니다.어떤 정수 a와 소수 P가 있을 때, 다음과 같은 공식이 항상 성립합니다.
aP≡a(modP)
이 공식의 양변을 a로 나누어 주면(단, a가 P의 배수가 아닐 때) 다음과 같이 표현할 수 있습니다. aP−1≡1(modP)
여기서 이전 시간에 배웠던 오일러 파이 함수(Φ)를 떠올려 봅시다. 소수 P에 대한 파이 함수 값은 자신보다 작은 모든 수와 서로소이므로 Φ(P)=P−1이 됩니다.
이 사실을 위의 공식에 대입하면 다음과 같은 최종 형태가 도출됩니다.
aΦ(P)≡1(modP)
오일러의 정리 (Euler's Theorem)
필기 중간의 오일러의 정리는 페르마의 소정리를 한 단계 더 확장한 것입니다. 페르마의 정리는 모듈러 값이 반드시 '소수(P)'일 때만 성립했지만, 오일러는 이를 '어떤 수(m)'에 대해서도 성립하도록 일반화했습니다.
조건은 단 하나, 밑이 되는 수 a와 모듈러가 되는 수 m이 서로소(gcd(a,m)=1)여야 한다는 것입니다. 이 조건만 만족하면 다음 공식이 무조건 성립합니다.
오일러의 정리 검증 예시 (Ex)
필기 하단은 이 마법 같은 오일러의 정리가 진짜로 성립하는지 구체적인 숫자를 넣어 증명해보는 과정입니다.
[가정] a=5, m=12 라고 해봅시다. 5와 12는 최대공약수가 1인 서로소이므로 오일러의 정리를 적용할 수 있습니다.
Step 1:
Φ(12) 계산하기 12를 소인수분해하면 3⋅4=31⋅22 입니다.
파이 함수 공식에 넣으면:
Φ(12)=(22−21)⋅(31−30) =(4−2)⋅(3−1)=2⋅2=4
즉, Φ(12)=4 입니다.
Step 2:
오일러 공식에 대입하기
오일러의 정리에 따르면 5Φ(12)≡1(mod12) 가 성립해야 하므로, 결국 54(mod12) 의 결과가 1이 나오는지 확인하면 됩니다.
Step 3:
모듈러 연산 풀이 54을 한 번에 계산하면 625로 너무 크니까, 필기에서는 연산을 쪼개는 팁(Equivalent Class 활용)을 썼습니다.
54≡52⋅52(mod12) 52=25 ≡25⋅25(mod12)
여기서 25를 12로 나누면 몫이 2(24)이고 나머지가 1이 됩니다. 따라서 25(mod12)≡1 로 바꿀 수 있습니다.
≡1⋅1(mod12) ≡1(mod12)
결론: 수작업으로 계산해 본 결과도 정확히 1이 나옴으로써, 오일러의 정리(aΦ(m)≡1(modm))가 완벽하게 증명되었습니다!
이 두 정리가 훗날 RSA에서 XE⋅D≡X(modN) (암호화했다가 복호화하면 원래 평문이 나온다)을 증명하는 데 핵심 키로 사용됩니다.
2. 대칭키(비밀키) 암호화 vs 공개키(비대칭키) 암호화
대칭키(Symmetric Key)의 문제점:
Alice와 Bob이 동일한 키(K)로 암복호화를 하려면, 사전에 안전한 채널(Secure Channel)을 통해 이 키를 주고받아야 합니다(Key Distribution). 하지만 인터넷처럼 개방된 네트워크에서 안전한 채널을 구축하는 것은 현실적으로 불가능에 가깝습니다.
공개키(Asymmetric Key)의 해결책:
수신자인 Bob이 사전에 두 개의 열쇠 꾸러미(키 쌍)를 만듭니다
누구나 볼 수 있게 공개하는 열쇠 (Kpub): 암호화 전용
자기 자신만 꽁꽁 숨겨두는 열쇠 (Kpr): 복호화 전용이제 Alice는 Bob의 공개키로 데이터를 암호화(y=eKpub(x))해서 보내면 됩니다. 해커가 중간에 데이터를 가로채도, 복호화 키는 오직 Bob만 가지고 있으므로 안전하게 통신할 수 있습니다!
3. RSA Algorithm
[1단계: 키 생성 (Key Generation)] - 모듈러 Phi(n) 사용
아주 큰 두 소수 p와 q를 고릅니다. (보통 512비트 이상의 거대한 수)
두 소수를 곱해서 모듈러 n을 만듭니다: n=p⋅q
오일러 파이 함수를 이용해 Φ(n)을 계산합니다: Φ(n)=(p−1)⋅(q−1)
공개키 e를 선택합니다. (단, e는 Φ(n)과 서로소여야 함, 즉 gcd(e,Φ(n))=1)
비밀키 d를 계산합니다. 앞서 배운 확장 유클리드 알고리즘(EEA)을 이용해 e의 모듈러 역원을 구합니다 d⋅e≡1(modΦ(n))
결론: 이렇게 만들어진 (e,n) 묶음은 공개키가 되어 널리 배포되고, d는 개인키가 되어 수신자만 안전하게 보관합니다.
RSA의 실제 연산과 계산 예제
세 번째 장은 방금 만든 키로 어떻게 암호화/복호화를 하는지 공식과 예제를 보여줍니다.
복호화 (Bob): x=317mod33
이 계산을 쉽게 하기 위해 Equivalent Class를 사용합니다. 31≡−2(mod33) 이므로, =(−2)7mod33 =−128mod33 −128은 −4⋅33+4 이므로, 최종 평문은 원래 Alice가 보냈던 4가 튀어나옵니다!
왜 e=3 같이 작은 숫자를 공개키로 쓰면 안 될까?
필기 맨 아래 빨간 글씨로 적힌 'Trudy'의 해킹 시나리오가 그 답을 줍니다.
만약 암호문 y=x3mod77 처럼, x3 값이 모듈러 n(77)을 넘지 못하는 상황(예: x=4일 때 43=64)이 발생하면 모듈러 연산이 사실상 무력화됩니다. 해커(Trudy)는 그냥 암호문에 세제곱근(364)을 씌워버리는 것만으로 평문(4)을 쉽게 알아낼 수 있습니다. 따라서 실제 구현에서는 e 값을 최소한 17이나 65537(216+1) 같은 큰 소수로 설정해야만 안전합니다.
4. RSA의 응용 및 최적화 이슈
1. RSA 알고리즘은 왜 안전할까? (보안의 핵심)
해커가 개인키를 알아내려면 Φ(n) 값을 반드시 계산해야 합니다.
하지만 Φ(n)을 구하려면 거대한 수 n을 두 소수 p와 q로 소인수분해(Factorize)해야만 합니다.
n이 2800 이상으로 매우 큰 수일 경우, 이를 소인수분해하는 것은 현재의 컴퓨팅 파워로는 "매우 어렵다(very difficult)" 혹은 사실상 불가능합니다. 이것이 RSA가 안전한 이유입니다.
이전 수업에서 언급했듯이 해커(Trudy)가 가로채는 정보는 공개키 e와 모듈러 n입니다. 해커가 비밀키 d를 구하려면 d⋅e≡1(modΦ(n)) 공식을 풀어야 하므로 Φ(n)의 값을 반드시 알아야 합니다.
Φ(n)=(p−1)⋅(q−1) 이므로, Φ(n)을 알기 위해서는 거대한 수 n을 소수 p와 q로 소인수분해(Factorization)해야 합니다.
현대 수학 및 컴퓨터 공학 관점에서 볼 때, n이 1024비트나 2048비트 단위의 엄청나게 큰 수일 경우 이를 소인수분해하는 것은 우주의 나이만큼이나 오랜 시간이 걸리는 'NP 난제'에 속합니다.
결론적으로 RSA의 안전성은 "큰 수의 소인수분해는 현실적으로 불가능에 가깝다"는 수학적 한계에 철저히 기반을 두고 있습니다.
2. RSA의 응용: 동형 암호화 (Homomorphic Encryption)
RSA는 단순히 데이터를 숨기는 것을 넘어, 암호화된 상태(Ciphertext) 그대로 유의미한 연산을 수행할 수 있는 놀라운 성질을 가지고 있습니다. 이를 동형 곱셈(Homomorphic Multiplication)이라고 부릅니다.
개념: 두 평문 m1과 m2를 각각 암호화한 상태에서 서로 곱한 결과는, 애초에 두 평문을 곱한 뒤 한 번에 암호화한 결과와 완벽하게 일치합니다. E(m1)⋅E(m2)=E(m1⋅m2)
수학적 증명: (동일한 공개키 e와 n을 사용한다고 가정) m1e(modn)⋅m2e(modn)≡(m1⋅m2)e(modn)
숫자 예제 검증: m1=4,m2=3,e=3,n=33 일 때
따로 암호화해서 곱하기: e(m1)=43mod33=31 e(m2)=33mod33=27 31⋅27mod33≡(−2)⋅(−6)mod33=12mod33
곱한 뒤 암호화하기: e(4⋅3)=123mod33
이것은 (4⋅3)3mod33=43⋅33mod33=31⋅27mod33 이 되어 결국 위와 똑같이 12mod33 이 나옵니다!
참고 (Homomorphic ADD): RSA는 동형 곱셈만 지원하지만, 'Paillier(파이에)' 알고리즘 같은 것을 사용하면 암호문끼리 곱했을 때 평문끼리의 '덧셈' 결과를 얻어낼 수도 있습니다.
활용: 이 성질을 이용하면 클라우드 서버나 데이터베이스 관리자가 사용자의 실제 데이터(평문)를 전혀 들여다보지 않고도 암호문 상태로 데이터 연산을 수행할 수 있습니다.
3. RSA 연산 최적화: 고속 거듭제곱 (Fast Exponentiation)
RSA의 암/복호화 과정에는 x1024처럼 지수(Exponent)가 엄청나게 큰 모듈러 거듭제곱 연산이 필수적으로 수반됩니다. 이를 컴퓨터로 어떻게 효율적으로 계산할지가 핵심 문제입니다.
[비교 1] x4 계산하기
Naive (단순 반복): x⋅x⋅x⋅x→ 곱셈 3번 필요
Better (제곱 활용): x2⋅x2=x4→ 곱셈 2번 필요
[비교 2] x8 계산하기
Naive: 곱셈 7번 필요
Better: x4⋅x4=x8→ 곱셈 3번 필요 (x→x2→x4→x8)
나이브 접근법 (Naive Approach): x4를 구할 때 x⋅x⋅x⋅x처럼 하나씩 차례대로 곱하는 방식입니다.지수가 21024일 경우 총 21024−1번이라는 천문학적인 횟수의 곱셈(선형 복잡도, O(n))을 수행해야 하므로 사실상 계산이 불가능합니다.
효율적인 접근법 (Better Approach): x→x2→x4→x8 처럼 앞서 계산한 결과값을 통째로 제곱(Square)해 나가는 방식입니다.
이렇게 하면 지수가 21024일 때 겨우 1024번의 곱셈(로그 복잡도, O(logn))만으로 결과를 얻어낼 수 있습니다.
Q. 지수가 홀수이거나 2의 거듭제곱 꼴이 아닐 때는 어떻게 하나요?
이때 사용하는 범용적인 알고리즘이 바로 'Square-and-Multiply Algorithm'입니다. 자세한 동작 방식은 다음 수업 시간에 이어서 다루게 될 예정입니다.