DES(데이터 암호화 표준, Data Encryption Standard)는 대표적인 대칭키 암호화 알고리즘 중 하나입니다. IBM에서 개발하였으며 1977년 미국 국가표준(FIPS 46-2)으로 채택되었습니다.
DES의 주요 특징
- 대칭키 알고리즘
- DES는 암호화와 복호화에 동일한 키를 사용합니다.
- 블록 암호
- DES는 메시지를 블록 단위로 처리합니다. 기본적으로 64비트 블록 단위로 암호화합니다.
- 키의 길이
- DES의 키는 56비트입니다. 그런데 8비트마다 하나씩 검사 비트(패리티 비트)가 있습니다.
- 56-bit에서 기준으로 앞의 7-bit에서 1의 개수가 짝수인지 홀수인지에 따라 0 또는 1로 패리티 비트를 붙여 8-bit로 만들어 줍니다. 이제 나머지 49-bit에서 앞의 과정을 반복하여 줍니다. 56-bit를 7-bit 씩 쪼개서 그 뒤에 1-bit씩 붙여주었으니 최종적으로 64-bit가 됩니다.
- 따라서 패리티비트까지 합치게 되면 64-bit의 키를 사용합니다. 하지만 보안 강도 측면에서는 56-bit라고 보는 게 맞습니다.
- 라운드 구조
- DES는 16개의 라운드로 이루어져 있습니다.
- product cipher
- round 함수 하나를 계속 연이어서 반복시켜 마치 합성함수처럼 보입니다.
- Feistel cipher
- 암호학적 구조인데 이는 암복호화 과정이 같아 편리하다는 장점이 있습니다. 아래 그림에서 F 함수가 있는데 F의 역함수를 따로 만들 필요가 없습니다. 이유는 F는 항등함수이기 때문입니다.
Feistel 구조
- 암호학적 구조인데 이는 암복호화 과정이 같아 편리하다는 장점이 있습니다. 아래 그림에서 F 함수가 있는데 F의 역함수를 따로 만들 필요가 없습니다. 이유는 F는 항등함수이기 때문입니다.
사실 DES에 대하여 수학적으로나 구조적으로 다루려면 더 깊이 들어가야 합니다. 하지만 정보보안기사 시험 등에서도 굳이 DES에 관하여 깊게 물어보는 경우는 없고 오히려 암호에 대한 흥미만 떨어집니다. 지금은 그냥 이런 게 있었구나 하고 넘어가시면 됩니다.
질문 및 "아 좀 더 어려운 설명이 필요한데?" 싶으시면 댓글 남겨주세요.
구현은 라이브러리를 가져다 사용하겠습니다. 공부 목적 외에 여러분이 직접 DES를 구현할 일은 아마 없으리라 생각하니 라이브러리 활용법도 잘 익혀두시길 바랍니다. AES라는 암호가 있는데 이 친구는 중요하니 DES보다 좀 더 자세히 하겠습니다.
DES 구현
Python with pycryptodome
$ pip install pycryptodome
pycryptodome 라이브러리를 활용한 Python code
from Crypto.Cipher import DES
from Crypto.Random import get_random_bytes
def pad(text):
# 입력된 텍스트를 DES 블록 크기의 배수로 패딩합니다.
while len(text) % 8 != 0:
text += b' '
return text
def des_encrypt(key, plaintext):
# 키를 생성하고 DES 객체를 초기화합니다.
cipher = DES.new(key, DES.MODE_ECB)
# 입력 텍스트를 패딩합니다.
padded_text = pad(plaintext)
# 암호화를 수행합니다.
ciphertext = cipher.encrypt(padded_text)
return ciphertext
def des_decrypt(key, ciphertext):
# 키를 생성하고 DES 객체를 초기화합니다.
cipher = DES.new(key, DES.MODE_ECB)
# 복호화를 수행합니다.
decrypted_text = cipher.decrypt(ciphertext)
return decrypted_text.rstrip(b' ')
# 8바이트(64비트) 키를 생성합니다.
key = get_random_bytes(8)
# 암호화할 텍스트를 설정합니다.
plaintext = b'Cryptosec's DES!'
# DES로 암호화합니다.
ciphertext = des_encrypt(key, plaintext)
# 복호화합니다.
decrypted_text = des_decrypt(key, ciphertext)
print(f'평문: {plaintext.decode()}')
print(f'암호문: {ciphertext}')
print(f'복호화된 텍스트: {decrypted_text.decode()}')
C with OpenSSL
OpenSSL 설치는 다음 글들을 참고해 주세요.
[OpenSSL] OpenSSL 설치 방법 리눅스(Linux)
Ubuntu & Kali Linux 운영체제에 OpenSSL 설치 방법 패키지로 설치하는 방법 $ sudo apt update && sudo apt upgrade $ sudo apt install libssl-dev openssl openssl 공식 사이트에서 설치 공식 다운로드 사이트 - https://www.openssl
crypsec.tistory.com
[OpenSSL] OpenSSL 공식사이트에서 설치 in 윈도우(Windows 11)
설치를 위한 사전 준비 프로그램 만약 설치가 잘 안 되어 따라가기 어렵다면 으로 가주세요. Perl 먼저 perl 설치가 필요합니다. 저는 strawberry perl을 설치하겠습니다. http://strawberryperl.com/ 실행시 이
crypsec.tistory.com
C code
#include <stdio.h>
#include <string.h>
#include <openssl/des.h>
int main() {
DES_cblock key = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; // 8바이트 키
DES_key_schedule schedule;
// 암호화할 데이터
unsigned char input[16] = "crypsec's des";
// 암호화
DES_set_key_checked(&key, &schedule);
DES_ecb_encrypt((const_DES_cblock*)input, (DES_cblock*)input, &schedule, DES_ENCRYPT);
// 출력
printf("암호문: ");
for(int i = 0; i < 16; i++) {
printf("%02x", input[i]);
}
printf("\n");
// 복호화
DES_ecb_encrypt((const_DES_cblock*)input, (DES_cblock*)input, &schedule, DES_DECRYPT);
printf("복호문: %s\n", input);
return 0;
}
빌드는 Linux라면 아래와 같이 해주시면 됩니다. 만드신 파일 이름은 <> 대신 넣어주셔야 합니다.
$ gcc <DES C언어 파일 이름> -o des -lcrypto
$ ./des
Windows라면 보통 IDE로 Visual Studio를 쓰실 테니 기본속성의 링커라는 부분에 openssl 관련. lib 라이브러리를 링킹 해주면 됩니다.
Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정
Visual Studio IDE를 사용하여 C++ 컴파일러 및 링커 옵션과 기타 빌드 설정을 변경합니다.
learn.microsoft.com
DES의 보안 이슈
DES는 오랫동안 사용되어 왔지만, 향상된 컴퓨팅 능력으로 인해 안전성에 대한 의문이 제기되기 시작했습니다. 특히, 56비트의 키 길이는 현재의 컴퓨팅 환경에서 뚫리기 쉬운 수준입니다.
DES Challenge라는 게 있었습니다. 결론부터 말하자면 1999년에 전용 칩과 10만 대의 PC를 동원해 22시간 만에 DES 해독을 성공했습니다.
그래서 현재에는 보다 강력한 암호화 알고리즘들이 사용되고 있습니다. 대표적으로 AES(고급 암호화 표준, Advanced Encryption Standard)이 있습니다. AES는 DES를 대체하기 위해 개발되었으며, 더 긴 키 길이와 더 강력한 보안을 제공합니다.
'암호학 강의' 카테고리의 다른 글
[암호학] 국산 블록 암호 LEA (1) | 2023.11.02 |
---|---|
[암호학] AES 블록암호 코드 with 설명 (1) | 2023.10.31 |
[암호학] 스트림 암호(Stream cipher)와 블록 암호(Block cipher) (1) | 2023.10.27 |
[암호학] 대칭키 암호와 비대칭키(공개키) 암호 (0) | 2023.10.25 |
[암호학] Kerckhoffs Principle(케르크호프스의 원칙)과 공격자 능력치 (1) | 2023.10.23 |