키의 길이가 56bit이다.
56bit가 짧아서 AES가 나온거다.
Block Cipher: 임의의 길이의 데이터를 고정된 데이터 길이로 바꿔 데이터를 암호함. 56bit -> 64bit block으로 암호함.
Feistel Nework: 여러개의 round들로 구성된다. typically 16 rounds in DES
Confusion: key와 Ciphertext와의 관계를 숨김. (Substitution 방법 사용)
Diffusion: Plantext와 Ciphertext와의 관계를 숨김 (Permutations 방법 사용)
Round가 여러개 존재하고 하나의 round 안에 Substitution + Permutation이 작동하고 여러번 라운드가 반복할수록 안정성이 올라감.
![]()
✅ Encryption
1. DES의 input은 64bit이다. L0 32bit, R0 32bit.
2. F함수에서 Substitution + Permutation이 관련 일을 한다. 해당 F함수에 들어오는 Key의 값은 56bit 아닌 round가 16까지 있으니 안전상의 문제로 여러개의 subkey를 만들어 48bit짜리 key를 사용한다.
3. 마지막 round는 교차하지 않는다.![]()
✅ Decryption
L'0과 R'0에 Encryption의 L2, R2를 각각 넣고 동일하게 진행하되 Key값만 역순으로 들어가면 원래 값을 복원할 수 있다.
Initital에 1번째로 58번째 bit가 들어온다면 반대로 final에서는 58번째로 1번째 bit가 들어온다.
+ intital에 40번째로 1번째 bit가 들어온다면 final에서는 1번째로 40번째 bit가 들어온다.
input이 32bit이고 key는 48bit이므로 Expansion P-box를 통해 48bit로 확장해주고 XOR연산을 진행한다.
S-boxes : Subtitution 관련 일
Straight P-box: Permutation이 관련 일Expansion P-box
S-Boxes
48bit니까 각 S1, S2 , .. , S8까지 각 6bit씩 받아서 처리 후 4bit씩 output이 나오니 4 x 8 = 32bit가 최종 리턴된다.
앞뒤 1bit씩을 사용해 RowNo로 만들고 나머지 4개의 bit는 colNum으로 만들어서 계산한다.
‼️ 비선형이다. f(x+y) != f(x) + f(y)
현재 input 110010 XOR 111111와 110010을 S-Box에 넣어 나온 값과 111111과 XOR한 값과 다름.
Straight Permutation
각 block안에서의 섞는 것이 전체적으로 섞음.
전체 흐름
1. 처음 들어온 64bit 중 오른쪽 32bit 값이 들어옴
2. Expansion P-box를 통해 48bit로 만든 후 Round Key와 XOR을 한 뒤 32bit로 output
3. 나온 값을 Straight Permutation을 통해 섞는다.
4. 나온 32bit결과와 왼쪽 32bit의 값을 XOR해서 결과를 얻는다.
- 64bit 중 56bit만 사용. (PC1 table)
- 56bit를 28bit 2개로 나눈다
- 라운드마다 left rotated를 하는데 1번 혹은 2번 (사전에 명시)
- 48bit로 만들어주기 위해 PC2 table 사용
8,16,24,.. 8의 배수의 bit들을 삭제함으로써 64bit -> 56bit로 만듬
9,18,22,25번째 bit들을 삭제함으로써 56bit -> 48bit
앞에서 평문을 k1으로 암호화한 것과 뒤에서 암호문을 k2로 복호화한 값이 동일한 것이 반드시 존재한다.
여기서 만약에 Ek1(P) == Dk2(C) 일 때, k1과 k2의 pair로 Double DES로 사용됐구나 알 수 있다.
그렇기에 각각 Ek1(P)는 2^56이고 Dk2(C)도 2^56이기에 2 x 2^56 = 2^57 Meet-in-the-Middle attack 2^57만 하더라도 뚫림
56bit짜리 key 3개로 168bit이지만 안정성은 Double DES에서 원했던 2^112 이다.