최근에는 학교 시험을 많이 쳐서 블로그에 글을 올리지 못했다. 여름방학 목표 글에서도 썼지만 이번 학기는 배운 게 정말 많은 학기였다. 

어떤 과목을 들었고, 어떤 것을 배웠는지, 어떤 것을 느꼈는지를 전공 위주로 간단하게 정리해보려고 한다.


현대대수학 1

  • 수학으로 뭘 하려면 근본이 중요한 것 같고, 그런 면에서 더욱 중요했던 과목
  • 아는 내용이 많아서, 특히 군론은 선형대수학 2와 겹치는 부분이 많아서 새로 배운 것은 적었음
  • Burnside's Lemma를 쓰는 문제가 나왔는데, 어이없는 실수를 해서 틀렸다. 솔직히 매우 부끄럽다 ㅋㅋ
  • 현대대수학 2에서는 진짜 많은 것을 배울 수 있을 것 같아서 기대를 하고 있다

수치선형대수

  • 처음에는 '수치'란 이름이 붙어서 오차분석에 더 비중을 둔 과목일 줄 알았다
  • 실제로는 선형대수학 알고리즘을 다루는 과목이었다. 어쨌든 재미는 있었음
  • 배우는 건 정말 많은데, 나름 최근에 나온 이론도 많아서 그런지 100% 이해를 한 이론은 적다
  • 아쉬운 면도 있지만 학부 3학년 과목에서 모든 내용을 다루기엔 무리가 있으니 이해가 된다
  • Gaussian Elimination, LU Decomposition, Cholesky Decomposition, QR Decomposition, Singular Value Decomposition
  • Least-Square Approximation과 그 계산 방법
  • Givens Rotation과 Householder Reflection을 활용한 QR Decomposition의 계산
  • 행렬의 Eigenvalue를 계산하는 알고리즘들 (QR Iteration, Single/Double Shift Francis Algorithm 등)
  • Symmetric 행렬의 Eigenvalue를 계산하는 알고리즘들
  • Iterative Methods for solving $Ax = b$ (Jacobi, Gauss-Seidel, SOR, Steepest Descent, Conjugate Gradient)
  • Arnoldi Decomposition과 이를 활용한 다양한 알고리즘
  • 이 글을 작성하는데 많은 도움을 준 과목이다
  • 과제가 많았는데 그래도 나름 유익했고, 시험은 거의 선형대수학으로 나와서 아쉬웠다

암호론

  • 정수론을 매우 좋아하는 만큼 정수론을 써먹는 방법을 알고 싶어서 들어왔다
  • 근데 정작 요즘 메타는 정수론에서 벗어난 것 같다. 하지만 여전히 엄청 재밌는 수학이 많이 쓰이는 것 같다
  • 학문 자체가 진짜 재밌어서 (여름방학 계획에서 말했듯이) 더욱 깊은 공부를 하려고 한다
  • 그래서 암호학 분야 CTF도 시작했고, 논문도 몇 개 읽으려고 한다. 이에 대해서는 아래에서 더 말한다
  • 수업에서는 암호론 분야 전반을 다뤘다. 블록암호, RSA, 전자서명, 비밀공유, 양자내성, 동형암호 및 최신동향을 다 다룬다
  • 내용을 배우고 찾아보면서 진짜 신기한 것들을 많이 배웠는데, 이런 것들은 한 번 블로그에 정리를 할 것 같다
  • 3학년 1학기가 되면 가능하면 암호론 랩에 가고 싶다는 게 지금 생각. 웬만하면 안 바뀔 것 같다

해석개론 및 연습 1

  • 수학 근본을 챙기기 위한 과목이다
  • 교수님이 수업을 굉장히 열정적으로 하셔서 재밌게 들을 수 있었다
  • 해석개론 및 연습 2를 가면 더욱 깊이있는 내용을 배울 수 있을 것 같아서 기대가 된다

양자 컴퓨팅 및 정보의 기초

  • 생각보다 암호론과의 시너지가 잘 맞는 과목이었다. 함께 들을 수 있어서 좋았다
  • 암호론에서 '양자컴이 나오면 RSA가 깨진다, 블록암호 길이도 2배 늘려야 한다'라는 내용을 배웠다
  • 그 이유를 이 수업에서 전부 배울 수 있었다 (Shor Algorithm, Grover Algorithm)
  • 물리 근본이 없어서 걱정을 많이 했는데, 좋은 친구들이 도와줘서 어떻게 어떻게 잘 된 것 같다

 

종강 이후로는 바킹독님의 추천을 받아서 CryptoHack이라는 사이트를 많이 풀었고, 비슷한 사이트인 id0-rsa.pub도 풀고 있다.



문제를 풀다가 내 블록암호에 대한 지식이 어마어마하게 얕다는 것을 많이 느껴서, 이쪽으로 공부를 잠깐 할 생각이다.

읽을 논문도 결정했는데, 우선 ROCA Vulnerability와 Bleichenbacher 공격에 대해서 제대로 읽어보려고 한다.

저번에 Lattice에 대한 지식이 전무해서 읽지 못했던 RSA에 대한 Survey Paper의 일부분도 읽고 정리할 것 같다.

암호론 시험공부를 하면서 동형암호 HEAAN에 대한 논문/자료도 열심히 읽었는데, 이것도 제대로 읽으려고 한다.

가능할지는 모르겠는데, 예전 노트북에 Linux를 깔아서 HEAAN은 직접 프로그래밍을 하면서 익숙해지려고 한다. 

그리고 최근에 올렸던 특성다항식의 빠른 계산을 백준 문제로 만들어서 올릴 계획을 세우고 있다.


마지막으로 2학기에 듣고 싶은 과목을 소개한다. 이대로 들을 수 있으면 진짜 좋겠다 ㅋㅋ


해석개론 및 연습 2, 현대대수학 2 : 수학 근본 챙기는 과목, 못 들을 이유가 없다

수치해석개론, 최적화의 수학적 이론 및 계산, 대수적 코딩이론 (택 2) : 수학 응용 챙기는 과목

컴퓨터 프로그래밍, 자료구조, 알고리즘 (택 2) : 컴공 전공 챙기는 과목, 복수전공하니까 이제 들을 수 있을거라 믿는다

계산수론 (청강) : 이미 좋아하는 분야인만큼, 꼭 들어보고 싶다. 랩을 가는 것에도 도움이 되지 않을까?


저렇게 들으면 21학점이 나온다. 근데 1학기 학점은 잘 나올까? ㅋㅋ


UPD: 1학기 학점은 잘 나왔고, 암호학 리딩은 많이 못했다. 방학 때 너무 놀았음 ㅋㅅㅋ

'미래 계획 및 근황' 카테고리의 다른 글

1월 정산 + 2월 계획 + 1학기 수강신청  (1) 2021.02.01
2020 : A Retrospective  (9) 2020.12.27
여름방학 목표  (0) 2020.06.19
겨울방학 목표 정리  (4) 2019.11.29
대충 최근에 한 것 모음  (0) 2019.10.14

정말 많은 것을 배운 한학기였다.


해석개론 및 연습 2 내용 미리 가볍게만 예습

정보처리기능사 실기 따기

양자컴퓨팅 강의 못 본 것들 다시보기

암호론 CTF 입문 : CryptoHack, id0-rsa.pub 가능한만큼 풀기

