본문 바로가기

Crypto

[Crypto] Dreamhack STAGE 3

https://dreamhack.io/lecture/roadmaps/3

 

Cryptography

암호학을 공부하기 위한 로드맵입니다.

dreamhack.io


[ Crypto stage 3 _ 블록 암호 ]

 

* AES(Advanced Encryption Standard)

 - SPN 구조: S-Box를 사용하는 치환(substitution) + P-Box를 사용하는 순열(permutation)을 여러 라운드에 걸쳐 반복

   -> 파이스텔 구조와 달리 라운드마다 입력 전체에 라운드 함수를 적용 -> 같은 수의 라운드를 사용할 때 SPN이 파이스텔 구조에 비해 두 배의 암호학적 안전성을 가짐

 

키 길이 라운드 수  
128비트 10 AES-128
192비트 12 AES-192
256비트 14 AES-256

 

=> 암호화 방법

 1. 각 블록을 4행 4열의 상태 배열(STATE)로 재구성함 (STATE의 각 칸에는 8비트(1바이트)가 저장됨)

 2. 이후 입력에 대해 AddRoundKey 함수를 적용

 3. 마지막 라운드 전까지 매 라운드마다 Subbytes, ShiftRows, MixColumns, AddRoundKey 함수를 반복하여 적용

 4. 마지막 라운드에서 MixColumns를 제외한 나머지 함수들만 적용

=> AES의 라운드 함수들은 역함수가 존재하므로, 역함수를 이용하여 AES 복호화가 이뤄집니다.

 

 

1) SubBytes 함수 (위 오른쪽 그림)

 : state의 각 바이트를 S-Box를 참조하여 치환하는 함수

 : 바이트의 상위 4비트가 행, 하위 4비트가 열을 결정

 

2) ShiftRows 함수

 : state의 각 행을 구성하는 바이트들을 쉬프트 하는 함수

 : 4가지 함수 중 유일하게 순열의 역할 수행

 : 2행은 왼쪽으로 1칸, 3행은 왼쪽으로 2칸, 4행은 왼쪽으로 3칸 밀기

-> 복호화할 때는 반대로 2행, 3행, 4행을 각각 오른쪽으로 1,2,3칸 밀기

 

3) MixColumns 함수

 : 열 단위로 치환을 수행하는 함수

 

 

4) AddRoundKey 함수

 : 이 함수는 키 생성 함수(Key Schedule)로 생성된 라운드 키의 state를 각 바이트 별로 XOR 함.

 : 복호화할 때는 XOR의 성질을 이용하여 동일한 키를 state에 XOR 함

 

 

 

<Key Schedule>

 : AES 암복호화를 시작할 때와 매 라운드마다 AddRoundKey를 적용

   -> 따라서 AES-128에서는 라운드 키가 11개 필요함

 : RotWord, SubWord, Rcon을 반복하여 W43(키 행렬의 43번째 열)까지 생성하고, 이를 4열씩 각 라운드에 사용

 : [W0, W1, W2, W3]은 암호화를 시작할 때 사용했으므로, 1라운드에서는 [W4, W5, W6, W7] 사용

1) RotWord

 : 열을 위로 한 번 회전시킴 (위로 밀기)

2) SubWord

 : subbytes에서 사용한 것과 동일한 s-box를 사용하여 각 바이트를 치환

3) Rcon

 

 

 

 

* DES(Data Encryption Standard)

 : 구성: 초기 순열(IP), 최종 순열(FP), 파이스텔 구조의 16라운드, 키 생성 함수(KEY GENERATION/각 라운드에서 사용되는 48비트의 키 생성)

 : 혼돈 성질을 만족하기 위해 치환(substitution)을, 확산 성질을 만족하기 위해 순열(permutation) 사용

 : 곱 암호(product cipher): 치환이나 순열 같은 단순한 연산들로 한 라운드를 구성하고, 각 라운드를 여러 번 반복하여 암호학적 안전성을 확보하는 암호

 

 

