블록암호 알고리즘 모듈(LEA) 적용 및 테스트

반응형

이번 포스팅에서는 Windows C/C++ 프로젝트에 블록암호 알고리즘(LEA) 모듈을 적용하기 위한 기초 내용 조사 및 실제 적용 테스트에 관한 내용을 다룹니다. 저는 클라이언트 프로그램에 서버 계정과 패스워드를 저장하여 자동 로그인 기능을 구현하기 위해 블록암호 알고리즘 모듈을 적용하려고 합니다.

 

1. 암호알고리즘 용어 정리

  • 평문(Plaintext, P) : 암호화되지 않은 평범한 데이터 또는 메시지
  • 암호문(Ciphertext, C) : 암호화된 형태의 데이터 또는 메시지
  • 암호화(Encryption, E) : 평문을 암호문으로 변환하는 과정
  • 복호화(Decryption, D) : 암호문을 본래의 평문으로 복원하는 과정

2. 각 기준별 암호알고리즘 분류

  • 공개키암호: RSAES(2048, 3072)
  • 키 설정: DH, ECDH
  • 전자서명: RSA-PSS, KCDSA, EC-KCDSA, ECDSA
  • 블록암호: SEED, LEA, HIGHT, ARIA
  • 운영모드: ECB, CBC, CFB, OFB, CTR, CCM, GCM
  • 해시함수: LSH, SHA-2, SHA-3
  • 메시지인증: GMAC, HMAC, CMAC
  • 난수발생기: HMAC_DRBG, CTR_DRBG, HASH_DRBG
  • 키 유도: KBKDF(HMAC, CMAC), PBKDF(HMAC)

3. 블록암호와 운영모드

블록암호에는 대칭키암호, 비밀키암호, 관용 암호 방식이 있으며 현재 널리 사용되는 블록 크기는 128비트 입니다.

암호 알고리즘의 비밀 정도는 키의 비밀성에 의존하므로 키 관리를 잘 해야 합니다.

고정된 크기의 블록 단위로 데이터를 암호화하므로 실제 암호화 할 데이터 크기가 작으면 임의의 패딩데이터를 삽입합니다.

암호화 키와 복호화 키가 같으며 비밀키를 사용하여 동일한 길이(블록단위)의 비트 문자열을 고정된 길이의 비트 문자열로 변환하는 암호입니다.

대표적인 블록암호는 DES, AES, ARIA, SEED, LEA, HIGHT 등이 존재합니다.

블록암호 표준화 연도 블록길이 키 길이
SEED 1999년(TTA)
2005년(ISO)
128 비트 128 비트
ARIA 2004년(KS) 128 비트 128, 192, 256 비트
HIGHT 2006년(TTA)
2010년(ISO)
64 비트 128 비트
LEA 2013년(TTA)
2019년(ISO)
128 비트 128, 192, 256 비트

 

블록암호 자체만으로는 정해진 입력 길이(LEA의 경우 128비트 = 16바이트)의 데이터에 대한 암호화 및 복호화만 가능합니다. 하지만 현실 세계의 데이터는 대부분 가변 길이이기 때문에 블록 암호만으로는 충분하지 않습니다. 이때 등장하는 것이 바로 블록암호 운영모드입니다. 운영모드는 블록암호를 반복적으로 적용하여 가변 길이 데이터를 안전하게 암호화하는 방법을 제공합니다. 운영모드는 여러 모드가 있으며 각기 다른 안정성과 특징을 가지고 있기 때문에 환경에 따라서 적절한 운영모드를 적용할 필요가 있습니다.

운영 모드 특징 장점 단점
ECB(Electronic CodeBook) 가장 간단한 모드.
각 블록을 독립적으로 암호화
구현이 간편 동일한 평문 블록은 동일한 암호문으로 변환되어 패턴 노출 가능성이 높음.
암호 분석에 취약
CBC(Cipher Block Chaining) 이전 암호문 블록을 다음 블록 암호화에 활용. 연속된 블록 간 상관관계 형성 ECB보다 강력한 암호화 제공
오류전파 가능성 감소
복잡도 상승
CFB(Cipher Feedback) 이전 암호문 블록을 XOR 연산에 활용하여 현재 블록 암호화 CBC와 유사한 강력한 암호화
초기값 공유 필애
복잡도 상승
OFB(Output Feedback) 암호화된 블록을 누적하여 다음 블록 암호화에 활용 암호화와 복호화 동작이 동일
초기값 공유 필요
복잡도 상승
CTR(Counter) 카운터 값을 암호화하여 암호 스트림 생성
평문과 XOR 연산 수행
초기값 공유만으로도 동기화
암호화와 복호화 속도가 빠름
복잡도 상승
CCM
(Counter with CBC-MAC)
CTR 모드의 장점에 MAC 인증 추가 암호화와 인증을 동시에 제공 복잡도 상승
GCM(Galois/Counter Mode) CTR 모드의 장점에 AAD(Additional Authentication Data) 인증 기능 추가 CCM보다 향상된 인증 성능 제공
NIST에서 GCM-AES 권장
복잡도 상승
CMAC(Cipher-based Message Authentication Code) CBC 모드 기반 MAC 코드 생성
메시지 인증에 특화
높은 인증 보안 제공  

 