Matroid 관련 내용 공부하기 (알고리즘 구현까지)

이인석 교수님의 "대수학" 초반부분 공부하기 (대수적코딩이론 듣는 경우 -> 안 들을 가능성 높음)


Problem Solving (적당히 하고, SCPC 준비 위주로)

Project Euler 푸는 것 계속하기 (근데 정작 PE가 여름방학이라서, 이거는 많이 못할듯)


계절학기 과하게 하지말고 적당히 듣기

'미래 계획 및 근황' 카테고리의 다른 글

2020 : A Retrospective  (9) 2020.12.27
1학기 후기 || 최근에 한/할 것들 || 2학기 계획  (0) 2020.06.23
겨울방학 목표 정리  (4) 2019.11.29
대충 최근에 한 것 모음  (0) 2019.10.14
2019년 2학기 목표  (0) 2019.09.04

Hackenbush에 대한 간단한 튜토리얼을 쓰려고 하는데, 내가 이걸 잘 아는 거는 아니라서 (...) 증명 및 깊이 있는 이론들은 (ordinal 등장 등) 대부분 생략하고 알고리즘 문제 풀이에 써먹을 수 있는 부분들만 간략히 추려서 쓰려고 한다. 자세한 증명은 구글에 검색하면 자료가 매우 많으니 찾아보는 것을 추천한다 :)

 

Hackenbush 게임은 두 명이서 하는 게임으로, 여러 가지 버전들이 존재하지만 근본적인 목표는 똑같다.



위 그림과 같이, 일종의 그래프가 지면에 연결되어 있는 상태에서 게임이 시작된다. 

각 플레이어는 순서대로 간선 하나를 제거하는데, 이때 더 이상 지면에 연결되지 않게 되는 간선들은 모두 삭제된다.

일반적인 룰에서는 (normal play convention) 간선을 제거하지 못하게 되는 플레이어가 패배한다.

간선이 무한히 많은 경우도 존재하지만, 여기에서는 유한한 개수의 간선이 존재한다고 가정한다.

그러면 게임이 확실하게 Sprague-Grundy 방식으로 분석이 가능해진다. 이를 위해서 다음 Principle을 활용한다.


Colon Principle: 그래프 $G, H, K$가 있다. $H, K$의 Grundy 값이 같다면, $G$의 정점 $x$에 $H$를 붙인 그래프와 $x$에 $K$를 붙인 그래프의 Grundy 값이 동일하다. 그러므로, 한 점에서 '가지치기'가 되는 그래프가 있다면, 각 가지들의 Grundy 값의 XOR에 해당하는 길이의 일직선을 붙이는 것으로 가지들을 대체할 수 있다. 이를 통해서 트리 그래프에 대한 분석을 끝낼 수 있다. DFS를 돌면서 서브트리의 Grundy 값을 순서대로 계산하면 된다.


Fusion Principle: 두 정점이 한 사이클 위에 놓인다면 (지면을 하나의 노드로 본다) 두 점을 하나로 합쳐도 Grundy 값이 변하지 않는다. 

이때 두 점을 잇는 간선들은 self-loop가 된다. 이 성질을 이용하면, 임의의 그래프에 대한 Grundy 값을 구할 수 있다.

실제로 이를 활용하는 문제는 본 적이 없지만, 아무튼 이를 이용하면 기본 Hackenbush에 대한 분석은 끝이다.


연습문제: Project Euler 400 Fibonacci Tree Game, BOJ 13893 Dictionary Game

두 문제 다 Hackenbush에 대한 이해와 적당한 구현을 (DP/Trie 등) 통해서 해결할 수 있다. Fusion Principle은 필요 없다.


Blue-Red Hackenbush는 조금 색다르다. 이제는 각 간선마다 누가 자를 수 있는지가 둘 중 한 명으로 정해져 있다.

각 플레이어를 Blue/Red라고 하고, Blue 간선은 Blue만, Red 간선은 Red만 자를 수 있도록 한다.

이때는 각 연결 컴포넌트 $G$에 대하여, 그 컴포넌트의 값 $v(G)$를 다음과 같이 재귀적으로 정할 수 있다.

아무것도 없는 그래프의 경우 값은 자명하게 $0$이다. $G$가 nonempty라고 가정하자.

$b$를 Blue가 만들 수 있는 상태 $G'$ 중 $v(G')$의 최댓값이라 하자. 불가능한 경우 $-\infty$.

$r$을 Red가 만들 수 있는 상태 $G'$ 중 $v(G')$의 최솟값이라 하자. 불가능한 경우 $\infty$.

만약 $b < n < r$인 정수 $n$이 존재한다면, $v(G)$는 해당하는 정수 $n$ 중 $0$에 가장 가까운 것이다. 

그렇지 않다면, $v(G)$는 $b < x < r$을 만족하는 유리수 $x$ 중 분모가 $2$의 거듭제곱인 것 중에서 분모가 최소인 것이다. 


또한, 독립적인 그래프 $G, H$에 대하여 $v(G+H) = v(G) + v(H)$가 성립한다.

만약 $v(G) > 0$이라면 Blue가 승리, $v(G) < 0$이라면 Red가 승리, $v(G)= 0$이라면 후공 승리가 된다.


이 게임에 대한 직관적인 이해를 원한다면 stonejjun의 블로그를 찾아보는 것을 추천한다.


이걸 모두 짬뽕한 Blue-Red-Green Hackenbush도 있는데, 이건 진짜 무서워 보인다 ㅋㅋ


연습문제: BOJ 13409 Black and White Boxes, BOJ 18945 조직된 ㄱ폭탄 게임

13409는 Hackenbush 값을 계산한 다음 Meet In The Middle을 하면 간단하게 해결할 수 있다.

18945는 몇 가지 관찰을 한 다음, 문제를 Blue-Red Hackenbush로 변형하여 해결할 수 있다.


이 글의 진짜 목적 중 하나가 18945의 풀이를 적는 것이니, 여기에 소개한다.

각 게임을 독립적인 Blue-Red Hackenbush 게임으로 보고, 그에 대응하는 값을 계산하자. 

그러면 남은 쿼리들은 전부 단순한 point update range query 문제가 되므로, 펜윅/세그먼트 트리를 이용하여 계산할 수 있다. 

그러니 문제 난이도의 99%는 각 게임을 Blue-Red Hackenbush 게임으로 변환하는 것에서 나온다. 


일반성을 잃지 않고 A 폭탄이 하나 존재한다고 가정하자. 그러면 B 폭탄을 3가지 종류로 나눌 수 있다.

종류 1: A 폭탄이 터지면 강제로 제거되는 B 폭탄들

종류 2: 터뜨리면 A 폭탄이 터지게 되는 B 폭탄들

종류 3: A 폭탄과 서로 interact 할 수 없는 (즉, 하나가 터져도 다른 하나가 터지지 않음) B 폭탄들


이 게임판에서 A가 할 수 있는 행동은 단순히 A 폭탄 하나를 터뜨리는 것 뿐이다. 

B가 할 수 있는 행동은 다양한데, 실제로 고려해야 하는 것은 몇 가지 없음을 알 수 있다.

우선 종류 3의 폭탄과 같은 경우에는 애초에 A 폭탄이 터지던 말던 상관이 없기 때문에, 최대한 마지막에 터뜨리는 것이 좋다. 

