게다가, 인증(Authentication), 기밀성(Confidentiality), 데이터 무결성(Data-Integrity), 부인 방지(Non-Repudiation) 등은 암호학적 구조로부터 제공된다.
암호화 기법(cryptography)은 상대방으로부터 통신에서 보안을 얻을 수 있는 기술이다.
암호 공격 기법(cryptanalysis)은 반대로 암호화 알고리즘의 안전성을 분석하는 작업이다.
이 둘은 계속 발전해오면서 서로 서로 상호작용해왔다.
암호 공격 기법 개발자가 알고리즘을 부수면, 암호화 기법 개발자는 알고리즘을 개선하여 가능하다면 공격 방법으로부터 안전성을 확보하고, 그러지 못하면 알고리즘은 쓸모가 없게 된다.
컴퓨터의 연산 능력이 증가함에 따라, 단순한 브루트포스 공격도 많아졌다.
그러므로, 암호학자들은 그들의 암호화 알고리즘을 계속해서 개발해야만 하며, 새로운 암호 기법을 개발해야 한다.
1.2 Description of Cryptography
현대 암호에서 암호화 기법에 대한 접근은 크게 두 가지로 나눌 수 있다.
대칭키 알고리즘
비 대칭키 알고리즘
일반적으로, 대칭키 알고리즘은 암호화와 복호화 과정에서 서로 같은 키를 사용한다.
이 키는 전송자와 수신자가 공유하고 있어야만 한다.
반면에, 비대칭키 알고리즘은 개인 키와 공개 키로 불리는 두 가지 키를 활용한다.
두 키는 수학적으로 풀기 어려운 문제를 기반으로 함께 만들어진다.
비대칭키 알고리즘의 기본 아이디어는 공개 키는 다른 모두와 공유하되 개인 키는 본인 키는 개인이 보관하고 있다는 것이다.
누구나 그 사람의 공개키로 메세지를 암호화 할 수 있다.
하지만, 수신자의 비밀키가 없이는 암호문을 복호화 하는 것이 거의 불가능하다.
비대칭키 알고리즘은 대칭키와 비교했을 때 더 많은 컴퓨터 연산이 필요하고 느리지만, 참여자들이 키를 공유할 필요가 없다는 장점이 있다.
대칭키 알고리즘을 사용할 경우, 우선은 비대칭키 알고리즘으로 키를 공유하는 단계를 거치는데, 이를 키 공유(key exchange)라 한다.
본 논문에서 비대칭키 알고리즘은 관심사가 아니다.
1.2.1 Stream Ciphers
스트림 암호는 대칭키 알고리즘의 한 갈래로, 평문 비트열을 키-스트림 비트열과 결합하여 암호문 비트열을 얻는다.
전체 암호문이 얻어질 때까지 이를 반복한다.
작업을 수행하기 위해서 키-스트림은 평문만큼 길어야 한다.
이를 위해, 짧은 키로부터 충분히 길고 랜덤처럼 보이는 키-스트림을 만들어내는 여러 방법이 있다.
1.2.2 Block Ciphers
블록암호는 대칭키의 또 다른 갈래로, 대용량 데이터를 블록 단위로 암호화하며 블록의 단위는 암호화 과정, 라운드 수, 프로토콜 등을 기준으로 정해진다.
일반적으로, 블록 암호는 하나의 비밀키를 갖는다.
이 키는 라운드 키를 생성하는 데 이용된다.
암호 알고리즘의 라운드가 성공적으로 적용되었을 때, 암호문을 얻을 수 있다.
복호화는 단순히 암호화 과정의 역(inverse)이다.
블록암호는 크게 SPN 구조와 Fiestel 구조로 나뉜다.
1.3 Cryptanalysis of Block Ciphers
암호학에서, 암호화 기법은 케르히호프 원리(Kerckhoffs' Principle)에 따라 알고리즘이 공개될 것으로 가정한다.
비밀로 유지하는 것은 오직 키 값이다.
보안성을 높이는 주된 기술은 서로 다른 라운드 키를 이용해서 알고리즘을 반복적으로 적용하는 것이다.
따라서, 암호화의 라운드 수는 라운드 함수를 몇 번이나 반복하는지에 따라 결정된다.
라운드마다 키를 제공하기 위해, 마스터 키(입력받은 키)를 사용해서 키 스케쥴링을 한다.
알고리즘의 안전성(보안성)은 오직 이 키에만 의존해야 한다.
블록암호에 대한 generic attack 시나리오는 공격자가 이미 알고 있는 (평문-암호문) 쌍에 대해 가능한 모든 n-bit 의 키 값을 시도해서 실제 키를 찾는 것이다.
이 공격법을 Brute Force 혹은 Exhaustive Search라 부른다.
Brute Force를 불가능하게 만들기 위해, 블록암호 설계자들은 큰 키 스페이스를 이용한다.
공격자에 대한 각기 다른 가정에 따라, 각기 다른 공격 시나리오가 있다.
Ciphertext Only Attack : 공격자가 오직 암호문만 갖고 있다고 가정한다.
Known-Plaintext Attack : 공격자가 (평문-암호문) 쌍의 일부를 갖고 있다고 가정한다. 이 방법은 키를 복원하는 것에 초점을 맞춘다.
Chosen-Plaintext Attack : 공격자가 평문의 bit 를 조작하여 암호문의 bit가 어떻게 바뀌는지 알 수 있다고 가정한다. 이 방법은 키의 일부, 혹은 전체를 복원하는 것에 초점을 맞춘다.
Chosen-Ciphertext Attack : 공격자가 암호문을 임의로 복호화 할 수 있는 상태라 가정한다.
Adaptive Chosen Plaintext/Ciphertext Attack : 공격자는 암호화/복호화를 모두 할 수 있다고 가정한다. 공격자가 암호화/복호화 이후의 평문/암호문으로부터 기대하는 바에 따라, 암복호화 작업을 계속 할 수 있다.
1.3.1 Complexity
이상적인 공격방법을 선택하기 위해, 공격자는 얼마나 많은 데이터 공간과 시간이 필요한지 고려해야 한다.
Time Complexity : 알고리즘이 시작된 후 끝날 때까지 걸리는 전체 시간을 의미한다. 암호화가 몇 번 일어났는지를 통해 계산할 수 있다.
Data Complexity : 공격을 위해 필요한 (평문-암호문) 쌍의 크기를 측정한다.
Memory Complexity : 공격을 위해 필요한 저장 공간을 의미한다.
1.3.2 Linear and Differential Cryptanalysis
선형(Linear) 공격과 차분(Differential) 공격은 블록암호의 키를 복원하는데 중요한 두 가지 공격 방법이다.
기본적으로, 선형공격의 아이디어는 암호의 비선형적인 연산의 선형 근사를 찾는 것이다.
반면, 차분공격은 입력값과 출력값의 쌍의 차이에 대한 확률을 기반으로 한다.
1.4 About this Thesis
라운드 수를 증가시킴으로써 보안성을 확보하는 것이 충분하다고 여겨지지만, 몇몇 연구자들은 이 아이디어를 바꾸는 방향을 생각하고 있다.
이러한 관점에서, 1999년에 Alex Biryukov 와 David Wagner가 제안한 Slide Attack은 성공적인 공격 방법이다.
기본적으로, 이 공격은 알고리즘의 라운드 함수와 키 스케쥴 함수가 충분히 안전하지 않을 때 성공한다.
Slide Attack의 주요 특징은 라운드 수와 독립적이라는 것이다.
몇몇 암호 알고리즘에서 Slide Attack은 time/data complexities 를 감소 시키는데 굉장히 효과적인 방법으로 밝혀졌다.
이 논문의 구성은 다음과 같다. Chapter2에서는 이 논문의 서두(preliminaries)가 있다. Chapter3에서는 slide attack의 수학적 배경과 기본지식들을 설명한다. Chapter3는 또한 몇몇 블록암호 구조에 적용될 수 있는 generic technique을 포함한다. Chapter4에서는 slide attack의 응용들이 있다. Chapter5에서는 결론을 적었다.
Chpater2. Preliminaries
이 장에서는 slide attack의 preliminaries를 소개한다.
우선, 블록암호 알고리즘의 기본적인 두 가지 타입에 대해 논한다.
이후, low cost environment 를 위한 경량화 암호를 두 가지 예시 알고리즘과 함꼐 소개한다. (PRESENT, KeeLoq)
마지막으로, Slide Attack의 복잡도를 계산하는데 중요한 개념인 Birthday Paradox에 대해 자세히 설명한다.
2.1 Block Ciphers
1장에서 언급했듯이, 블록암호는 평문을 고정된 크기의 블록으로 나누고 한 블록씩 암호화 한다.
암호화 과정은 반복적인 라운드 함수로부터 적용된다.
당연하게도 블록암호는 매우 다양한 설계 기준이 있다. 하지만, 일반적으로 SPN 구조와 Feistel 구조로 범주화된다.
2.1.1 Substitution-Permutation Networks(SPNs)
블록암호의 가장 중요한 방법 중 하나는 바로 SPN 이다.
기본적으로, SPN은 평문과 키를 입력값으로 받는다.
우선, 평문 블록은 키 스케쥴링으로부터 얻은 라운드 키와 XOR 연산된다.
이 연산을 Round0 이라 한다.
이후, 연산된 값은 작은 블록들로 나뉘어지고, 각각의 작은 블록들은 비선형적인 레이어(S-Box)를 통해 confusion을 충족시킨다.
게다가, 위 단계를 거친 후 permutation 연산과 라운드 키와의 XOR 연산을 통해 diffusion 속성도 충족한다.
상기한 일련의 연산과정을 라운드라 부른다.
이러한 라운드들이 반복적으로 적용되며, 최종적으로 암호문을 얻을 수 있다.
아래 그림은 SPN 을 나타낸 것이다.
2.1.1.1 Advanced Encryption Standard (AES)
AES는 가장 유명한 SPN의 예시 이다.
이는 벨기에 암호학자 Vincent Rijmen과 Joan Daemen의 Rijndael 암호의 변형이다.
NIST에서 주관한 AES 공모전에서 우승한 뒤 AES 표준이 되었다.
AES는 키 길이에 따라 세 가지 변형이 있는데, 각각의 키 길이가 128, 196, 256비트이고 라운드 수는 10, 12, 14이다.
각각의 버전은 평문 블록으로 128비트 크기를 갖는다.
우선, 첫 번쨰 라운드 전에 추가적인 AddRoundKey 연산을 한다.
각각의 라운드는 SubByte(SB), ShiftRows(SR), MixColumn(MC), 그리고 AddRoundKey(ARK) 단계로 구성되어 있다.
그리고, 라운드 키는 키 스케쥴링 알고리즘에 의해 매 라운드마다 제공된다.
마지막 라운드에서 MixColumn 연산은 생략한다.
암호화 과정은 아래와 같다.
2.1.2 Feistel Structure
Feistel 구조는 두 번째로 인기있는 블록 암호 구조이다.
독일의 암호학자 Horst Feistel가 IBM에서 일할 때 발명했다.
DES, Blowfish, TEA 등 매우 많은 암호들이 이 구조를 이용한다.
Feistel 구조에서, 암복호화 과정은 매우 비슷하고, 때때로 완전히 동일하기도 하다.
일반적으로, 일반적으로 각 라운드마다 라운드 키를 생성하기 위한 키 스케줄 알고리즘을 F라 부르며, Feistel Function 이라 부른다.
평문 Pi는 같은 크기의 Li,Ri로 나눠지며 아래의 연산을 거친다.
Li+1=RiRi+1=Li⊕F(Ri,ki+1)
2.1.2.1 Data Encryption Standrad(DES)
DES는 가장 인기있는 Fiestel Network 이다.
초기에는 Horst Feistel에 의해 Lucifer 라는 이름으로 설계되었다.
이후, NSA(National Security Agency)에 의해 조금 변형되어 DES라는 이름으로 사용되었다.
DES는 56-bit의 키를 이용한다.
하지만, 라운드 키는 48-bit 이다.
평문의 길이는 64-bit이다.
매 라운드마다, 32-bit의 블록은 Feistel Function으로 들어간다.
Feistel Function 내부에서, 32-bit 블록은 48-bit로 확장(expand)된 뒤 48-bit의 라운드 키와 XOR 연산을 진행한다.
그 후 Substitution을 진행하고, S-Box를 통해 32-bit로 압축된다.
마지막으로, Permutation을 한 번 한다.
Feistel Function의 결과값은 이후 다른 블록과 XOR 하고 두 블록은 자리를 바꾼다.
아래는 DES의 개념도이다.
2.2 Lightweight Cryptosystems
DES나 AES같은 블록암호들은 큰 용량의 데이터를 암호화하는 데 쓰인다.
그리고 이는 저장용량의 크기 및 CPU Power에 대한 비용이 커지는 결과로 이어진다.
하지만, 마이크로칩의 기술 발달로 낮은 비용(low cost)로 동작하는 암호 알고리즘에 대한 수요가 생겼다.
이러한 알고리즘들을 경량 알고리즘이라 한다.
일반적으로, 경량화 알고리즘은 블록 암호의 일종이다.
낮은 비용으로 동작해야 하기 때문에 이러한 종류의 암호들은 primitive key generation algorithm을 사용하고, 적은 수의 non-linear truth table을 사용한다.
이러한 구조의 경량화 시스템은 안전하지 않은 것처럼 보인다.
하지만, 경량화 알고리즘들은 많은 라운드 수를 돌면서 차분공격이나 선형공격에 대한 기본적인 보안 정도를 달성한다.
2.2.1 PRESENT
PRESENT 암호는 Andrey Bogdanov, Lars R.Knudsen, Gregor Leander, Axel Poschmann, Yannick Seurin, Matthew J. B. Robshaw, Christof Paar, 그리고 C.Vikkelsoe 에 의해 2007년 세상에 공개되었다.
1K-DES, PRESENT 암호 등에 적용하는 것을 Chpater 4 에서 살펴 볼 것이다.
3.2 Slide Attack to Feistel Structures
기본적으로, 만약 (Pi,Ci)와 (Pi+1,Ci+1)가 Slid Pair를 이룰 경우 F(Pi)=Pi+1 이고, F(Ci)=Ci+1 이다.
이 때, Feistel구조이기 때문에 전체 (평문, 암호문) 쌍에서 Li+1=Ri를 만족하는 경우만 고려하면 된다는 Filtering condition이 존재한다.
3.2.1 Chosen-Plaintext Attack to Feistel Structures
이전 섹션에서 언급했듯이 CPA를 이용하면 확률 P=1로 비밀 키를 찾아낼 수 있다.
임의의 (평문, 암호문) 쌍 (P,C)를 정하자.
이 때, P=(PL,PR), 그리고 C=(CL,CR)로 각각 구성되어 있다고 하자.
만약 (P,C)와 (P′,C′)가 Slid Pair를 구성하면, 아래의 조건을 만족해야 한다.
PR=PL′CR=CL′
(P′,C′)에 대해 생각해보면 정확히 2n/2 가지의 경우의 수를 가짐을 알 수 있다.
크기가 n-bits인 bitstream에서 절반인 n/2가 앞선 P에 의해 고정되어 있기 때문이다.
특정한 Slid Pair를 찾기 위해서, 모든 후보군을 암호화한 뒤 또 다른 filtering condition인 CR=CL′을 이용한다.
CR=CLFilter Condition은 2n/2 개의 후보 중 하나를 걸러 낸다.
그러므로, Slid Pair를 찾을 수 있다.
다시 말해, 정확히 하나의 Slid Pair만을 갖고 있기 때문에 이 공격의 성공 확률은 P=1이다.
Feistel에서의 CPA 공격은 2n/2번의 암호화와 2n/2개의 chosen-plaintext들로 진행된다.
공격의 알고리즘을 살펴보면 아래와 같다.
1: 임의의 (평문, 암호문) 쌍 (P,C)을 fix한다.
2: PR=PLi를 만족하는 선택된 평문(Chosen-Plaintext)을 구한다. (i=2n/2)
3: 해시 테이블에 (CLi,Pi,Ci)를 저장하고 첫 번째 인자로 indexing한다.
4: for chosen plaintext-ciphertext pair (Pi,Ci)에 대하여:
5: check the condition CR=CL′
6: if 충돌이 발견되면 then
7: 키 K를 추출하고 EK(P)=C인지 아닌지 체크한다.
8: end if
9: end for
Another Approach
Slid Pair를 찾기 위해 n/2개의 임의의 PR을 우선 정한다.
만약 P=(PL,PR), P′=(PL′,PR′) 가 하나의 라운드에 대해 Slid Pair를 이루면 아래를 만족한다.
PR=PL′PR′=PL⊕f(PR,K)
이를 바탕으로 2n/4 개의 Pi,Pj를 임의로 선택할 수 있다.
이 때, PLi,PRj는 무작위로 선택된다.
그러므로, 2n/4+2n/4=2n/4+1의 chosen plaintext 들로 generalized birthday paradox를 이용해 높은 확률로 slid pair를 찾는 것이 가능하다.
게다가 slid pair는 대응되는 ciphertext에서 CRi=CLj 조건을 찾음으로써도 발견할 수 있다.
단순한 접근 방식으로, 하나 하나씩 비교하면 2n/4∗2n/4=2n/2의 시간 복잡도를 가진다.
하지만, 정렬 알고리즘을 접목하면 이 복잡도를 줄일 수 있다.
만약 Quick Sort를 이용하면 시간 복잡도는 O(n2)까지 줄어든다.
이러한 프로세스 이후, 충돌이 발생하면 부분 암호화를 통해 slid pair임을 확인할 수 있다.