저는 운영모드로 GCM을 선택하여 C/C++ 프로젝트에 적용해 보겠습니다. GCM 선택 이유는 다음과 같습니다.

  • GCM은 CTR 모드에 인증 기능을 추가하여 데이터 무결성과 진위 여부를 동시에 보장하며 비밀번호와 같은 민감 정보 보호에 적합
  • NIST 권장: 미국 국립 표준 기술원에서 GCM-AES를 표준 암호화 알고리즘으로 권장하고 있음
  • 효율성: GCM은 암호화와 인증을 동시에 수행하며, GCM-AES는 하드웨어 가속이 지원되어 빠른 처리속도 제공

4. 소프트웨어에 블록암호 적용시 유의사항

  • 무결성 검증이 필요하며 무결성 검증키는 암호모듈 내부에 분산시켜 저장해야 함. 키를 분산 저장하지 않을 경우 hex dump를 통해서 쉽게 노출됨. 특히 키값을 전역변수로 저장하면 바이너리에 키값이 연속적으로 노출되므로 지역변수로 여기저기 분산하여 저장해야 함
  • 암호모듈 구성요소에 대한 무결성 검증은 동작 전 자가테스트에서 수행하고 검증이 실패할 경우 오류 상태로 천이하고 어떠한 암호연산도 수행되지 않아야 하며 데이터 출력 인터페이스를 통한 모든 데이터의 출력도 금지해야 함

5. 암호알고리즘 소스코드 다운로드 및 프로젝트 적용

5.1. 소스코드 다운로드

국산 암호 알고리즘(SEED, HIGHT, ARIA, LEA, HAS-160, LSH, KCDSA/EC-KCDSA)은 KISA 암호이용활성화 페이지에서 설명서와 소스코드를 다운받을 수 있습니다.

https://seed.kisa.or.kr/

그 중 블록암호 LEA 소스코드를 다운받아서 MFC 프로젝트에 적용해 보겠습니다. C 프로젝트 뿐 아니라 Java, Python에서도 사용할 수 있는 소스코드입니다.

 

5.2. 라이브러리 파일 생성

Windows 용 MSVC 솔루션 프로젝트 파일이 있습니다. "vs"와 "vs2008"이 있는데 "vs"의 프로젝트 파일을 최신 버전으로 업그레이드하여 디버그 버전과 릴리즈 버전을 각각 빌드합니다. 릴리즈 버전 빌드시 에러가 발생하여 확인해본 결과 프로젝트 속성에 컴파일러가 MSVC 2013으로 고정되어 있었습니다. 이를 정정 후 빌드하면 "bin" 폴더와 "Debug" 폴더에 결과물이 생성됩니다.

libLEA 결과 파일 폴더

 

5.3. 프로젝트 설정

먼저 결과 파일을 프로젝트 경로에 복사합니다. 저는 "prebuilt\LEA" 경로에 복사하였습니다. 헤더파일은 "lea.h"와 "config.h"가 필요합니다.

프로젝트 경로에 dbg, rel 버전 각각 복사


프로젝트 속성에 디버그모드와 릴리즈모드를 구분하여 각 라이브러리 파일에 대해 링커 설정을 해줍니다.

  • C/C++ > General > Additional Include Directories: $(ProjectDir)\prebuilt\ (Debug/Release 공통)
  • Linker > General > Additional Library Directories: $(ProjectDir)\prebuilt\LEA (Debug/Release 공통)
  • Linker > Input > Additional Dependencies: libLEA_dbg.lib 추가 (Debug)
  • Linker > Input > Additional Dependencies: libLEA_rel.lib 추가 (Release)

5.4. 빌드 테스트

MFC 기준 APP::InitInstance() 에서 다음의 테스트 코드로 빌드 테스트를 하였습니다.

#include "prebuilt/LEA/lea.h"

/* LEA Test */
LEA_GCM_CTX ctx;
unsigned char mk[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
int mk_len = 16;

lea_gcm_init(&ctx, mk, mk_len);

 

이상으로 국산 경량 블록암호알고리즘 모듈인 LEA에 대해 알아보았습니다.

반응형