Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- java
- 일급 컬렉션
- Dependency Injection
- OAuth 2.0
- middleware
- 일급 객체
- builder
- synchronized
- Volatile
- factory
- lombok
- Google OAuth
- Spring
- spring security
- nestjs
Archives
- Today
- Total
HJW's IT Blog
5 장 본문
**AES (Advanced Encryption Standard)
- AES 는 DES 를 대체하는 블럭암호로 상업적 용도로 개발
- 128 bit 블록 사이즈, 128 192, 256 bit key size
- Feistel 구조를 사용하지는 않지만 각 라운드는 4가지 암호화 과정으로 이루어진다
- 바이트 치환 변환
- 행이동
- 열혼합
- 라운드 키 더하기
- AES는 8bit 기본단위연산으로 동작하며 덧셈, 곱셈, 나눗셈 연산을 유한체를 바탕으로 연산
- Rijndael 알고리즘 개발자들은 더이상 약분할 수 없는 8차 다항식 30개를 선택하여 사용
**유한체의 집합 S의 수학적 연산 정의
- 다항식 연산에 쓰이는 차수가 modular 2 로 동작하며, XOR 연산과 같다
- 곱셈의 결과가 n - 1 차수보다 클 경우, 다항식은 m(x) 의 차수 n 의 모듈러 연산을 통해 줄어들게 되며 나머지는 저장
- 다항식 함수 f(x) 에 대해 나머지 r(x) = f(x) mod m(x) 로 나타냄
- 다학식이 m(x) 보다 낮은 차수이면 irreducible
**일반구조
- 암호화 복호화 과정에서 128bit 블록이 쓰인다 -> 4 x 4 행렬
- 블록은 상태 배열로 복사되며 암호화 / 복호화 단계에서 수정되어 쓰인다
- 키는 비트 행렬로 나타내어 지며 키 스케줄러 연산에 따라 확장
- 다음 그림은 AES 의 데이터 구조
-
128 bit 길이의 키를 사용할 때, 위와 같다
-
위의 상태 행렬은 p0…p15 로 이루어져 있는데, 이때 바이트 pi 는 바이트 bj,k 로 상태 행렬에 채워진다.
- 이때 j = i mod 4 이고 k = 1/4
-
상태 행렬이 모두 채워진 뒤, AES 알고리즘에서 각 라운드 마다 사용하는 round key 를 생성
-
라운드 키를 얻으면, 상태 행렬과 XOR 연산을 하여 새로운 상태 행렬을 생성
-
-
각 라운드의 첫 연산은 SubBytes 라고 하며, S-box 에서 바이트를 가져와 대체한다.
-
S-box 는 GF(28) 상에 매핑되어 있다.
-
상태 행렬의 각 xi,j 는 1byte 이기에 2개의 16진수로 표현할 수 있다.
-
그렇게 구한 2개의 16진수 (h1, h2) 를 S-box 의 (h1,h2) 요소이다.
-
-
-
라운드의 두번째 연산은 ShiftRows연산이며, 각 행의 위치가 증가되는 수 만큼 상태 행렬의 각 행을 왼쪽으로 이동
-
-
라운드의 3번째 연산은 Mix Columns 이다.
- 현재 상태 행렬에서 고정 행렬을 곱하여 새로운 행렬을 생성
- 고정행렬은 다음과 같다
-
-
더하기 라운드 키 변환
- 라운드 키 추가 변환에서 상태 배열의 128 비트는 라운드 키의 128비트 와 비트 단위로 XOR 연산을 수행한다
- 즉, 상태 배열의 한 열 4 바이트와 라운드 키의 1워드 사이의 열 연산
- 라운드 키 추가 변환의 예는 다음과 같다
-
AES 의 전체 과정을 보면 다음과 같다
-
AES 키 확장
- 4 word 의 입력을 받아 44워드의 선형 배열로 확장 선형 배열로 확장
- 키는 확장된 키의 첫 4워드로 복사
- 추가되는 워드 w[i] 는 직전 워드 w[i-1] 과 4개 이전 워드 w[i-4] 에 의해 결정
- 이전 4워드 중 3개는 단순 XOR
- 첫번째 워드에서 4번째 XOR 을 수행하기 전, 순환이동, S-box, 이전 라운드 상수와의 XOR 연산을 수행
**키 확장 원리
- 암호화 키 또는 라운드 키의 일부분을 알아도 다른 라운드 키 비트 계산 불가능
- 역 변환 가능
- 빠른 연산
- 암호화 키 확산을 통해 라운드 키 변환
- 각 키 비트의 변화는 라운드 키 비트에 영향을 미친다
- 암호화 키의 차이점만으로부터 라운드 키 차이점의 전체를 결정하는 것을 방지하기 위함
**AES Decryption
- AES Decryption 은 암호화 과정을 역순으로 수행
- 모든 단계를 역순으로, 키 스케줄링을 다르게 하여 수행
- 결과괎이 변경되지 않는다면
- 바이트 치환과 행 이동을 맞바꿈
- 열 혼합과 라운드 키 추가를 맞바꿈
**AES 구현
- 8bit CPU 에서 매우 효율적으로 구현 가능
- 256 byte 의 테이블만 요구
- 열 이동은 단순한 바이트 이동
- 라운드 키 추가는 바이트 단위 XOR 연산
- 열 혼합 연산은 모든 연산이 바이트로 실행되는 GF(28) 상의 행렬 곱셈을 필요로 한다
- 32 bit 의 워드를 사용하기 위해 재정의
- 256 word로 이루어진 4개의 테이블을 미리 연산 가능
- 매 라운드의 각 열은 4번의 테이블 참조와 4번의 XOR 을 사용하여 계산 가능
https://blog.naver.com/PostView.nhn?blogId=simhs93&logNo=221965569648
-> Key 확장 참고 블로그