물론, 자신이 터뜨린 폭탄에 의해 자신의 다른 B 폭탄이 쓸데없이 터지지 않도록 순서를 잘 정해서 터뜨려야 한다.

종류 2의 폭탄은 터뜨린다면 강제적으로 종류 1의 폭탄 중 남아있는 것은 무조건 터지게되며, 경우에 따라서 종류 3의 폭탄 역시 터질 수 있다. 

그러니 A 폭탄을 제거할 목적으로 종류 2의 폭탄을 터뜨린다면 종류 3의 폭탄을 최소한으로 터뜨리도록 하는 폭탄을 하나 찾아서 그걸 터뜨려야 한다.  

종류 1의 폭탄은 터뜨린다면, 다른 종류 1의 폭탄을 터뜨리지 않도록 행/열 순서를 잘 잡아서 순서대로 터뜨려야 한다.


이를 종합하면, 다음과 같은 Blue-Red Hackenbush 그림을 그릴 수 있다. A가 Red, B가 Blue라고 하자.



그래프가 특수한 형태를 가진다. 그러니, 이와 같은 경우에서 Hackenbush 값은 아예 closed form 식을 통해서도 구할 수 있다.

나는 DP를 이용하여 위에서 설명한 규칙을 직접 적용하는 방식으로 구현했다. 분수를 다루기 귀찮으니, 적당히 큰 2의 거듭제곱을 곱해줘서 다루면 편하다. 

'PS > 수학 계열 PS' 카테고리의 다른 글

8월의 PS 일지 - Part 3  (0) 2020.08.10
8월의 PS 일지 - Part 1  (0) 2020.08.04
5월의 PS 일지 - Part 1  (0) 2020.05.16
4월의 PS 일지 - Part 5  (0) 2020.05.02
4월의 PS 일지 - Part 4  (1) 2020.04.25

바쁘기보다는 게을러서 PS를 안했다. 또 수학 PS 연습을 팠는데, 슬슬 머리가 터질 것 같고 진짜 PS가 하고 싶어졌다.

2주간 진행한 연습에서 6/12문제를 해결하였다. 그 중 단순한 사전지식 문제도 꽤 포함되어 있다.

아래에 소개한 내용 외에도 5월에는 Project Euler 715를 풀었는데, 5등을 기록했고 만족하고 있다. 

Thread에도 꽤 유의미한 내용을 두 개 제공해서 kudos도 많이 받고 기쁘다. 이 기회에 Eulerian 랭킹 상위권을 시도하려고 한다.

GCJ Round 2도 쳤고 작년보다는 등수가 많이 떨어졌고 뇌절도 많이했지만 아무튼 티셔츠는 받아서 다행이다.

감이 엄청 떨어진 것 같으니 시간나면 플레티넘 문제부터 다시 차근차근 푸는 연습을 해야겠다.

또한, 지금 진행되고 있는 대회인 Semi-Game Cup의 검수를 맡아서 몇 문제 풀었다. :)



BOJ 18465 Horrible Cycles (K, Ruby V)

BOJ 18630 Lati@s (J, Ruby IV)

BOJ 18461 Disjoint LIS (I, Ruby IV)

BOJ 10057 Pachinko (L, Ruby V)

BOJ 18622 Dedenne (H, Ruby IV)

BOJ 17160 Traffic Blights (G, Ruby IV)


'PS > 수학 계열 PS' 카테고리의 다른 글

8월의 PS 일지 - Part 1  (0) 2020.08.04
Brief Introduction to Hackenbush Games  (1) 2020.05.17
4월의 PS 일지 - Part 5  (0) 2020.05.02
4월의 PS 일지 - Part 4  (1) 2020.04.25
Project Euler 500문제 및 문제 추천  (0) 2020.04.12

연습을 계속하고 있다. 21/26 문제를 해결하는 것으로 일단 종료. 4월에 시작한 연습이니까 4월 카테고리에 넣는다.

남은 문제들은 다 너무 어려워서 못 풀겠다. 일단 수학 PS는 질리도록 했으니 다른 것부터 하는 게 좋을 듯.



4월 30일


BOJ 5627 박테리아 (T, Diamond III)

BOJ 12735 Boat (R, Diamond III)

BOJ 18480 Four Elements (H, Ruby V)


5월 1일


BOJ 18297 Pixels (O, Diamond III) 


5월 2일


BOJ 14639 Replicate Replicate Rfplicbte (N, Diamond II)

BOJ 18527 All Kill (I, Ruby IV)

BOJ 18574 Fractional XOR Maximization (E, Ruby V)


5월 4일


BOJ 18791 N의 배수 (2) (Y, Diamond III)

BOJ 18792 N의 배수 (3) (Z, Diamond I)


'PS > 수학 계열 PS' 카테고리의 다른 글

Brief Introduction to Hackenbush Games  (1) 2020.05.17
5월의 PS 일지 - Part 1  (0) 2020.05.16
4월의 PS 일지 - Part 4  (1) 2020.04.25
Project Euler 500문제 및 문제 추천  (0) 2020.04.12
2월의 PS 정리 - Part 3  (3) 2020.02.29

수학 문제를 더 풀고 싶어서 (집 나간 수학 근본 찾고 싶어서) 26문제 연습셋을 만들고 풀고 있다. 

글을 쓰기 시작한 4월 25일 오후 3시 시점에서는 12문제를 해결했다. 우선 이 문제들부터 풀이를 작성한다.

26일, 27일에는 갑자기 일이 생겨서 + 게을러져서 문제를 해결하지 못했다. 대신 풀이는 몇 개 생각한듯.



4월 21일


BOJ 18743 Bin (K, Ruby V)


4월 22일


BOJ 17118 갓 소수 (W, Diamond V)

BOJ 17993 Elven Efficiency (U, Diamond III)


4월 23


BOJ 18556 Count The Sequences (D, Ruby V)

BOJ 18718 Bags of Candies (P, Diamond II)


4월 24일


BOJ 18745 Div (L, Diamond I)

BOJ 18607 Domino Covering (A, Ruby II)

BOJ 11609 Particle (X, Diamond V)

BOJ 18746 Exp (M, Diamond I)

BOJ 8134 Crystals (Q, Diamond III)


4월 25일


BOJ 1140 요금 (S, Diamond III)

BOJ 18347 완벽한 순례 (V, Diamond IV)


'PS > 수학 계열 PS' 카테고리의 다른 글

5월의 PS 일지 - Part 1  (0) 2020.05.16
4월의 PS 일지 - Part 5  (0) 2020.05.02
Project Euler 500문제 및 문제 추천  (0) 2020.04.12
2월의 PS 정리 - Part 3  (3) 2020.02.29
JAG Summer Camp 2018 Day 2  (0) 2020.02.19


최근에 프젝 문제를 열심히 풀어서 500문제를 찍었다. 

아래는 분야별 문제 추천으로, 아마도 난이도 순이다. 급하게 뽑아서 나중에 더 추가/삭제할 수 있다.


정수론: 379, 435, 441, 492, 530, 608, 588, 330, (445, 446, 447), 639, 578, 611, 439, 484

조합론: 227, 503, 658, 517, 687, 645, 661, 651, 614, 544, 626,

미적분학, 게임 이론 등 기타: 509, 363, 640, 629, 550, 547, 400, 436, 693, 560, 674

'PS > 수학 계열 PS' 카테고리의 다른 글

