[crypto] Stage 3
AES (Advanced Encryption Standard)
- 2001년에 새롭게 표준으로 선정된 블록 암호 알고리즘
- Vincent Rijmen, Joan Daemen이 제안한 Rijndael 구조
- 기밀성을 위협하는 치명적인 취약점이 발견되지 않음
- 현대에는 대칭키 암호 알고리즘을 사용할 때, 일반적으로 AES 사용
SPN (Substitution Permutation Network)
- 곱 암호의 일종으로 S-Box를 사용하는 치환(Substitution)과 P-Box를 사용하는 순열(Permutation)을 여러 라운드에 걸쳐 반복
- 페이스텔 구조와 달리 라운드마다 입력 전체에 라운드 함수 적용
- 같은 수의 라운드를 사용할 때 SPN이 페이스텔 구조에 비해 두 배의 안전성
AES 구조
- 라운드마다 128비트 크기의 블록을 암호화하는 블록 암호
- 키의 길이는 128, 192, 256비트 중 하나 선택
- 라운드 수는 키의 길이에 따라 10, 12, 14로 결정
- 블록을 4행 4열의 상태 배열(State)로 재구성
- 재구성된 입력에 대해 AddRoundKey 함수를 적용
- 마지막 라운드 전까지 매 라운드마다 SubBytes, ShiftRows, MixColumns, AddRoundKey 함수를 반복하여 적용
- 마지막 라운드에서는 MixColumns를 제외한 나머지 함수들만 적용
- AES의 라운드 함수들은 역함수가 존재
- 역함수를 이용하여 AES 복호화
라운드 함수
SubBytes
- State의 각 바이트를 S-Box를 참조하여 치환하는 함수
- 바이트의 상위 4비트가 행, 하위 4비트가 열을 결정
ShiftRows
- State의 각 행을 구성하는 바이트들을 쉬프트하는 함수
- 유일하게 순열의 역할을 수행
MixColumns
- 열 단위로 치환
- 갈루아 필드 내에서 행렬 연산
AddRoundKey
- 키 생성 함수(Key Schedule)로 생성된 라운드 키의 state를 각 바이트별로 XOR 연산
- 복호화: XOR의 성질을 이용하여 동일한 키를 state에 XOR
Key Schedule
- 입력된 키로부터 각 라운드에 쓰일 라운드 키 생성
DES (Data Encryption Standard)
- 미국의 국가 안보국(National Security Agency, NSA)에서 IBM의 루시퍼 알고리즘을 개량하여 만든 대칭키 암호
- 현대에는 DES에 대한 공격 기법이 많이 연구되어 DES를 더이상 블록 암호의 표준으로 사용하지 않음
- 8바이트(64비트)를 한 블록으로 하는 블록 암호
- 초기 순열(Initial Permutation, IP), 최종 순열(Final Permutation, FP), 페이스텔(Feistel) 구조의 16 라운드 각 라운드에 사용되는 48비트의 키를 생성하는 키 생성 함수(Key Generation)로 구성
순열과 치환
- 혼돈 성질을 만족하기 위해 치환 (Substitution) 사용
- 확산 성질을 만족하기 위해 순열(Permutation) 사용
- 순열과 치환을 여러 번 교차해서 반복 적용하면 혼돈과 확산의 성질 모두 만족
- 치환이나 순열 같은 단순한 연산들로 한 라운드로 구성
- 곱 암호(Product Cipher): 각 라운드를 여러 번 반복하여 암호학적 안전성을 확보하는 암호
페이스텔 구조 (Feistel)
- 일반적으로 암호화를 구성하는 각 함수들에 역함수 존재
- 페이스텔 구조를 사용하면 F 가 복호화 과정에서 \oplus 로 상쇄되므로 역함수가 존재 X
- 암호화와 복호화의 구조가 동일하므로, 암호화에 사용한 라운드 키를 역순으로 입력하면 복호화
- 비페이스텔 암호와 같은 안전성을 갖기 위해 두 배 정도 라운드를 사용해야한다는 단점
초기 순열 / 최종 순열 (IP / FP)
- 시작할 때 초기 순열 수행 → 마지막에는 최종 순열 수행
- 정해진 테이블을 이용하여 64비트 입력을 비트 단위로 전치
- 테이블의 n번째 값이 m일 때, 출력의 n번째 비트는 입력의 m번째 비트
- 초기 순열과 최종 순열은 서로 역관계
라운드 함수
- 라운드 함수 F에는 오른쪽 블록만 입력 (입력 길이 32비트)
- 확장 순열, 라운드 키 결합, 치환 테이블, 고정 순열로 구성
확장 순열과 라운드 키 결합
- 확장 순열 : 입력을 비트 단위로 전치하는 동시에, 전체 길이를 48비트로 확장
→ 32비트의 입력값을 4비트씩 8개의 부분으로 나누고, 테이블을 참조하여 각각을 6비트로 확장
S-Box와 고정 순열
- S-Box : 라운드 키 결합에서 출력된 48비트 결과 값을 32비트로 축소
- S-Box로 길이를 축소하고 나면, 고정 순열(Straight P-Box)로 다시 비트 단위 전치
→ 4개의 행과 16개의 열로 이루어진 표를 사용
→ 표의 각 값은 4비트로 표현되는 수
키 생성 함수 (Key Scheduling)
- 64비트의 입력을 받아 각 라운드에 필요한 48비트 라운드 키를 생성하는 함수
- 패리티 비트 제거, 쉬프트, 압축 순열로 구성
패리티 비트 제거 (Parity Bit Drop)
- 입력에서 패리티 비트를 제거하고, 남은 56비트에 순열을 적용하는 과정
- 홀수 패리티 비트: DES의 비밀키에서 각 바이트의 가장 오른쪽 비트
- 통신 중에 비트 반전이 일어나지 않았음을 보증하는 역할
→ 자신이 속한 바이트의 나머지 7비트에 대한 비트
→ 한 바이트를 이진수로 표현했을 때, 1의 개수가 홀수가 되도록 덧붙인 비트
쉬프트 (Shift)
- 입력을 왼쪽 28비트와 오른쪽 28비트로 나누어 각각을 1비트나 2비트만큼 왼쪽으로 순환 쉬프트하는 과정
- 1, 2, 9, 16 라운드 : 1비트, 나머지 라운드 : 2비트
압축 순열 (Compression P-Box)
- 56비트의 입력을 48비트 길이로 압축하는 과정