본문 바로가기
IT ▶/Security

[암호화 개념 및 정리] Seed 암호화 개념 정리

by 오프로 2019. 8. 18.

 

 

 

 

 

1. SEED란?

 

 

전자상거래, 금융, 무선통신 등에서 전송되는 중요 정보를 보호하기 위해 순수 국내기술로 개발한

블록암호 알고리즘

 

 

-  해독 가능한 형태의 메시지 : 평문 (PlainText)

 

-  해독 불가능한 형태의 메시지 : 암호문 (CipherText)

 

-  암호화 : 평문 -> 암호문

 

-  복호화 : 암호문 -> 평문

 

 

 

일반적인 암호화 과정

 

 

2. 암호화 방식

 

 

1>   대칭키 암호화 (=비밀키 암호화)

 

è  암호화 키와 복호화 키가 같은 암호 방식을 대칭키 암호화 (비밀키 암호화) 방식

 

2>   비대칭키 암호화 (=공개키 암호화)

 

è  암호화 키와 복호화 키가 다른 암호 방식을 비대칭키  암호화 (공개키 암호화) 방식

 

 

 

3. 단위 별 암호화 방식

 

 

1>   블록 암호화(ECB모드) : 메시지를 블록(Block) 단위로 처리

 

 

è SEED 128비트의 암복호화 키를 이용하여 임의의 길이를 갖는 입력 메시지를

블록단위로 처리하는 128비트 블록암호 알고리즘이다.

 

 

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

 

 

2>   스트림 암호화 : 메시지를 비트(Bit) 단위로 처리

 

 

 

 

 

 

4. Seed 암호화 구현

 

 

1> 엔디안 (endianness)

 

- 컴퓨터 메모리의 바이트를 배열하는 순서

 

-  엔디안(큰 단위), 미들 엔디안(중간 단위), 리틀 엔디안(작은 단위)

 

- 기본적으로 리틀 엔디안 사용 (x86 포함)

 

- 자바 가상 머신은 기본적으로  엔디안 사용

(private static Boolean ENDIAN = BIG;)

 

 

 

앤디안 표현

 

 

2> 데이터 형식

 

- 다양한 연산을 통해 평문을 무의미한 비트열의 암호문으로 변환

 

- 암호화 메시지는 문자열(String) 형태가 아닌 이진(Binary) 형태로 처리 필요

 

 

 

3> 운영모드

 

여러 입력 블록들을 블록암호에 의해 암/복호화 하는 방법에 대한 정의

 

- 종류 : ECB, CBC, CTR, CFB, OFB 모드

 

 

 

 

5. SEED 관련 함수 (Java)

 

 

1> SeedEncrypt : SEED 암호화 수행

 

public static void SeedEncrypt(

byte pbData[ ],

int pdwRoundKey[ ],

byte outData[ ]

)

 

 

2> SeedDecrypt : SEED 복호화 수행

 

public static void SeedEncrypt(

byte pbData[ ],

int pdwRoundKey[ ],

byte outData[ ]

)

 

 

- 매개변수

 

pbData  : [in] 128비트의 암호화될 데이터를 입력

 

pdwRoundKey : [in] SEED의 각 라운드에 사용되는 라운드 키를 입력.

라운드 키는 SeedRoundKey 함수를 통해 사용자의 비밀키로부터 생성

 

outData : [out] 128비트의 암호화된 데이터를 출력

 

 

 

3> SeedRoundKey : 사용자의 비밀키로 SEED 라운드키 생성

 

public static void SeedRoundKey(

int pdwRoundKey[ ],

byte pbUserKey[ ]

)

 

 

- 매개변수

 

pdwRoundKey : [out] SEED의 각 라운드에 사용되는 라운드 키

 

pbUserKey : [in] 라운드 키를 생성하기 위해 사용되는 사용자의 비밀키

 

 

 

6. SEED 예제

 

 

int pdwRoundKey[] = new int[32];

byte pbUserKey[] = {(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,

(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,

(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,

(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00};

byte pbData[] = {(byte)0x00, (byte)0x01, (byte)0x02, (byte)0x03,

(byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07,

(byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B,

(byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F};

byte pbCipher[] = new byte[16];

byte pbPlain[] = new byte[16];

 

 

/* Derive roundkeys from user secret key */

SeedRoundKey(

pdwRoundKey,

pbUserKey

);

/* Encryption */

SeedEncrypt(

pbData,

pdwRoundKey,

pbCipher

);

/* Decryption */

SeedDecrypt(

pbCipher,

pdwRoundKey,

pbPlain

);

 

 

 

<참조> ‘SEED 소스코드 매뉴얼’ - 한국인터넷진흥원

 

 

 

728x90
300x250