DES는 56비트의 키를 가지는 암호화 방법이다. 짧은 키로 인해 브루트포스 어택이 쉽다.
Double-DES는 DES를 2번 적용하는 방법이다. 2^112일 것 같지만, 모든 가능한 키에 대하여 평문을 암호화하고, 각 결과를 저장한 다음 같은 암호문을 모든 가능한 키에 대해 복호화하고 암호화 결과와 복호화 결과가 일치하는 것을 찾는 meet in the middle attack을 사용하면 2^57밖에 되지 않는다.
Triple-DES는 DES를 3번 적용하는 방법이다. 각 단계별로 다른 키에 대해 암호화-복호화-암호화 를 실행한다. 복호화-암호화-복호화도 가능하다.
C = Ek1(Dk2(Ek3(P)))
k1,k2,k3중에 같은게 있다면 single DES와 같아진다. 비교적 안전하지만 암호화와 복호화가 오래 걸리는 단점이 있다.
Block vs Stream Ciphers
stream 암호화는 평문의 각 비트나 바이트를 순차적으로 암호화하고, block 암호화는 데이터블록 단위로 암호화한다.
블록 암호는 고정된 크기의 데이터 블록을 사용한다. 예를 들어 DES는 56비트의 키로 64비트의 데이터블록을 암호화한다.
블록 암호와 스트림 모드의 운용 모드로는 ECB, CBC, CFB, OFB, CTR가 있다. 블록 크기보다 작은 데이터를 위해 메시지 패딩이란 방법도 있다.
메시지 패딩은 null값으로 패딩하거나 마지막 데이터 블록에 null값 + 패딩 크기를 추가한다. 예를 들어서 [b1 b2 b3 0 0 0 0 5] 와 같은 방법으로 패딩을 추가할 수 있다. ciphertext stealing을 사용하면 추가 블록 없이 패딩을 처리할 수 있다.
Ci = Ek(Pi)
Pi = Dk(Ci)
ECB는 동일한 평문에 대해 동일한 암호문을 반환한다. 각 블록에 대해 독립적으로 암호화하므로 병렬로 처리가 가능하다.
Ci = Ek(Pi XOR Ci-1)
C1 = Ek(P1 XOR IV)
Pi = Dk(Ci) XOR Ci-1
CBC(Cipher Block Chaining)는 Initial Vector라는 무작위 값을 사용한다. 첫 번째 평문 블록과 XOR 연산되어 첫 번째 암호문 블록을 생성한다. 다음 블록부터는 직전의 암호문 블록에 의존하여 암호화한다. 암호문의 무결성을 높이며 중간에 변조가 발생하면 복호화 과정에서 오류가 발생한다. 다만 병렬처리가 어렵고 초기 벡터는 안전하게 관리되어야 한다.
Ciphertext Stealing은 마지막 평문 블록이 블록 크기보다 작을 때, 바로 앞의 암호문 블록에서 필요한 바이트를 훔쳐서 마지막 평문 블록을 완전한 블록 크기로 만든다. 훔쳐진 바이트를 포함하는 암호문 블록과 마지막 암호문 블록의 위치를 교환한다.
Ci = Pi XOR Ek(Ci-1)
C0 = IV
Pi = Ek(Ci-1) XOR Ci
CFB-s(Cipher Feedback)는 가장 일반적인 stream 암호화로, s bits 단위로 암호화한다. 랜덤으로 IV를 생성하고, IV를 암호화한 뒤, 평문 s비트를 XOR연산한다. 이 값을 IV를 좌측으로 s비트만큼 쉬프트 한 뒤, 빈 공간에 넣는다. 이를 평문 길이만큼 반복한다. 암호화할 때와 같은 알고리즘에 암호문을 넣어주면 복호화가 된다.
IV와 K가 같다면 동일한 값이 나오므로 재사용해선 안된다.
Oi = Ek(Oi-1)
O0 = IV (nonce)
Ci = Pi XOR Oi
Pi = Oi XOR Ci
OFB(Output Feedback)는 NONCE라는 값을 사용하여 암호화한다. NONCE는 Number used by ONCE를 뜻한다.
Pi와 Ci가 다음 값에 영향을 끼치지 않기 때문에 랜덤비트를 미리 생성해둘 수 있다. 따라서 빠르다.
Oi = Ek(Ti)
Ci = Pi XOR Oi
Pi = Oi XOR Ci
CTR(Counter)은 카운터를 통해 암호화를 하며, P와 C가 다음 값에 영향을 끼치지 않아 독립적이며 병렬 실행이 가능하여 원하는 곳에 대한 암호/복호화도 가능하다.
Tweakable Block Cipher는같은 입력 P에 대하여 treak(T)이 다르다면 다른 출력이 나온다. 여기서 Hash function은 단방향 함수로, 역방향 계산이 안된다. Ek(H(Tj) XOR Pj) XOR H(Tj), XOR-Encrypt-XOR(XEX)로 암호화한다.
Tj = Ek2(i)*aj
Cj = Ek1(Pj XOR Tj) XOR Tj
XTS-AES는 블록지향 저장소를 위한 블록 암호화 기법이다. tweak는 데이터가 저장된 물리적 주소 위치를 사용한다. α는 GF(2^128)에서의 생성기이며, j는 데이터 단위 내의 블록 번호이다.
첫 번째 단계에서 tweak값 i와 α를 모듈러 곱셈하여 Tj를 계산하고 평문블록 Pj와 XOR한 후 AES 암호화 한 뒤 Tj와 한 번 더 XOR하여 암호화한다. 모듈러 곱셈간에 사용되는 기약다항식은 x^128 + x^7 + x^2 + x + 1이다.
병렬화하여 암호화할 수 있기에 높은 처리 성능을 가질 수 있고, 독립적으로 암호화되기 때문에 임의 접근이 가능하다. 또한 ciphertext-stealing 기법을 사용할 수 있다.
'학교강의필기장 > 암호학' 카테고리의 다른 글
6. number theory (1) | 2023.10.17 |
---|---|
5. Random Number (2) | 2023.10.16 |
3. AES (0) | 2023.10.12 |
2. 모듈러 연산 (1) | 2023.10.10 |
1. 고전 암호화 기법들 (0) | 2023.09.07 |