AES(Advanced Encryption Standard)
AES는 SPN(Substitution Permutation Network)이라는 암호 구조를 사용한다.
SPN은 곱 암호의 일종으로, S-Box를 사용하는 치환(Substitution)과 P-Box를 사용하는 순열(Permutation)을 여러 라운드에 걸쳐 반복한다. 치환, 순열(배열), 치환, 순열을 반복하는 구조이다.
AES는 라운드마다 128비트 크기의 블록을 암호화하는 블록 암호이다. 키의 길이는 128, 192, 256비트 중 하나를 선택할 수 있고, 라운드 수는 키의 길이에 따라 10, 12, 14로 결정된다. 키의 길이가 128비트이면 AES-128, 192비트이면 AES-192, 256비트이면 AES-256이라고 부른다.
AES는 암호화를 할 때, 가장 먼저 각 블록을 4행 4열의 상태 배열(State)로 재구성한다. State의 각 칸에는 8비트(1바이트)가 저장된다. 재구성된 입력에 대해 AddRoundKey 함수를 적용하고, 마지막 라운드 전까지 매 라운드마다 SubBytes, ShiftRows, MixColumns, AddRoundKey 함수를 반복하여 적용한다. 마지막 라운드에서는 MixColumns를 제외한 나머지 함수들만 적용한다.
SubBytes
State의 각 바이트를 S-Box를 참조하여 치환하는 함수이다. 바이트의 상위 4비트가 행, 하위 4비트가 열을 결정한다.
ShiftRows
State의 각 행을 구성하는 바이트들을 쉬프트하는 함수이다. 이 함수는 4가지 함수 중에서 유일하게 순열의 역할을 수행한다. 2행은 왼쪽으로 1칸, 3행은 왼쪽으로 2칸, 4행은 왼쪽으로 3칸을 민다. 복호화할 때는 반대로 2행, 3행, 4행을 각각 오른쪽으로 1칸, 2칸, 3칸씩 민다.
MixColumns
열 단위로 치환을 수행하는 함수이다. 이 치환은 갈루아 필드 내에서의 행렬 연산으로 구해진다.
AddRoundKey
키 생성 함수(Key Schedule)로 생성된 라운드 키의 state를 각 바이트별로 XOR한다. 복호화할 때는 XOR의 성질을 이용하여 동일한 키를 state에 XOR한다.
*Key Schedule
키 생성 함수는 입력된 키로부터 각 라운드에 쓰일 라운드 키를 생성한다.
-RotWord
열을 위로 한 번 회전시킨다.
-SubWord
SubBytes에서 사용한 것과 동일한 S-Box를 사용하여 각 바이트를 치환한다.
DES
DES는 혼돈 성질을 만족하기 위해 치환(Substitution)을, 확산 성질을 만족하기 위해 순열(Permutation)을 사용한다. DES는 현대 블록 암호 중 하나로, 초기 순열, 16개의 페이스텔 라운드, 그리고 최종 순열로 구성된다.
페이스텔 구조
(1)입력으로 들어온 블록을 동일한 길이의 왼쪽 블록 LL과 오른쪽 블록 RR으로 나눈다.
(2)각 라운드마다 오른쪽 블록은 다음 라운드의 왼쪽 블록으로 입력한다.
(3)왼쪽 블록은 오른쪽 블록에 라운드 함수 FF를 적용한 결과와 xor되어 다음 라운드의 오른쪽 블록으로 입력된다.
DES는 시작할 때 초기 순열(Initial Permutation, IP)을, 마지막에는 최종 순열(Final Permutation, FP)을 수행한다.
라운드 함수는 확장 순열(Expansion P-Box), 라운드 키 결합(XOR), 치환 테이블(S-Box) 그리고 고정 순열(Straight P-Box)로 이루어져 있다.
키 생성 함수(Key Scheduling)는 64비트의 입력을 받아 각 라운드에 필요한 48비트 라운드 키를 생성하는 함수입니다. 이 함수는 패리티 비트 제거(Parity Bit Drop), 쉬프트(Shift), 압축 순열(Compression P-Box)로 구성되어 있습니다.
패리티 비트 제거(Parity Bit Drop)는 입력에서 패리티 비트를 제거하고, 남은 56비트에 순열을 적용하는 과정이다.
쉬프트(Shift)는 입력을 왼쪽 28비트와 오른쪽 28비트로 나누어 각각을 1비트나 2비트만큼 왼쪽으로 순환 쉬프트(Cyclic Shift)하는 과정이다.
압축 순열(Compression P-Box)은 56비트의 입력을 48비트 길이로 압축하는 과정이다.
운영모드
블록 암호로 이러한 다양한 크기의 데이터를 처리할 수 있도록 고안된 블록 암호의 사용 방법이다.
패딩(Padding)
평문의 크기가 블록 크기의 배수가 되도록 만드는 과정이다.
패딩된 암호문을 복호화할 때는 복호화된 평문에서 패딩을 제거해야 원래의 평문을 얻을 수 있다. 따라서 패딩된 암호문의 수신자는 어떤 패딩이 적용됐는지 알아야 암호문을 제대로 복호화할 수 있다.
널리 사용되는 패딩 기법에는 비트 패딩(Bit Padding), 바이트 패딩(Byte Padding), 그리고 PKCS#7 패딩이 있다.
비트 패딩(Bit Padding
마지막 블록에서 평문이 채우지 못하는 비트 중 최상위 비트를 1로 설정하고, 나머지는 모두 0으로 채우는 패딩 기법이다.평문의 크기가 블록 크기의 배수일 때, 수신자가 평문을 패딩으로 오인할 수 있기 때문에 평문의 크기가 블록 크기의 배수일 때는 마지막에 한 블록을 패딩으로 추가한다.
바이트 패딩(Byte Padding)
바이트 단위로 패딩을 수행하는 패딩 기법이다. 바이트 패딩에는 여러 종류가 있다.
-ASNI X.923
마지막 블록의 남는 바이트를 임의의 값(일반적으로 0)으로 채우고, 마지막 바이트에 패딩의 길이를 기록하는 기법이다.
ANSI X.923은 비트 패딩과 마찬가지로 평문의 크기가 블록 크기의 배수일 때, 수신자가 평문을 패딩으로 오인할 수 있다. 따라서 평문의 크기가 블록 크기의 배수일 때는 마지막에 한 블록을 패딩으로 추가한다.
PKCS#7
PKCS(Public-Key Cryptography Standard)는 공개키 암호의 표준 문서로서, 그중 7번째 문서인 PKCS#7은 AES와 같은 블록 암호의 패딩 기법을 제시하고 있습니다. PKCS#7에 소개된 패딩 기법은 추가할 패딩의 바이트 크기로 마지막 블록을 채우는 패딩 기법입니다. 아래 예시는 PKCS#7으로 마지막 블록에 4바이트를 패딩한 것입니다.
다른 패딩 기법들과 마찬가지로 평문의 크기가 블록 크기의 배수이면, PKCS#7은 |\;\bold{08\;08\;08\;08\;08\;08\;08\;08}\;|∣0808080808080808∣을 패딩으로 추가합니다.
ECB모드
ECB(Electronic Code Book) 모드는 가장 간단한 운영모드로, 블록들은 모두 같은 키로 암호화 됩니다.
ECB 모드에서는 각 블록이 독립적으로 암호화되므로 여러 블록을 병렬적으로 암호화할 수 있다는 장점이 있습니다. 그러나 ECB는 다른 운영모드에 비해 암호학적 안전성이 부족하다는 단점이 있습니다.
CBC모드
CBC(Cipher Block Chaining) 모드는 어떤 블록을 암호화하기 전에, 이 블록을 직전 블록의 암호문과 XOR합니다. 평문의 첫 번째 블록은 이전 블록이 존재하지 않으므로, 초기 벡터(Initialization Vector, IV)라고 불리는 임의의 데이터와 XOR합니다. 이 모드를 사용하면 각 블록이 서로의 암호화에 영향을 주므로 같은 블록도 전체 평문 및 IV에 따라 암호화 결과가 달라집니다.
CBC모드는 한 블록을 암호화할 때 직전 블록의 암호화 결과를 사용하므로 여러 블록을 병렬적으로 암호화할 수 없습니다. 그러나 복호화의 경우, 모든 암호문 블록을 알고 있으므로 병렬적으로 처리할 수 있습니다.
CBC모드는 재전송 공격에 강인하며, 높은 혼돈성을 가지고 있어서 블록 암호의 운영 모드로 널리 사용되고 있습니다.
CTR모드
CTR(Counter)모드는 블록 암호에 nonce와 평문 블록의 인덱스(counter)를 결합한 값을 입력합니다. 암호문은 블록 암호의 출력과 평문 블록을 XOR하여 생성합니다. 블록을 순서대로 암복호화하지 않아도 되므로 병렬로 암복호화할 수 있으며, 구현이 간단하다는 장점이 있습니다.
'Dreamhack > Crypto' 카테고리의 다른 글
Stage9 전자서명 (0) | 2022.08.15 |
---|---|
Stage5 (0) | 2022.08.07 |
Stage4 (0) | 2022.08.03 |
암호학 Stage2 (0) | 2022.07.25 |
암호학 Stage1 (0) | 2022.07.25 |