1) 파이스텔 구조

(1)L0=P[:len(P)/2], R0=P[len(P)/2:]

(2)Ln+1=Rn

(3)Rn+1=LnF(Rn,Kn)

 

-> (1): 입력으로 들어온 블록을 동일한 길이의 왼쪽 블록(L)과 오른쪽 블록(R)으로 나눔

-> (2): 각 라운드마다 오른쪽 블록은 다음 라운드의 왼쪽 블록으로 입력됨

-> (3): 왼쪽 블록은 오른쪽 블록에 라운드 함수 F를 적용한 결과와 XOR 되어 다음 라운드의 오른쪽 블록으로 입력됨

 

 

2) 라운드 함수

: 라운드 함수 F에는 오른쪽 블록만 입력되므로, 입력 길이는 32비트임

-> 확장 순열, 라운드 키 결합, 치환 테이블, 고정 순열로 이루어짐

(1) 확장 순열과 라운드 키 결합

   : 확장 순열은 입력을 비트 단위로 전치하는 동시에, 전체 길이를 48비트로 확장함

   : 이 과정에서 32비트의 입력값을 4비트씩 8개의 부분으로 나누고, 테이블을 참조하여 각각을 6비트로 확장

   : 초기 순열과 최종 순열은 테이블만 다를 뿐, 같은 방식으로 이루어짐

   -> 라운드 키 결합 : 확장 순열로 나온 출력을 라운드 키 K와 XOR 하는 것

 (2) S-Box와 고정 순열

   : S-Box는 라운드 키 결합에서 출력된 48비트 결과 값을 32비트로 축소

   : 입력을 여섯 비트씩 8개의 부분으로 나눈 후, 여섯 비트 중 첫 번째와 마지막 비트로 행을 결정하고, 나머지 네 개의 비트로 열을 결정, 그 후, s-box의 표에서 행과 열을 참조하여 값을 반환

   : s-box로 길이를 축소하고 난 후, 고정 순열로 다시 비트 단위 전치가 이루어짐

 

 

 

< 키 생성 함수 >

: 64비트의 입력을 받아 각 라운드에 필요한 48비트 라운드 키를 생성하는 함수

: 패리티 비트 제거 + 쉬프트 + 압축 순열

1) 패리티 비트 제거

 : 입력에서 패리티 비트를 제거하고, 남은 56비트에 순열을 적용하는 과정

 : des 비밀키에서 각 바이트의 가장 오른쪽 비트는 자신이 속한 바이트의 나머지 7비트에 대한 홀수 패리티 비트

-> 홀수 패리티 비트 : 한 바이트를 이진수로 표현했을 때, 1의 개수가 홀수가 되도록 덧붙인 비트

-> 통신 중에 비트 반전이 일어나지 않았음을 보증하는 역할

 

2) 쉬프트

 : 입력을 왼쪽 28비트와 오른쪽 28비트로 나누어 각각을 1비트나 2비트만큼 왼쪽으로 순환 쉬프트 하는 과정

 : 1,2,9,16 라운드에서는 1 비트, 나머지 라운드에서는 2비트만큼 쉬프트함

 

3) 압축 순열

 : 56비트의 입력을 48비트 길이로 압축하는 과정

 

 

* 다중 DES

 : 서로 다른 키를 사용하는 DES 모듈을 여러 개 이어 붙여서 DES의 약점을 보완한 암호 시스템

 : 이중 DES -> 112비트, 삼중 DES -> 168비트 키 사용

 : 중간 일치 공격으로 인해 안전성을 획기적으로 높이지는 못함

-> 중간 일치 공격 : 공격자가 어떤 평문 P와 P를 암호화한 암호문 C를 알 수 있을 때 수행할 수 있는 공격

 

 

* 운영모드(Mode of Operation)

 : 블록 암호로 다양한 크기의 데이터를 처리할 수 있도록 고안된 블록 암호의 사용 방법

 

