1. AES
= Advanced Encryption Standard
- DES가 더 이상 안전하지 않게 되어, 2001년 새 표준으로 선정된 블록 암호 알고리즘.
- (AES, DES는 모두 블록 암호 알고리즘이다)
- 전세계에서 공모받은 암호 알고리즘 중 심사를 거쳐 선정된 가장 뛰어난 알고리즘.
- 보안성, 효율성, 이식 적합성, 유연성 등에서 Rijndael 구조 채택
- -> 세계적인 논의를 통해 선정된 표준이므로 정보당국 등의 백도어 설치 위험성 배제 가능
- 표준 선정 이래로 치명적인 취약점 발견 x
- 제조사들이 전용 명령어를 정의해 주어 암/복호화 성능 뛰어남
- => 현대에서는 대칭키 암호 알고리즘으로 일반적으로 AES 사용
- 갈루아 필드(Galois Field)
- 체(Field)
- 군(Group)
1-1. SPN (Substitution Permutation Network)
= AES에서 사용하는 암호 구조
- 곱 암호의 일종
- 치환(Substitution, S-Box 사용)과 순열(Permutation, P-Box 사용)을 여러 라운드에 걸쳐 반복
- 라운드마다 입력 전체에 라운드 함수 적용
- -> 라운드 수가 같으면 SPN이 페이스텔 구조 대비 2배의 암호학적 안전성을 가짐
라운드마다 128bit 크기의 블록을 암호화한다
키 길이는 128, 192, 256비트 중 하나 선택
키 길이에 따라 AES-128, 192, 256이라고 부름
라운드 수는 키 길이에 따라 10, 12, 14로 결정
- 각 블록을 4행 4열의 상태 배열(State)로 재구성 (각 칸에 1Byte씩)
- 재구성된 입력에 대해 AddRoundKey 함수 적용
- 매 라운드마다 SubBytes, ShiftRows, MixColumns, AddRoundKey 함수 반복 적용
- 마지막 라운드에서는 MixColumns를 제외하고 나머지 함수들만 적용
위 라운드 함수들에는 역함수가 존재 -> 역함수를 이용해 복호화
1) SubBytes
: State의 각 바이트를 S-Box를 참조하여 치환하는 함수
- 바이트의 상위 4비트가 행, 하위 4비트가 열 결정
- ex) 2A -> S-Box의 2행 A열 참조 -> E5로 치환
2) ShiftRows
: 각 행을 구성하는 바이트들을 쉬프트하는 함수
- 4가지 함수 중 유일하게 순열의 역할 수행
- 2행은 왼쪽으로 1칸, 3행은 2칸, 4행은 3칸 쉬프트
- (복호화할 때는 오른쪽으로)
3) MixColumns
: 열 단위로 치환을 수행하는 함수
갈루아 필드 내에서의 행렬 연산으로 계산
4) AddRoundKey
: 키 생성 함수(Key schedule)로 생성된 라운드 키의 state를 각 바이트별로 XOR
복호화 시에는 XOR의 성질을 이용해 동일한 키를 state에 XOR
5) Key Schedule
: 입력된 키로부터 각 라운드에 쓰일 라운드 키를 생성하는 함수
- 암복호화를 시작할 때와 매 라운드마다 적용됨
- ex) AES-128은 총 10라운드가 있으므로 라운드 키는 11개 필요
- 각 라운드 키는 4*4 행렬 -> 4*44열의 키 행렬 생성, 4열씩 나눠서 라운드마다 사용
- 처음 4열은 입력된 4열을 그대로 사용
- 그 다음 4열부터는 현재 자리에 있는 4열에 RotWord, SubWord, Rcon을 적용한 뒤
- 이전 4열과 XOR하여 생성
RotWord : 열을 위로 한 번 시프트
SubWord : SubBytes에서 사용한 S-Box를 사용해 각 바이트 치환
Rcon :
R에 대해, 의 최상위 바이트를 과 XOR
2. DES
= Data Encryption Standard
- 미국 국가안보국에서 IBM의 루시퍼 알고리즘을 개량해 만든 대칭키 암호
- 루시퍼의 128비트 대비 절반인 56비트 키 사용, 내부 알고리즘 일부 변경
- 과거 표준이었던 블록 암호. 현대에는 공격 기법이 많이 연구되어 표준으로 사용하지 않음
- 8바이트를 한 블록으로 한다.
- 초기 순열(Initial Permutation, IP), 최종 순열(Final Firmutation, FP), Feistel로 이루어진 16라운드를 가진다.
- 각 라운드에는 48비트의 키가 사용되며, 이 키를 생성하는 키 생성 함수(Key Generation)가 있다.
2-1. 순열, 치환, 곱 암호
- 치환(Substitution): DES에서 혼돈 성질을 만족하기 위해 사용된다.
- 순열(Permutation): DES에서 확산 성질을 만족하기 위해 사용된다.
이들은 매우 단순한 연산이므로 한 번 사용한다고 해서 암호학적 효과를 기대할 수는 없으나
여러 번 교차해 반복적용하면 혼돈/확산 성질을 모두 만족하게 된다.
이러한 단순 연산들로 한 라운드를 구성하고 -> 각 라운드를 여러 번 반복하여 안전성을 확보하는 암호를
곱 암호(Product Cipher)라고 한다.
(DES 외에도 많은 현대 블록 암호들이 이 구조를 차용하고 있다.)
2-2. 페이스텔 구조
: 입력으로 들어온 블록을 좌/우로 이등분한 뒤
우측 블럭은 그대로 다음 라운드의 좌측으로 입력시키고
좌측 블럭은 우측 블럭에 라운드 함수(F)를 적용한 값과 XOR해 다음 라운드의 우측으로 입력시키는 교차구조
특징
- 블록 암호는 복호화를 위해 역함수를 두나, 페이스텔 구조의 경우 F가 복호화 과정에서 XOR로 상쇄되므로 역함수 불필요
- 암/복호화의 구조가 동일하여 암호화 시 사용한 라운드 키를 역순으로 입력하면 복호화 가능
- 우측 블럭은 아무 처리 없이 다음 라운드로 넘어가므로 안전성을 위해서는 2베 정도 많은 라운드가 필요
2-3. DES의 과정
초기 순열/최종 순열
- 시작할 때 초기 순열(IP), 마지막에 최종 순열(FP) 수행
- (정해진 테이블을 이용해 64비트 입력을 비트 단위로 전치.
- 테이블에서 n번째 값이 m이라면 출력 n번째 비트는 입력 m번째 비트)
- 각각 초기 순열 테이블(IP Table, IPT)과 최종 순열 테이블(FP Table, FPT) 이용
- 초기 순열과 최종 순열은 서로 역관계.
- 임의 데이터에 초기 순열-최종 순열을 차례로 적용하면 데이터값이 그대로 나옴
- DES의 안전성을 증가시키지는 않으나 하드웨어에 구현하기 쉽게 함
라운드 함수(F)
- 오른쪽 블록만 입력됨 => 입력값 길이는 32비트
- 확장 순열(Expansion P-Box) : 입력을 비트 단위로 전치하는 동시에 전체 길이를 48비트로 확장
- 입력값(32비트)을 4비트씩 8등분, 테이블을 참조해 각각을 6비트로 확장
- 라운드 키 결합(XOR) : 확장 순열로 나온 출력을 라운드 키 K와 XOR
- 치환 테이블(S-Box) : 라운드 키 결합에서 출력된 48비트 결과값을 32비트로 축소
- 고정 순열(Straight P-Box) : 축소 후 다시 비트 단위 전치 (타 순열 과정과 동일)
키 생성 함수
- 64비트 입력을 받아 각 라운드에 필요한 48비트 라운드 키를 생성하는 함수
- 패리티 비트 제거(Parity Bit Drop) : 입력에서 패리티 비트를 제거하고 남은 56비트에 순열을 적용하는 과정
- (패리티 비트 : 통신 중에 비트 반전(에러)이 일어나지 않았음을 보증하는 비트)
- 쉬프트(Shift) : 입력을 좌우 28비트씩 나누어 각각을 1~2비트만큼 왼쪽으로 순환 쉬프트하는 과정
- 압축 순열(Compression P-Box) : 56비트의 입력을 48비트 길이로 압축하는 과정
2-4. DES의 응용
다중 DES
: 서로 다른 키를 사용하는 DES 모듈을 여러 개 이어붙여 약점을 보완한 암호 시스템
- 이중 DES(Double/2-DES)는 112비트, 삼중 DES(Triple/3-DES)는 168비트 키 사용
- 이중은 한번 DES를 적용한 출력값을 한 번 더 DES의 입력값으로 사용하는 방식
- 삼중은 한번 DES를 사용한 뒤, 그것을 복호화하여 다시 암호화하는 방식
- (복호화 시의 키를 그 다음 암호화할 때의 키와 같게 하면 두 키가 상쇄되어 첫 번째 키만을 갖는 단일 DES로도 사용가능하기 때문)
- 중간 일치 공격(Meet-in-the-Middle-Attack)이 있기 때문에 안전성을 획기적으로 높이지는 못함
- (이중 DES는 단일 DES와 안전성이 비슷하고, 삼중은 키 길이를 2배 하는 효과 뿐임)
중간 일치 공격
: 공격자가 평문과 그를 암호화한 암호문을 알 때 수행할 수 있는 공격
- 56비트 키 공간 K에서 가능한 모든 키로 평문을 암호화해 그 결과값들로 집합 S1 생성
- K에서 가능한 모든 키로 암호문을 복호화해 그 결과값들로 집합 S2 생성
- S1과 S2의 모든 원소에 대해 서로 암/복호화 결과가 일치하는 쌍들을 선정, 후보키 집합 CK 생성
- 다른 평문(평문2)와 평문2를 암호화한 암호문2 생성
- CK의 모든 원소에 대해 평문2-암호문2 간의 암/복호화 관계를 만족시킬 만한 값들의 쌍으로 집합 CK 갱신
- CK 집합의 원소가 하나만 남을 때까지 위 과정 반복
- 위의 방법을 쓸 경우 연산량에 유의미한 영향을 미치는 것은 1~2번에서의 암복호화뿐(2^56번)
- 3에서의 후보키 생성은 퀵정렬/이분탐색으로 빠르게 수행 가능
- 4~6에서의 과정은 반복 횟수가 많지 않음
- 위의 방법으로 인해 평문과 암호문만 알 수 있다면 이중 DES는 그다지 안전성이 높지 못한 방법이 됨
- (112비트 키 DES의 안전성에 비해 부족)
- 삼중 DES는 위 공격을 적용해도 112비트 키 DES 이상의 안전성 확보 가능 => 일반적으로 다중 DES는 삼중으로 사용
3. 운영모드
= Mode of Operation
= 블록 암호로 다양한 크기의 데이터를 처리할 수 있도록 고안된 사용법
여러 종류가 있으며, 각각의 장단점을 고려해 선택됨
3-1. 패딩(Padding)
: 평문 크기가 블록 크기로 나누어떨어지지 않는 문제를 해결하기 위해
평문에 데이터를 붙여 배수로 만드는 과정
- 복호화 시 패딩을 제거해야만 원래의 평문을 얻을 수 있기 때문에 수신자 측에서는 적용된 패딩에 대해 알아야 함
- 비트 패딩(Bit ~) : 마지막 블록에서 남는 비트 중 최상위 비트는 1, 나머지는 모두 0으로 채우는 기법
- 평문의 마지막 비트부터 처음으로 1 비트가 나올 때까지를 패딩으로 인식하고 지우면 됨
- / 평문 길이가 정확히 블록크기의 배수일 때 평문을 패딩으로 오해할 가능성이 있으므로
- 이 경우 패딩으로 한 블록을 추가함
- 바이트 패딩(Byte ~) : 바이트 단위로 패딩을 수행하는 기법
- ANSI X.923 : 마지막 블록의 남는 바이트를 임의 값으로 채우고 마지막 바이트에 패딩의 길이 기록
- 비트 패딩과 마찬가지로 수신자가 평문을 패딩으로 오해할 수 있음. 이 경우 패딩 블록 추가
- PKCS(Public-Key Cryptography Standard)#7 패딩 : 추가할 패딩의 바이트 크기로 마지막 블록을 채우는 기법
- 평문 크기가 정확히 배수일 경우 남는 크기를 8바이트로 간주하고 08을 패딩
3-2. ECB(Electronic Code Book) 모드
: 가장 간단한 운영모드. 블록들을 모두 같은 키로 암호화한다.
각 블록이 독립적으로 암호화되므로 여러 블록을 병렬적으로 암호화할 수 있음
암호학적 안전성이 부족함
= 모든 블록이 같은 방식으로 암호화되기 때문에 암호문에서 평문의 성질 취득 가능(약한 혼돈 성질), 리플레이 공격 가능
재전송 공격 (Replay attack)
: 어떤 데이터를 재전송하여 시스템이 의도치 않은 행동을 하게 하는 것
전송된 데이터의 평문과 암호문을 알게 되면 평문 중 일부가 암호화했을 때 어떤 부분이 되는지 알 수 있고
이를 이용해 전송된 메시지를 조작하여 재전송, 시스템의 의도와 다른 일이 벌어지게 함
3-3. CBC(Cipher Block Chaining) 모드
: 어떤 블록을 암호화하기 전에 해당 블록을 직전 블록의 암호문과 XOR하는 것
- 첫 번째 블록의 경우 이전 블록이 존재하지 않으므로 초기 벡터(Initialization Vector, IV)와 XOR함
- 각 블록이 서로의 암호화에 영향을 줌 -> 같은 블록도 전체 평문/IV에 따라 암호화 결과가 달라짐
- 초기 벡터는 일반적으로 논스(Nonce, Number used only ONCE)라는 무작위 값을 사용함
- 공격자가 알아도 안전성에 영향을 끼치지 않음
- / 공격자가 중간에 암호문을 가로채 조작할 수 있다면 복호화 결과의 첫 블록을 조작할 수 있음
- -> CBC 모드에서는 초기 벡터의 무결성 보장이 중요
- 여러 블록을 병렬적으로 암호화할 수 없으나 복호화의 경우는 병렬 처리 가능
- 재전송 공격에 강함, 높은 혼돈성 -> 블록 암호의 운영 모드로 널리 사용됨
CBC Bit-Flipping Attack
: 공격자가 초기 벡터를 원하는 값으로 조작하여 복호화된 평문의 첫 번째 블록을 조작하는 공격
3-4. CTR(Counter)모드
: 블록 암호에 논스와 평문 블록의 인덱스(counter)를 결합한 값을 입력함
암호문은 블록 암호의 출력과 평문 블록을 XOR하여 생성
- 블록을 순서대로 암복호화하지 않아도 됨 -> 병렬 암복호화 가능
- 구현이 간단함
'암호학' 카테고리의 다른 글
8주차 암호학 정리 (0) | 2022.08.26 |
---|---|
7주차 암호학 정리 (0) | 2022.08.19 |
6주차 암호학 정리 (0) | 2022.08.09 |
4주차 암호학 정리 (0) | 2022.07.26 |
3주차 암호학 정리 (0) | 2022.07.18 |