4월의 PS 일지 - Part 5  (0) 2020.05.02
4월의 PS 일지 - Part 4  (1) 2020.04.25
2월의 PS 정리 - Part 3  (3) 2020.02.29
JAG Summer Camp 2018 Day 2  (0) 2020.02.19
Project Euler 450문제  (0) 2020.02.08

"Twenty Years of Attacks on the RSA Cryptosystem" - Dan Boneh

RSA에 대한 공격을 가장 자세하게 잘 다루는 review paper인 것 같다. 인용 횟수가 900번 근처다...

논문 리딩은 기본적으로 복습을 하면서 더 배우려고 하는 것이기 때문에, 내가 배운 내용도 조금씩 추가하면서 쓰겠다.

또한, Lattice를 제대로 알아야 (특히 LLL) 더욱 자세하게 글을 쓸 수 있을 것으로 보인다. 일단은 맛만 보는 걸로.


#1: Introduction

RSA는 카이사르 암호와 함께 가장 유명한 암호체계 중 하나일 것이다. 1977년 공개된 이 암호체계는 지금도 사용되고 있다. 

많이 사용되는 체계인만큼, 많은 암호학자들은 이 체계의 허점을 찾기 위해서 수많은 공격 방법들을 제시해왔다. 

공격 방법을 탐구하는 과정을 통해서, 암호학자들은 RSA를 안전하게 구현하고 활용하는 방법을 더욱 알아가게 되었다.

논문의 목적은 이러한 공격들을 돌아보면서, 공격을 위한 수학적 도구에는 어떤 것이 있으며, 이를 막는 방법을 알아보는 것이다.


먼저 Textbook RSA를 살펴보자. $p, q$를 크기가 비슷한 큰 소수라 하고, $N=pq$라 하자. 두 자연수 $e, d$는 $ed \equiv 1 \pmod {\phi(N)}$을 만족하는 자연수다. 여기서 $\phi(N) = (p-1)(q-1)$이다. 이때 $N$을 RSA modulus, $e$를 encryption exponent, $d$를 decryption exponent라고 부른다. $\langle N, e \rangle$은 모두 공개되어 있고 (공개키), 메세지를 암호화하는데 사용할 수 있다. 한편, $\langle N, d \rangle$은 비밀이며 (비밀키), 암호화된 메세지를 받는 사람만이 알고 있다. 메세지를 받는 사람은 비밀키를 이용하여 실제 메세지를 확인할 수 있다. 여기서 메세지란, $M \in \mathbb{Z}_N^{*}$을 말한다. $M$을 암호화하려면, $C \equiv M^e \pmod{N}$을 계산하면 된다.

이를 복호화하려면, $M \equiv C^d \pmod{N}$을 계산하면 된다. 여기서 $ed \equiv 1 \pmod{ \phi(N)}$과 오일러의 정리를 이용한다.

RSA 함수를 $x \rightarrow x^e \pmod{N}$으로 정의하자. $d$를 알면, 이 함수의 역을 쉽게 구할 수 있다.

슬슬 One-Way Function의 느낌이 나온다. 이러한 상황에서, 암호학자들은 $d$를 trapdoor라고 부른다.

trapdoor가 있는 one-way function은 전자서명 등에서 활용될 수 있다. 여기서 RSA의 유용함을 알 수 있다.

메세지 $M$을 내가 보냈다는 것을 인증하려면, 비밀키 $d$를 이용하여 $M^d \pmod{N}$을 사람들에게 주면 된다. 

그렇다면, 다른 사람들은 공개키 $e$를 이용하여 $M \equiv (M^d)^e \pmod{N}$, 즉 실제 메세지를 얻는다.


여기서는 $d$에 대한 정보가 없을 때, RSA 함수의 역함수를 계산하는 난이도에 대해서 다루도록 한다.

즉, $N, e, C$가 주어진 경우, $C$의 discrete $e$-th root modulo $N$을 구하는 난이도에 대해 다루는 것이다.

당연히 전수조사의 방법이 있으나, 이는 역시 당연하게도 매우 비효율적이다. 불가능하다고 보는 게 맞겠다.

우리가 관심이 있는 대상은 당연히 실제로 사용될 수 있는 공격들, 특히 다항식 시간을 필요로 하는 공격들이다.


실제 RSA를 이용한 암호체계는 단순한 RSA 함수 응용의 범주를 넘어간다. 안전한 암호가 되려면 빡빡한 기준을 통과해야 한다.

단순하게 RSA 함수를 이용하여 암호화를 하면, 메세지 $M$에 대한 non-trivial information을 손쉽게 얻을 수 있다.

대표적으로, $M$의 modulo $N$에 대한 Jacobi Symbol의 값을 매우 간단하게 얻을 수 있다.

또한, 단순하게 RSA 함수를 이용하여 암호화를 하면 adaptive chosen ciphertext attack에 아주 간단하게 당한다.

복호화를 하고 싶은 $C \equiv M^e \pmod{N}$이 있다고 하자. $2^eC$를 복호화하는 쿼리를 날려보자.

그러면 얻는 답은 $(2^eC)^d \equiv 2C^d \equiv 2M \pmod {N}$이다. 여기서 $M$을 복원하는 것은 쉬운 일이다.

그러니 실제로 RSA를 이용해서 암호화를 하려면, "랜덤함"으로 적당히 간을 쳐서 암호화를 할 필요가 있다. 여기서는 다루지 않는다.


RSA를 사용하기 위해서는, 먼저 큰 소수 $p, q$를 잡는다. 랜덤하게 큰 수를 잡고 적당한 소수 판정법을 쓰면 된다.

그 후 $N = pq$를 얻은 뒤, 적당한 $e$를 잡고 modulo inverse를 계산하는 알고리즘으로 $d$를 계산한다.

물론, 소수는 충분히 많기 때문에, 이러한 방법으로도 RSA key pair를 효율적으로 생성할 수 있다. 


RSA를 공격하는 가장 생각하기 쉬운 방법은 사실 그냥 $d$를 찾는 것이다. $d$를 어떻게 찾을 수 있을까?

가장 쉬운 접근은 역시 $\phi(N)$을 찾는 것이다. 그런데 이는 $N$을 소인수분해하는 것과 동치임을 쉽게 파악할 수 있다.

소인수분해가 얼마나 어려운 문제인지는 꽤 잘 알려져 있다. GNFS가 현재까지는 가장 빠르지만, 여전히 느리다.  

하지만, 쉽게 소인수분해가 가능한 수 역시 존재한다. 예를 들어보면, Pollard의 $p-1$ 알고리즘이 있다.

만약 $p-1$이 작은 소수들의 곱으로 표현이 된다면, 이 알고리즘을 통해서 $N=pq$를 인수분해 할 수 있다.

비슷한 접근으로, Williams의 $p+1$ 알고리즘도 존재한다. 이런 알고리즘으로 인수분해가 가능한 $N$은 사용하면 안된다. 


어쨌든, 인수분해가 가능하다면 RSA는 쉽게 깰 수 있다. 반대는 어떨까? 

즉, RSA를 효율적으로 깰 수 있으면 인수분해 역시 효율적으로 할 수 있을까? 이는 open problem이다.

만약 "가능하다"가 답이라면, chosen ciphertext attack으로 RSA를 깰 수 있다고 한다.


한편, $N$의 인수분해를 알면 우리는 $d$를 쉽게 계산할 수 있다. 반대는 어떨까?

