본문 바로가기
IT ▶/Security

SEED 암호화 알고리즘 개념 설명 (CBC, ECB)

by 오프로 2019. 11. 13.

 

 

1. SEED 알고리즘 개발

 

 

SEED는 전자상거래, 금융, 무선통신 등에서 전송되는 중요 정보를 보호하기 위해

한국정보보호진흥원을 중심으로 국내 암호 전문가들이 참여하여 순수 국내기술로 개발한 블록암호 알고리즘

 

 

 

2. 블록암호 알고리즘

 

 

암호(Cryptography)란 메시지를 해독 불가능한 형태로 변환하거나

또는 암호화된 메시지를 해독 가능한 형태로 변환하는 기술을 말한다.

 

이때, 해독 가능한 형태의 메시지를 평문(Plaintext)이라고 하고,

해독 불가능한 형태의 메시지를 암호문 (Ciphertext)이라 하며,

 

평문을 암호문으로 변환하는 과정을 암호화(Encryption),

암호문을 평문으로 변환하는 과정을 복호화 (Decryption)라고 한다.

 

정보를 숨기고, 숨긴 정보를 볼 수 있기 위해서는 권한이 있는 사람만이 암호화 및 복호화를 할 수 있어야 한다.

 

 

이러한 비밀 정보를 우리는 비밀키(Secret Key)라고 하며,

암호화에 필요한 암호화키 (Encryption Key)와 복호화에 필요한 복호화키(Decryption Key)로 분류한다.

 

 

일반적으로 암호화 및 복호화 과정은 아래와 같다.

 

 

암호는 키의 특성에 따라, 암호화키와 복호화키가 같은 암호를 대칭키 암호(또는 비밀키 암호)라고 하며,

암호화키와 복호화키가 다른 암호를 비대칭키 암호(또는 공개키 암호)라고 한다.

 

또한, 대칭키 암호는 다시 암복호화를 처리하는 방식에 따라 메시지를 블록단위로 나누어 처리하는 블록암호와 메시지를 비트단위로 처리하는 스트림암호로 분류한다.

 

 

 

< 블록암호 암호화(ECB모드) 과정 >

 

 

SEED 128비트의 암복호화키를 이용하여

임의의 길이를 갖는 입력 메시지를 128비트의 블록단위로 처리하는 128비트 블록암호 알고리즘이다.

 

따라서 임의의 길이를 가지는 평문 메시지를 128비트씩 블록단위로 나누어 암호화하여 암호문을 생성한다.

 

 

 

3.1. 엔디안

 

 

엔디안이란, 컴퓨터 메모리에 바이트를 배열하는 순서를 말한다.

 

엔디안은 보통 큰 단위가 앞에 나오는 빅 엔디안(Big-endian)

작은 단위가 앞에 나오는 리틀 엔디안(Little-endian),

그리고 두 경우에 속하지 않거나 둘 모두를 지원하는 미들 엔디안(Middle-endian)으로 분류한다.

 

현재 많은 시스템에서 빅 엔디안과 리틀 엔디안이 많이 사용되고 있다.

 

일반적인 데스크톱에서는 x86 아키텍처를 많이 사용하며,

x86은 리를 엔디안의 구조를 사용하기 때문에, SEED 소스코드도 기본적으로 리틀 엔디안을 사용하여 설명한다.

 

 

 

3.2. 데이터 형식

 

 

일반적으로 암호 알고리즘은 비트단위 연산을 포함한 다양한 연산을 수행하여

평문 메시지를 무의미한 비트열인 암호문으로 변환한다.

 

이때 만들어진 암호문 비트열은 랜덤한 비트들로 구성되기 때문에

이를 문자열(string)의 형태로 저장하거나 처리할 경우에는 문제가 발생할 수 있다.

 

예를 들어, 다음의 C 소스코드를 보면, ch배열에 저장되는 값은 0x41, 0x42, 0x00, 0x44, 0x45 이지만,

이를 스트링으로 출력할 경우, ch[3] = 0x00 = NULL 값에 의해 0x41, 0x42에 해당되는 “AB"만 출력이 된다.

 

따라서 암호화된 메시지는 항상 문자열이 아닌 HEX 형태로 처리해 주어야 한다.

 

 

 

3.3. 운영모드

 

 

운영모드란, 여러 개의 입력 블록들을 블록암호에 적용하여 암복호화하는 방법에 대한 정의이다.

이러한 운영모드는 블록암호와는 독립적으로 정의된다.

 

대표적으로 가장 널리 이용되는 블록암호 운영모드에는

ECB(Electronic Code Book) 모드,

CBC(Cipher Block Chaining) 모드,

CFB(Ciphertext FeedBack) 모드,

OFB(Output FeedBack) 모드,

CTR(CounTeR) 모드가 있습니다.

 

 

 

3.3.1 ECB 운영모드

 

 

ECB(Electronic Codebook) 모드는 평문 블록을 암호문 블록으로 독립적으로 암호화하는 운영 모드이다.

 

 

ECB 모드의 암호화 과정은 평문 블록(Pi)을 입력 블록(Ii)으로 설정하고,

이를 암호화한 출력 블록(Oi)을 암호문 블록(Ci)으로 설정한다.

 

 

 

 

ECB 모드의 복호화 과정은 평문 블록(Ci)을 입력 블록(Ii)으로 설정하고,

