현대 암호는 크게 블럭 암호와 스트림 암호, 또는 공개키 암호와 대칭키 암호로 구분하는데, DES는 64비트 단위의 블럭을 사용하는 블럭 암호 시스템이며, Encryption / Decryption 과정에서 동일한 키를 사용하는 대칭키 암호 시스템이다.
DES 방식을 이용하여 메세지를 교환하기 위해서는, Encryption / Decryption에 필요한 64비트 키를 준비해 서로 교환해둔다. 이 키는 그대로 사용되는 것이 아니라 적절한 계산을 거쳐 새로운 보조키 열 K1, K2, ... K16으로 변형하여 사용한다. DES 전체 진행 과정은 다음과 같다.
1. IP(Initial Permutation) 치환
2. 좌우 분리
3. 16라운드 진행(Feistel Function)
4. IP 역치환
이 중에서 3단계가 가장 복잡하며, 실질적인 DES 알고리즘의 핵심이다.
좀 더 자세히 설명하면, IP 치환 과정은 주어진 메세지를 64비트로 블럭화하고, 초기 치환 64비트 테이블을 이용하여 블럭화된 메시지의 비트를 바꾼다. IP 테이블은 다음과 같다.
58 50 42 34 26 18 10 02
60 52 44 36 28 20 12 04
62 65 46 48 30 22 14 06
64 56 48 40 32 24 16 08
57 49 41 33 25 17 09 01
59 51 43 35 27 19 11 03
61 53 45 37 29 21 13 05
53 55 47 39 31 23 15 07
이 테이블이 의미하는 것은, 1번째 비트는 58번째 비트와 자리바꿈을 하라는 것이다. 2번째 비트는 50번째 비트와 자리바꿈해야하며, 3번째 비트는 34번째 비트와 자리바꿈을 해야 한다. 이렇게 초기치환을 거친 IP(m)은 각각 32비트씩 L0, R0로 나누어 1라운드 암호화 과정에 들어간다. 이것이 2단계이다.
그리고, 실질적인 암호화 과정을 수행하는 3단계에서, L1은 R0을 사용한다. 그 다음으로 오른쪽 32비트 R1은, R0를 f 연산 과정을 거쳐서 처리한 후 그 값과 L0를 XOR하여 얻는다. 여기서 f 연산들이 Feistel Function이며, 한 라운드를 넘기는 과정마다 보조키 K1, K2, .. K16이 차례로 쓰여진다. 모두 16라운드를 진행한다.
마지막으로, 16라운드를 모두 진행하여 L16과 R16을 얻었다면 좌우를 다시 다시 바꾼 64비트 블럭 R16, L16에 초기 치환 IP의 역치환인 inverse IP를 적용한다. 이렇게 되면 우리가 원하고자 했던 최종적인 암호문을 얻게된다. inverse IP 테이블은 다음과 같다.
40 08 48 16 56 24 64 32
39 07 47 15 55 23 63 31
38 06 46 14 54 22 62 30
37 05 45 13 53 21 61 29
35 04 44 12 52 20 60 28
35 03 43 11 51 19 59 27
34 02 42 10 50 18 58 26
33 01 41 09 49 17 57 25
Reference
최병문, 이영환(2007), 암호의 세계, 경문사
DES 방식을 이용하여 메세지를 교환하기 위해서는, Encryption / Decryption에 필요한 64비트 키를 준비해 서로 교환해둔다. 이 키는 그대로 사용되는 것이 아니라 적절한 계산을 거쳐 새로운 보조키 열 K1, K2, ... K16으로 변형하여 사용한다. DES 전체 진행 과정은 다음과 같다.
1. IP(Initial Permutation) 치환
2. 좌우 분리
3. 16라운드 진행(Feistel Function)
4. IP 역치환
이 중에서 3단계가 가장 복잡하며, 실질적인 DES 알고리즘의 핵심이다.
좀 더 자세히 설명하면, IP 치환 과정은 주어진 메세지를 64비트로 블럭화하고, 초기 치환 64비트 테이블을 이용하여 블럭화된 메시지의 비트를 바꾼다. IP 테이블은 다음과 같다.
58 50 42 34 26 18 10 02
60 52 44 36 28 20 12 04
62 65 46 48 30 22 14 06
64 56 48 40 32 24 16 08
57 49 41 33 25 17 09 01
59 51 43 35 27 19 11 03
61 53 45 37 29 21 13 05
53 55 47 39 31 23 15 07
이 테이블이 의미하는 것은, 1번째 비트는 58번째 비트와 자리바꿈을 하라는 것이다. 2번째 비트는 50번째 비트와 자리바꿈해야하며, 3번째 비트는 34번째 비트와 자리바꿈을 해야 한다. 이렇게 초기치환을 거친 IP(m)은 각각 32비트씩 L0, R0로 나누어 1라운드 암호화 과정에 들어간다. 이것이 2단계이다.
그리고, 실질적인 암호화 과정을 수행하는 3단계에서, L1은 R0을 사용한다. 그 다음으로 오른쪽 32비트 R1은, R0를 f 연산 과정을 거쳐서 처리한 후 그 값과 L0를 XOR하여 얻는다. 여기서 f 연산들이 Feistel Function이며, 한 라운드를 넘기는 과정마다 보조키 K1, K2, .. K16이 차례로 쓰여진다. 모두 16라운드를 진행한다.
마지막으로, 16라운드를 모두 진행하여 L16과 R16을 얻었다면 좌우를 다시 다시 바꾼 64비트 블럭 R16, L16에 초기 치환 IP의 역치환인 inverse IP를 적용한다. 이렇게 되면 우리가 원하고자 했던 최종적인 암호문을 얻게된다. inverse IP 테이블은 다음과 같다.
40 08 48 16 56 24 64 32
39 07 47 15 55 23 63 31
38 06 46 14 54 22 62 30
37 05 45 13 53 21 61 29
35 04 44 12 52 20 60 28
35 03 43 11 51 19 59 27
34 02 42 10 50 18 58 26
33 01 41 09 49 17 57 25
Reference
최병문, 이영환(2007), 암호의 세계, 경문사