1. 패딩

 : 평문에 데이터를 붙여서 평문의 크기가 블록 크기의 배수가 되도록 만드는 과정

 : 패딩된 암호문을 복호화할 때는 복호화된 평문에서 패딩을 제거해야 원래의 평문을 얻을 수 있음

 : 따라서 패딩된 암호문의 수신자는 어떤 패딩이 적용됐는지 알아야 암호문을 제대로 복호화할 수 있음

 

1) 비트 패딩

: 마지막 블록에서 평문이 채우지 못하는 비트 중 최상위 비트를 1로 설정하고, 나머지는 모두 0으로 채우는 패딩 기법

 : 마지막 비트부터 처음으로 값이 1인 비트가 나올 때까지를 패딩으로 인식할 수 있음

 : 메시지 일부를 패딩으로 오인할 수 있음 -> 비트 패딩을 적용할 때는 평문의 크기가 블록 크기의 배수이면, 패딩으로 한 블록을 추가

 

2) 바이트 패딩

   : 바이트 단위로 패딩을 수행하는 패딩 기법

   : 종류 : ANSI X.923 -> 마지막 블록의 남는 바이트를 임의의 값(일반적으로 0)으로 채우고, 마지막 바이트에 패딩의 길이를 기록하는 기법

 

3) PKCS#

   : AES와 같은 블록 암호의 패딩 기법 제시

   : 추가할 패딩의 바이트 크기로 마지막 블록을 채우는 패딩 기법

 

 

2. 운영 모드

1) ECB모드

: 블록들을 모두 같은 키로 암호화

: 각 블록이 독립적으로 암호화되므로 여러 블록을 병렬적으로 암호화할 수 있다는 장점

: 다른 운영모드에 비해 암호학적 안전성이 부족

 -> 암호문에서 평문의 정보 습득 OR 리플레이 공격 수행이 가능함

 -> 약한 혼돈 성질

-> 재전송 공격

  : 어떤 데이터를 재전송하여 시스템이 의도치 않은 행동을 하게 하는 것

 

2) CBC모드

   : 어떤 블록을 암호화하기 전에, 이 블록을 직전 블록의 암호문과 XOR

   : 평문의 첫 번째 블록은 이전 블록이 존재하지 않으므로, 초기 벡터(IV)라고 불리는 임의의 데이터와 XOR 함

   : 각 블록이 서로의 암호화에 영향을 주므로 같은 블록도 전체 평문 및 IV에 따라 암호화 결과가 달라짐

-> IV는 일반적으로 넌스(NONCE)라는 무작위 값을 사용하며, 이는 공격자가 알아도 안전성에 영향을 끼치지 않음

-> 그러나 공격자가 암호문을 중간에 가로채서 이를 조작할 수 있으면, 복호화 결과의 첫 번째 블록을 조작할 수 있음

 => 따라서 CBC 모드를 사용할 경우 IV의 무결성을 함께 보장해야 함

 => 암호화: 여러 블록을 병렬적으로 암호화할 수 없음

     복호화: 모든 암호문 블록을 알고 있으므로 병렬적으로 처리할 수 있음

 => 재전송 공격에 강인하며, 높은 혼돈성을 가지고 있어 블록 암호의 운영 모드로 널리 사용

 

-> CBC Bit-Flipping Attack : 공격자가 초기 벡터를 원하는 값으로 조작하여 복호화된 평문의 첫 번째 블록을 조작하는 공격

 

3) CTR모드

: 블록 암호에 nonce와 평문 블록의 인덱스(counter)를 결합한 값을 입력

: 암호문은 블록 암호의 출력과 평문 블록을 xor 하여 생성

: 블록을 순서대로 암호화하지 않아도 되므로 병렬로 암복호화할 수 있으며, 구현이 간단함

'Crypto' 카테고리의 다른 글

[Crypto] Dreamhack STAGE 5  (0) 2022.08.26
[Crypto] Dreamhack STAGE 4  (0) 2022.08.26
[Crypto] Dreamhack STAGE 1 ~ 2  (0) 2022.08.25