즉, $d$를 안다면 $N$의 인수분해를 쉽게 계산할 수 있을까? 이는 "가능하다"가 답이다. 증명을 보자.


Theorem. RSA의 기본 조건을 만족하는 $e, d, N$을 아는 경우 $N$을 소인수분해 할 수 있다.

#2: Elementary Attacks

첫 번째로 살펴볼 것은 메세지 자체가 크기가 작은 경우이다. 만약 $M$이 크기가 작고, 크기가 비슷한 두 자연수의 곱으로 표현될 수 있다고 하자. 이 경우, 간단한 meet-in-the-middle attack을 통해서 메세지를 복원할 수 있다. Key의 크기가 커도 메세지의 크기가 작으면 소용없다는 점을 간과한 경우 발생하는 문제다. 

이와 같이 RSA를 잘못 활용한 경우 이를 공격하는 방법을 여기서 더 소개한다.


두 번째로 살펴볼 것은, 모든 사람들에게 공통된 $N$을 사용하게 하는 경우 발생하는 문제점이다. 

각 사람들마다 서로 같은 $N$을 주는 대신, 각 사람들에게 $e_i, d_i$를 부여하면 어떻게 될까? (물론, $p, q$는 알려주지 않는다)

다른 사람의 공개키 $e_i$를 봐서 $d_i$를 계산할 수 없으므로 ($p, q$는 모르니까) 이 방법은 잘 먹힐 것처럼 생겼다.

하지만 앞에서 보았듯이, $e_i, d_i, N$을 알면 효율적으로 $N$을 소인수분해 할 수 있다. 그러니 이렇게 하면 나라 망한다.

즉, 모든 사람들이 서로 다른 $N$을 갖도록 해야 안전한 암호체계를 만들 수 있다.


세 번째로 살펴볼 것은, "blinding"이란 것이다. Eve가 Alice에게 메세지 $M \in \mathbb{Z}_N^{*}$에 대한 전자서명을 원한다고 하자.

즉, $M^d \pmod{N}$을 원하는 것이다. 물론 호구가 아닌 이상 Alice가 Eve의 말을 듣고 전자서명을 하지는 않는다.

하지만, Eve가 적당한 $r \in \mathbb{Z}_N^{*}$를 랜덤하게 잡고, $M' \equiv r^eM \pmod{N}$을 계산했다고 하자.

이제 Eve는 Alice에게 $M'$에 대한 전자서명을 부탁한다. Alice는 $r$의 존재도 모르고 그러니 $M$도 모른다.

이제 Alice는 큰 문제가 없게 생긴 $M'$에 대한 전자서명을 줄 수도 있다. 이때, 그 전자서명의 값은 $rM^d \pmod{N}$이 된다.

결국 Eve는 $r$의 modulo inverse를 취해줘서 $M^d \pmod{N}$의 값을 얻게 된다. 전자서명이 뚫린 것이다.

물론, 실제 RSA를 이용한 전자서명이 이렇게 간단하지는 않으므로, 걱정은 하지 않아도 된다. 

또한, 논문에 의하면 blinding이 가능하다는 점을 이용하여 "anonymous digital cash"를 구현할 수 있다고 한다. 


#3: Low Private Exponent

애초에 작은 $d$ 값을 왜 사용하고 싶어하는 걸까? 이유는 시간에 있다. $d$가 작을수록 decryption에 필요한 시간이 줄어들기 때문이다. 

적은 계산 시간은 솔깃하지만, 작은 $d$ 값은 보안성 입장에서 볼 때 매우 위험하다. 다음 공격을 소개한다. 