이를 암호화한 출력 블록(Oi)을 암호문 블록(Pi)으로 설정한다.

 

 

 

 

 

3.3.2 CBC 운영모드

 

 

CBC(Cipher Block Chaining) 모드는 동일한 평문 블록과 암호문 블록 쌍이 발생하지 않도록

전 단계의 암복호화 결과가 현 단계에 영향을 주는 운영모드이다.

 

 

CBC 모드의 암호화 과정은

 

현 단계에서 평문 블록(Pi)과 전 단계의 암호문 블록(Ci-1)

배타적 논리합 연산한 결과를 현 단계의 입력 블록(Ii)으로 설정하고,

이를 암호화한 출력 블록(Oi)을 현 단계의 암호문 블록(Ci)으로 설정한다.

 

 

 

 

CBC 모드의 복호화 과정은

 

현 단계의 암호문 블록(Ci)을 입력 블록(Ii)으로 설정하고,

이를 복호화한 출력 블록(Oi)을 전 단계의 입력 블록(Ii-1)인 암호문 블록(Ci-1)

배타적 논리합 연산한 결과를 현 단계의 평문 블록(Pi)으로 한다.

 

 

 

3.4. 패딩방법

 

 

메시지를 SEED에 입력하기 위해 여러 개의 128비트 블록으로 나눌 때,

마지막 블록을 정확히 128비트 블록의 크기로 맞추는 것은 쉽지 않을 것이다.

 

예를 들어, 300비트의 메시지를 128비트의 블록으로 나눌 경우,

300 = 128 + 128 + 44 로 나뉘어 세 개의 블록을 구성하게 되는 데,

이때 마지막 블록이 44비트로 128비트를 만족하지 못한다.

 

이 경우 나머지 부족한 84비트를 채워주어야 SEED의 입력값으로 사용할 수 있다.

이렇게 부족한 부분을 채우는 방식을 패딩이라고 한다.

 

ECB, CBC 모드는 평문 블록을 암호화의 입력으로 사용하기 때문에,

평문 데이터의 크기가 128비트의 양의 정수배가 되어야 하기 때문에,

반드시 패딩 방법이 적용되어야만 한다.

 

 

 

3.4.1 패딩 방법

 

 

평문 데이터의 크기가 128비트 양의 정수배가 아닐 때,

마지막 평문 블록이 128비트가 되도록 바이트 ‘00’을 덧붙인다.

 

예시)

 

입력 블록( 48비트) : 4F 52 49 54 48 4D

패딩 블록(128비트) : 4F 52 49 54 48 4D 00 00 00 00 00 00 00 00 00 00

입력 블록(128비트) : 53 45 45 44 41 4C 47 A8 3E D1 80 F1 29 DC 4A 78

패딩 블록(128비트) : 53 45 45 44 41 4C 47 A8 3E D1 80 F1 29 DC 4A 78

 

 

 

3.5. 활용 방법

 

 

SEED 알고리즘은 16Byte의 비밀키, 16Byte의 평문을 입력으로 16Byte의 암호문을 출력하는 블록암호 알고리즘이다.

소스 코드에는 2가지 방법의 함수가 포함되어 있다.

 

데이터가 적을 경우이며 Encrypt Decrypt 함수만 호출하면 암호화와 복호화가 된다.

 

대용량의 데이터를 암호화/복호화 할 때는

Initialize, Process, Close 3가지 단계로 데이터 크기가 버퍼보다 클 경우 사용되는 방법이다.

 

 

 

SEED-CBC

☞ 함수 설명

 

 

int SEED_CBC_Encrypt( IN BYTE *pbszUserKey, IN BYTE *pbszIV, IN BYTE

*pbszPlainText, IN int nPlainTextLen, OUT BYTE *pbszCipherText )

 

SEED-CBC 알고리즘 암호화 함수(처리하고자 하는 데이터가 적을 경우에 사용)

 

매개변수 :

pbszUserKey 사용자가 지정하는 입력 키(16 BYTE)

pszbIV 사용자가 지정하는 초기화 벡터(16 BYTE)

pbszPlainText 사용자 입력 평문

nPlainTextLen 평문 길이(BYTE 단위의 평문길이)

pbszCipherText 암호문 출력 버퍼

 

반환값 :

암호문의 Byte 길이

 

참 고 :

패딩 로직때문에 16바이트 블럭으로 처리함으로 pbszCipherText는 평문보다 16바이트 커야 한다.

(평문이 16바이트 블럭 시 패딩 데이타가 16바이트가 들어간다.)

 

 

 

int SEED_CBC_Decrypt( IN BYTE *pbszUserKey, IN BYTE *pbszIV, IN BYTE

*pbszCipherText, IN int nCipherTextLen, OUT BYTE *pbszPlainText )

 

SEED-CBC 알고리즘 복호화 함수(처리하고자 하는 데이터가 적을 경우에 사용)

 

매개변수 :

pbszUserKey 사용자가 지정하는 입력 키(16 BYTE)

pszbIV 사용자가 지정하는 초기화 벡터(16 BYTE)

pbszCipherText 암호문

nCipherTextLen 암호문 길이(BYTE 단위의 평문길이)

pbszPlainText 평문 출력 버퍼

 

반환값 :

평문의 Byte 길이

 

 

728x90
300x250