SEED는 정보통신 및 정보보호의 비밀성 서비스를 제공하기 위하여 한국정보보호 진흥원이 주관이 되어 1998년 개발, 공개하여 한국 표준 암호 방식으로 선정한 128비트 블록 암호 방식입니다. SEED는 암호 방식의 입력으로 평문 128비트와 암호화 키 128비트가 입력되어 128비트의 암호문을 출력합니다.

일단 SEED 관련 소스나 정보를 얻기 위해서 한국정보보호진흥원(http://www.kisa.or.kr)에 접속하여 소스를 신청(http://seed.kisa.or.kr/kor/seed/request01.jsp) 하실수 있습니다.

신청을 하게되면 신청이메일주소로 소스가 오게 됩니다.

압축을 풀면 소스코드 메뉴얼과 소스들이 나옵니다.
그대로 사용하시면 되는데

문제는 CBC 가 아닌가합니다. 인터넷에도 소스도 별로 없고 이론적 설명뿐이고 실제 개발과정에서 참고 할만할게 별로 없었습니다. 이것은 의외로 구글링을 통한 외국사이트도 마찮가지였습니다.

일단 CBC의 알고리즘과 기본이론은 지겹도록 봐서 알겁니다.
(솔찍히 저역시 처음엔 그것만 아무리봐도 이해가잘 안되는부분이 많았습니다. 소스코드는 어디에 있는지....ㅜㅜ)

CBC 모드 암호화 의사코드

어쩌라고......

일단 내용은 이렇습니다.(긴말 필요없다 . 당장 소스코드를 내놓아라~!)
먼저 비밀키를 가지고 라운드키를 생성합니다.
SeedRoundKey(dwRoundKey, (BYTE *)cKeyValue) 함수입니다.
P는 원문이고 C는 암호화된문입니다.(P1,P2 ....과 C1,C2 등은 각블럭들....)
일단 버퍼에서 SEEDBLOCKSIZE(16) 만큼을 가져와서(P1) 그전 암호화된 C블럭과
(^) 연산을 하게 됩니다. 처음엔 InitVecter 값이 들어가게 됩니다.
그래서 나온 I블록(inputBlock)을 SEED 로 암호화합니다.
SeedEncrypt(inputBlock, dwRoundKey) 함수입니다.

그래서 나온 O 블록을 C에 차곡차곡 쌓으면 됩니다.(C1,C2,C3.........)

CBC 모드 복호화 의사코드


이번엔 복호화 입니다.
일단 라운드키 생성을 먼저 하시고,
암호화된 C블럭(암호화된)을 복호화합니다.
SeedDecrypt(inputBlock, dwRoundKey) 함수입니다.
그렇게 해서 나온 O블럭을 그전 C블럭(처음엔 InitVecter)과 (^) 연산합니다.
그결과 값이바로 P블럭(원문)입니다.

이제 기다리시던 소스를 공개하겠습니다. 원래알고리즘과 다소 다른부분이 있습니다.
소스에는 pkcs5 이슈도 포함되어있지만 설명은 생략하겠습니다.




마지막으로 운영체제가 64bit일경우 KISA의 소스 그대로 사용하시면
라운드키가 매번 다르게 생성되는 것을 발견할수있습니다.
이유는
SEED_KISA.h 의 내용중
/******************************* Type Definitions *****************************/

// If your machine uses different data types, you must change them to proper ones.
#ifndef TYPE_DEFINITION
    #define TYPE_DEFINITION
    #if defined(__alpha)
        typedef unsigned int        DWORD;        // unsigned 4-byte data type
        typedef unsigned short      WORD;        // unsigned 2-byte data type
       
    #else
        typedef unsigned long int   DWORD;        // unsigned 4-byte data type
        typedef unsigned short int  WORD;        // unsigned 2-byte data type
    #endif
    typedef unsigned char           BYTE;        // unsigned 1-byte data type
#endif

구문이 있는데 64bit 에서는 자료형 크기가 달라 생기는 현상입니다.
운영체제나 상황에 따라 여러가지 해결방법이 있는데 저는
typedef int32_t        DWORD;        // unsigned 4-byte data type
typedef int16_t     WORD;        // unsigned 2-byte data type
이렇게 수정하여 해결하였습니다.
단...이것은 여러가지 환경에 따라 달라질수있기때문에 여러분이 직접 각 자료형을 대입해보고
선택해야됩니다.

Posted by 빨강토끼
,