Theorem. (Wiener's Attack) $N = pq$고, $q < p < 2q$라 하자. $d < \frac{1}{3} N^{1/4}$라 하자.

$ed \equiv 1 \pmod{\phi(N)}$인 $N$과 $e < \phi(N)$이 주어졌을 때, $d$를 효율적으로 복원할 수 있다.

이 attack을 회피하면서 빠르게 decryption을 할 수 있는 방법은 없을까? Wiener는 이런 방법을 2개 제시했다.

이 방법들은 안전성이 증명된 것은 아니나, 최소한 Wiener's Attack은 회피할 수 있다. 


첫 번째 방법은 $e$를 키우는 것이다. 위 증명을 살펴보면, $e < \phi(N)$을 사용하였다.

이를 대신하여, 큰 자연수 $t$를 잡고 $e' = e + t \cdot \phi(N)$을 이용하자. 당연히 $d$의 값에는 변화는 없다.

위 증명과 같은 방식으로 계산을 하면, $e' > N^{1.5}$일 경우 $d$가 아무리 작아도 이 방법으로 공격을 할 수는 없음을 확인할 수 있다.

물론, encryption exponent를 키우면 encryption에 소모되는 시간이 매우 커진다. 일종의 trade-off라고 봐야겠다.


두 번째 방법은 CRT를 이용하는 것이다. 복호화 과정의 결과값을 $\pmod{p}$와 $\pmod{q}$에 대해 따로 계산하자는 것이다.

만약 $d_p \equiv d \pmod{p-1}$과 $d_q \equiv d \pmod{q-1}$이 둘 다 작다면, 이는 효율적으로 계산할 수 있다.

물론, 실제 결과값을 얻고 싶다면 CRT를 이용해주면 된다. 핵심 아이디어는, $d_p, d_q$가 작더라도 $d$가 클 수 있다는 것이다. 그런데 다음이 성립한다.


Theorem. 위 방법을 사용할 때, adversary는 $\mathcal{O}(\operatorname{min}(\sqrt{d_p}, \sqrt{d_q}))$ 시간에 $N$을 소인수분해 할 수 있다.

그러니 결론은 위 최적화를 사용하더라도 적당히 사용해야 한다는 것이다. $d_p , d_q$ 역시 보안을 위해서는 잘 잡아야 한다는 것이다.

Wiener's Attack의 $d$에 대한 bound는 이후 더욱 개선되었다. $d < N^{0.292}$면 $N, e$를 통해 $d$를 복원할 수 있다는 것을 Boneh와 Durfee가 증명하였다. 

또한, $d < N^{0.5}$라면 $N, e$를 통해 $d$를 복원할 수 있다는 것이 강력한 추측이다. 이는 open problem이다.


#4: Low Public Exponent

이제는 $e$가 작은 경우를 다룬다. 작은 $e$가 매력적인 이유는 encryption에 드는 시간이 줄어들기 때문이다.

하지만 앞서 $d$에 대해서 살펴본 내용들과 마찬가지로, 작은 $e$를 사용하면 다양한 공격의 표적이 될 수 있다.

$e$로 사용할 수 있는 가장 작은 값은 $3$이지만, 아래에 제시된 공격들을 막기 위해 $e=2^{16}+1$이 자주 사용된다.

아래에서 다룰 공격들의 중심에는 Coppersmith의 정리가 있다. 이를 완전히 이해하려면 Lattice에 대한 이해가 필수적이다.

아직은 내가 Lattice를 배우지 않았으니, 지금은 단순히 statement를 적고 넘어간다. 나중에 더 깊은 내용을 추가하는 것이 목표다.


Theorem. (Coppersmith) $N$은 자연수고, $f \in \mathbb{Z}[x]$는 최고차항의 계수가 $1$인 $d$차 다항식이다. $\epsilon \ge 0$을 잡고, $X = N^{1/d - \epsilon}$이라 하자. $N, f$가 주어졌을 때, $|x_0| < X$와 $f(x_0) \equiv 0 \pmod{N}$을 만족하는 $x_0$를 모두 다항식 시간에 찾을 수 있다. 


이 정리의 첫 번째 활용 사례로, Hastad's Broadcast Attack을 알아보자. 

만약 Alice가 메세지 $M$을 여러 사람들에게 전송하고 싶다고 하자. 각 사람들은 $N_i , e_i$를 공개키로 가지고 있다.

그러면 Alice는 $M^{e_i} \pmod{N_i}$를 각각 계산한 다음 이를 각 사람들에게 전송한다. Eve가 이 값들을 전부 확보했다고 가정하자.


가장 간단한 예시로, $e_i$의 값들이 전부 $3$인 경우를 생각해보자. 그러면 값을 $3$개만 확보해도 Eve는 $M$을 복원할 수 있다.

Eve가 $C_1 \equiv M^3 \pmod{N_1}$, $C_2 \equiv M^3 \pmod{N_2}$, $C_3 \equiv M^3 \pmod{N_3}$을 안다고 가정하자. 

그러면 $N_1 , N_2, N_3$가 전부 서로소라고 가정하자. (아니라면, 소인수분해가 간단하게 될 것이다)

이제 중국인의 나머지 정리에서, $M^3 \pmod{N_1N_2N_3}$를 얻을 수 있다. 그런데 $M^3 < N_1N_2N_3$이니, $M$을 얻는다.


이 공격에 대한 간단한 방어를 생각할 수 있다. 각 사람들에게 메세지의 아주 일부를 바꿔서 보내는 것이다.

즉, $i$번째 사람에게 $M^{e_i} \pmod{N_i}$ 대신 $(M+i \cdot 2^m)^{e_i} \pmod{N_i}$를 (물론 $i$와 함께) 보내는 것이다.

여기서 $m$은 $M$의 비트 개수이다. 이 방법은 매우 간단하지만, 위 공격을 막을 수 있을 것으로 보인다.

더욱 일반적으로, 메세지를 전달하고 싶은 사람 $P_1, P_2, \cdots, P_k$가 있을 때, $i$번째 사람에게 $M$을 직접 암호화하는 대신, $f_i \in \mathbb{Z}_{N_i} [x]$를 하나 잡은다음 $f_i(M)$을 암호화하여 (물론, $f_i$와 함께) 보내는 방법을 생각할 수 있다. 이제, Eve가 얻을 수 있는 정보는 다항식 $f_i$와 $e_i, N_i$, $C_i \equiv f_i(M)^{e_i} \pmod{N_i}$이다.  

이 상태에서 Eve가 $M$을 도출하는 것은 매우 어려워보인다. 하지만 충분히 많은 정보를 확보하면 가능하다. Coppersmith's Theorem의 위력을 확인해보자.


Theorem. (Hastad's Attack) $N_1, N_2, \cdots , N_k$는 서로소인 자연수이다. $N_{min} = \operatorname{min}(N_1, N_2, \cdots, N_k)$라 하자. 각 $1 \le i \le k$에 대하여, $g_i \in \mathbb{Z}_{N_i}[x]$는 차수가 $d$ 이하인 다항식이라 하자. $g_i(M) \equiv 0 \pmod{N_i}$이 각 $1 \le i \le k$에 대해서 성립하는 $M < N_{min}$이 유일하고, $k>d$가 성립한다고 가정하자. 이때, $1 \le i \le k$에 대하여 $N_i , g_i$를 전부 알 경우 $M$을 다항식 시간에 찾을 수 있다.

그러니 Eve는 $g_i = f_i^{e_i} - C_i$를 잡은 다음, Hastad's Attack을 활용하여 $M$을 복원할 수 있다.

위 정리의 statement를 다시 읽어보면, 이 공격은 $e_i$의 값들이 작을 때 더욱 강력함도 알 수 있다.

실제로 Broadcast Attack에 대한 방어를 하고 싶다면, "랜덤함"으로 적당히 간을 쳐주면 된다고 한다. 


두 번째 공격은 Franklin-Reiter Related Message Attack이다. $N, e$가 Alice의 공개키라고 하자. 

이제 Bob이 $M_1, M_2 \in \mathbb{Z}_{N}^{*}$를 Alice에게 보내려고 한다.

그런데, 알려진 다항식 $f \in \mathbb{Z}_N [x]$가 있어 $M_1 \equiv f(M_2) \pmod{N}$이 성립한다고 하자.

Bob이 단순하게 $C_1 \equiv M_1^e \pmod{N}$과 $C_2 \equiv M_2^e \pmod{N}$을 계산했다고 하자.

이제, $C_1, C_2$가 주어졌을 때 Eve가 $M_1, M_2$를 복원할 수 있음을 보일 수 있다.

이 공격은 일반적으로 $\mathcal{O}(e^2)$ 정도의 시간을 필요로 한다고 한다. 

일반적인 경우의 증명은 빡센 대수학을 필요로 한다고 하므로, 여기서는 $e=3$이고 $f$가 일차식인 경우를 보인다.


Lemma. $e=3$이라 하고, $N, e$가 RSA를 위한 공개키라고 하자. $M_1 \neq M_2 \in \mathbb{Z}_N^{*}$가 적당한 $f = ax+b \in \mathbb{Z}_N [x]$에 대하여 $M_1 \equiv f(M_2) \pmod{N}$을 만족한다고 하자. 단, $b \neq 0$이다. 이때, $N, e, C_1, C_2, f$를 알면 $M_1, M_2$를 $\mathcal{O}(\log^2 N)$ 시간에 구할 수 있다. 

위 공격을 더욱 강화한 것이 Coppersmith's Short Pad Attack이다. 메세지 $M$에 "랜덤함"으로 간을 해서 암호화를 해야 안전하다고 이미 언급했다.

"랜덤함"으로 간을 하는 가장 간단한 방법은, $M$의 끝에 몇 개의 random bit를 추가하는 것이다. 

하지만 이렇게 간을 대충하면 위험하고, 이를 보여주는 것이 Coppersmith's Short Pad Attack이다.

시나리오는 대강 이런 느낌이다. Alice가 Bob에게 메시지 $M$을 전달하려고 한다. 

이때 Alice는 $M$의 끝에 몇 개의 random bit를 추가하여 암호화한 다음 Bob에게 전송한다. 이를 Eve가 중간에 연결망을 끊어 Bob이 이를 받지 못하게 한다.

그러면 Alice는 $M$의 끝에 몇 개의 random bit를 다시 추가하여 암호화한 다음 Bob에게 다시 전송하게 될 것이다.

이렇게 되면 Eve는 중간에서 같은 메시지의 (물론, 다른 random bit를 갖는) 암호문을 두 개 확보한다. 이제 Eve는 $M$을 복원할 수 있다.


Theorem. (Coppersmith's Short Pad Attack) $N, e$는 RSA 공개키이고, $N$은 $n$-bit이다. $m=\lfloor n/e^2 \rfloor$라 하자. $M \in \mathbb{Z}_N^{*}$는 길이가 $n-m$ 이하인 메시지이고, $M_1 = 2^m M +r_1$, $M_2 = 2^m M+r_2$라 하자. 이때, $r_1, r_2$는 $0 \le r_1, r_2 < 2^m$을 만족하는 서로 다른 정수다. $N, e$와 $C_1, C_2 \equiv M_1^e, M_2^e \pmod{N}$을 알 때, $M$을 다항식 시간에 얻을 수 있다. 

여기서 $e=3$인 경우, 추가되어야 하는 random bit의 길이가 전체 메시지의 $1/9$ 이상은 되어야 함을 알 수 있다.

물론, $e=2^{16}+1 = 65537$을 사용하면, 이 공격에 당할 염려는 사실상 없다고 봐도 무방하다.


마지막으로 살펴볼 내용은 Partial Key Exposure Attack이다. Eve가 열심히 뚫어서 $d$의 일부를 얻은 시나리오를 생각해보자.

이 정보를 가지고 $d$ 전체를 확보할 수 있을까? 답은, $e$가 작으면 충분히 가능하다라는 것이다.

$e < \sqrt{N}$인 경우 $d$의 일부를 이용하여 $d$ 전체를 복원하는 것이 가능하다는 결과도 있다고 한다.

이런 결과가 있는 만큼, 웬만하면 $d$ 전체를 안전하게 보관하는 것이 좋다는 결론을 얻을 수 있다.

계속 등장하고 계신 Coppersmith 선생님의 멋지고 중요한 결과를 하나 더 소개한다. 


Theorem. (Coppersmith) $N = pq$가 $n$-bit RSA modulus라 하자. 

이때, $p$의 $n/4$ least significant bits을 알거나 $p$의 $n/4$ most significant bits를 알면, $N$을 다항식 시간에 소인수분해 할 수 있다.


이를 이용하여, Partial Key Exposure Attack이 실제로 가능함을 어렵지 않게 증명할 수 있다.


Theorem. (Boneh, Durfee, Frank's Partial Key Exposure Attack) $N, d$는 RSA 비밀키이고, $N$은 $n$-bit다. 

$d$의 $\lceil n/4 \rceil$ least significant bits를 알면, $d$ 전체를 $e \log_2 e$에 비례하는 시간에 복원할 수 있다.

추가적으로, $e$가 작은 경우에는 $d$의 most significant bits를 쉽게 얻을 수 있음도 알 수 있다.

$ed - k(N-p-q+1)=1$인 $0 < k \le e$가 있다. $k$를 고정하고 생각하면, $\lfloor \frac{kN+1}{e} \rfloor$가 $d$의 좋은 근사가 됨을 알 수 있다.

정확하게 계산을 해보면 (Wiener's Attack에서 했던 계산이다) 실제 차이가 $3 \sqrt{N}$ 이하임을 알 수 있다.

즉, $e$가 작은 경우에는 $d$의 앞쪽 절반 정도의 most significant bits에 해당하는 후보군을 간단하게 얻을 수 있다.

특히, $e=3$인 경우에는 $k=2$가 강제되고 ($\pmod{3}$을 관찰하면 된다) 그러니 $d$의 앞쪽 절반을 전부 알 수 있다.


놀랍게도 #4에서 증명을 생략한 Coppersmith의 정리들은 전부 Lattice를 활용하는 것으로 알고 있다. Lattice가 많이 사기인듯. 

 

#5: Implementation Attacks

Implementation Attack은 RSA 함수의 성질 자체를 이용하여 공격을 하는 것이 아니라, RSA 구현체의 성질을 이용하여 공격을 한다.


가장 대표적으로 알려진 것은 Timing Attack이다. decryption을 위해서는, $M \equiv C^d \pmod{N}$을 계산해야 한다.

이 과정은 일반적인 binary exponentiation으로 구현되어 있을 가능성이 높다. 이는 다음과 같은 알고리즘이다.

$d=d_nd_{n-1} \cdots d_0$라고 하자. $C=1$, $z=M$이라고 하자. 각 $i=0, 1, \cdots n$에 대하여, 다음을 반복한다.

만약 $d_i=1$이라면, $C$를 $C \cdot z \pmod{N}$으로 바꾼다. 그 후, $z$를 $z^2 \pmod{N}$으로 바꾼다.


Eve가 적당한 $M_1, M_2, \cdots , M_k \in \mathbb{Z}_N^{*}$에 대해서 $M_i^d$를 계산하는데 걸리는 시간 $T_i$를 측정했다고 하자.

$d$가 홀수임은 자명하므로, $d_0=1$이고 첫 번째 스텝이 끝난 시점에 $C = M$, $z = M^2 \pmod{N}$임을 안다. 

이제부터 본격적으로 경우가 나뉘기 시작한다. 만약 $d_1=1$이라면, 기계는 $C \cdot z = M^3 \pmod{N}$을 계산한다.

$d_1 = 0$이라면, 이를 계산할 필요가 없다. $t_i$를 기계가 $M_i \cdot M_i^2 \pmod{N}$을 계산하는데 걸리는 시간이라고 하자.

이때, $t_i$의 값은 기계에 대한 정보를 충분히 얻으면 (Eve는 컴잘알이다) 사전에 얻을 수 있다고 가정한다. 

핵심적인 관찰은, $d_1 = 1$인 경우 $t_i$와 $T_i$ 사이의 correlation이 존재한다는 것이다. 

하지만 $d_1=0$이라면, $t_i$와 $T_i$는 independent한 것으로 보인다. 그러니 correlation을 기반으로 $d_1$의 값을 찾을 수 있다.

이 순서대로 계속하면, $d_2, d_3, \cdots , d_n$을 전부 복구하여 $d$를 계산할 수 있고 암호를 깰 수 있다.


더욱 자세한 내용과, 이 공격을 구현하는 방법을 알고자 한다면 NEERC 2017의 Editorial을 읽는 것을 추천한다. (나는 아직 안 읽었다)

놀랍게도, 이 대회의 H번이 정확히 이 구현을 요구하는 문제였다. 심지어 이 대회의 K번은 Knapsack Cryptosystem의 특수한 경우를 깨는 문제였다. 

위 공격과 비슷한 맥락으로, 기계가 사용한 전력을 이용하여 공격을 하는 방법 역시 있다고 한다. 


이를 방어하는 방법에는 크게 두 가지가 있다. 첫 번째 방법은, 계산 시간의 측정을 무의미하게 만드는 것이다. 

즉, 계산을 하는 도중에 적당한 딜레이를 추가하여, 위 공격에 필요한 사실들을 전부 거짓으로 만들어주면 된다.

두 번째 방법은, 앞서 언급한 "blinding"을 활용하는 것이다. 기계가 $M^d$를 계산해야 한다고 하자.

그러면 기계는 단순하게 $M^d$를 계산하는 대신, 랜덤한 $r \in \mathbb{Z}_N^{*}$를 잡고 $M' = M \cdot r^e \pmod{N}$을 계산한다.

그 후, $M'^d \equiv r \cdot M^d \pmod{N}$을 binary exponentiation으로 계산하고 modulo inverse를 이용해 $M^d \pmod{N}$을 얻는다.

이렇게 되면 핵심적인 부분인 거듭제곱을 랜덤하고 Eve가 값을 모르는 $M'$에 적용하므로, Eve는 위 공격을 활용할 수 없다.


두 번째로 볼 것은 Random Fault를 활용한 공격이다. 앞서 다루었듯이, CRT를 활용하여 $M^d \pmod{N}$을 빠르게 계산하는 방법이 존재한다.

$d$가 있다면, $d_p \equiv d \pmod{p-1}$과 $d_q \equiv d \pmod{q-1}$을 얻은 뒤 $C_p \equiv M^{d_p} \pmod{p}$, $C_q \equiv M^{d_q} \pmod{q}$를 계산한다.

이제, CRT를 활용하여 $C \equiv M^d \pmod{N}$을 빠르게 계산할 수 있다.

계산을 조금 해보면, (FFT를 활용하지 않는 단순 곱셈을 가정할 때) 이 방법으로 약 $4$배 정도의 속도 개선이 가능함을 알 수 있다.

그러니 이런 계산 방법은 상당히 매력적인 방법이고, 실제로 많은 구현체에서 활용된다고 한다.


기계에서 버그가 발생하여, 잘못된 값을 계산했다고 하자. 특히, $C_p$와 $C_q$ 중 정확히 한 값이 틀리게 계산되었다고 하자.

일반성을 잃지 않고, $C_p$는 제대로 계산되었으나 $C_q$는 잘못 계산되었다고 하고, 잘못 계산된 값을 $\hat{C_q}$라 하자.

그렇다면 CRT를 통해서 얻어진 $C$의 값은 잘못 계산될 것이며, 이 값을 $\hat{C}$라 하자.

Eve가 $M$을 가지고 와서 기계에게 $M^d \pmod{N}$을 계산해달라고 했는데, 위 오류가 발생했다고 하자.

$\hat{C}^e \not\equiv M \pmod{N}$이 성립하므로, Eve는 오류가 발생했음을 확인할 수 있다.

그런데 $\hat{C}^e \equiv M \pmod{p}$이고, $\hat{C}^e \not\equiv M \pmod{q}$이므로, $\text{gcd}(\hat{C}^e - M, N)$을 계산하면 $N$의 소인수분해를 얻을 수 있다.


공격이 성공하려면 $M$에 대한 정보를 Eve가 들고 있어야 하며, 계산 과정에서 $M$을 바꾸는 일이 없어야 한다.

즉, $M^d \pmod{N}$을 계산하기 전에 $M$에 random bit를 추가하는 등의 방식으로 "랜덤함" 한 스푼을 추가하면 이 공격을 막을 수 있다.

훨씬 간단한 방법으로는, 기계가 값을 출력하기 전에 제대로 계산을 했는지 확인하는 것이 있다. 실수를 했다면, 다시 계산하면 된다.

다양한 암호 체계가 이처럼 기계의 오류를 통해서 깨질 수 있다는 것이 밝혀졌다고 한다. 


마지막으로, Bleichenbacher's Attack on PKCS 1을 살펴본다. 암호학자들이 암호에 대한 빡빡한 기준을 갖는 이유를 알게 해주는 공격이다.

$N$은 $n$-bit RSA modulus고, $M$은 $m$-bit 메시지이며 $m<n$이라 가정하자. 

RSA 암호화를 진행하기 전에, $M$에 random bits를 추가하여 $n$-bit로 만드는 것은 나쁘지 않은 아이디어다.

"랜덤함"으로 간을 쳐주는 나쁘지 않은 방법이 되기 때문이다. 이는 실제로 공개키 암호 표준이었던 PKCS 1에서 사용된 접근이다.

"랜덤함" 간을 친 후, 메시지는 0x00 0x02 [random bits] 0x00 [메시지] 형태를 갖추게 된다. 

앞에 있는 16개의 bit는 랜덤함으로 간을 쳤다는 것을 알리기 위한 신호의 의미를 갖는다. 뒤의 0x00은 여기서부터 진짜 메시지라는 것을 알려주는 신호다.

암호화된 메세지를 Alice의 기계가 받으면, 기계는 이를 decrypt하고 첫 16개의 bit를 확인한다. 그 후, random bits를 전부 제거하여 메시지를 얻는다. 

그런데, 어떤 기계는 첫 16개의 bit가 0x00 0x02가 아닐 때 "invalid ciphertext"라는 에러 메시지를 보내줄 수도 있다.

이 점을 정말 제대로 활용한 것이 Bleichenbacher's Attack이다. 이 에러 메시지로 할 수 있는 게 생각보다 많다.


Eve는 ciphertext $C$가 있고, 이를 복호화하고자 한다. 이를 위해서, Eve는 랜덤한 $r \in \mathbb{Z}_N^{*}$를 하나 잡는다.

그 후, $C' \equiv r^eC \pmod{N}$을 계산하고, $C'$을 Alice의 기계에 보내준다. 

이제 Eve는 에러 메시지의 여부를 통해서 $C'^d \pmod{N}$의 첫 16개의 bit가 0x00 0x02인지 확인할 수 있다.

그러니, 에러 메시지의 존재는 Eve의 입장에서는 일종의 oracle이 된다. 

참 도움이 안 될 것 같은 정보지만, Eve는 이를 활용하여 효율적으로 $C$를 복호화할 수 있음을 보였다. 

Bleichenbacher의 당시 논문에 의하면, 대략 $2^{20}$번의 시행으로 $C$를 복호화할 수 있다고 한다.

이는 adaptive chosen ciphertext attack이 실제로 가능하다는 것을 보여준 대표적인 사례이다. 

즉, 암호학자들이 ACCA까지 보는 게 쓸데없는 일이 아니라는 것이다. (이는 예전에 내가 가졌던 의문에 대한 답이 된다)


#6: Conclusion - Selection of Parameters

앞에서 다룬 공격 외에도, 타원곡선을 이용한 공격, Cycling Attack 등 수많은 공격들이 존재한다. 

위에서 다룬 내용들과, 다루지 않은 공격들을 통하여 우리는 어떤 parameter가 공격에 취약한지 알 수 있었다.

이는 다르게 말하면, 위 내용을 통해서 RSA를 안전하게 사용하기 위해서는 어떻게 parameter를 설정해야 하는지도 알 수 있다는 것이다.

  • $N$의 크기는 2048-bit 정도로 큰 것을 사용해야 한다. $N$의 소인수분해가 어려워야 하기 때문이다.
  • $p$와 $q$의 크기는 비슷해야 한다. 타원곡선을 이용한 공격을 막아야 하기 때문이다.
  • $q-p$는 충분히 커야 한다. $\sqrt{N}$ 근처의 수를 탐색하여 소인수분해하는 것을 막아야 하기 때문이다.
  • $p-1$은 큰 소인수를 가져야 한다. Pollard의 $p-1$ 알고리즘을 막아야 하기 때문이다.
  • $p+1$은 큰 소인수를 가져야 한다. Williams의 $p+1$ 알고리즘을 막아야 하기 때문이다.
  • $r$이 $p-1$의 최대 소인수일 때, $r-1$이 큰 소인수를 가져야 한다. Cycling Attack을 막아야 하기 때문이다.
  • $d$는 작으면 안된다. Low Private Exponent에 해당하는 공격을 막아야 하기 때문이다.
  • $e$는 작으면 안된다. Low Public Exponent에 해당하는 공격을 막아야 하기 때문이다.
  • 일반적으로 사용되는 $e$의 값은 $e = 2^{16} + 1$이다.
  • 랜덤한 소수 $p, q$는 높은 확률로 암호학적으로 안전한 소수가 된다고 한다.

다음으로 읽을 논문을 찾아야 하는데, 뭘 읽어야 할지 잘 모르겠다. 일단 수업 내용부터 제대로 따라가야 할 것으로 보인다.