SHA-256 해시함수에대한 소스코드활용매뉴얼 2013.12. - 1 -
제 개정이력 순번 제 개정일 제 개정내역 담당자 해시함수에대한소스코드활용 매뉴얼 김기문 - 2 -
< 목차 > 1. 개요 4 2. 해시알고리즘 4 3. 응용프로그램 5 3.1 C/C++ 5 3.1.1 프로젝트생성및빌드 5 3.1.2 소스코드설명 9 3.2 Java 11 3.2.1 프로젝트생성및빌드 11 3.2.2 소스코드설명 14 4. 웹프로그램 16 4.3 ASP 16 4.3.1 소스코드추가 16 4.3.2 소스코드설명 16 4.4 JSP 18 4.4.1 소스코드추가 18 4.4.2 소스코드설명 18 4.5 PHP 20 4.5.1 소스코드추가 20 4.5.2 소스코드설명 20 [ 부록 ] 참조구현값 22-3 -
1. 개요 SHA(Secure Hash Algorithm) 는인터넷뱅킹, 전자서명, 메시지인증코드, 키교환알고리즘, 키 생성알고리즘등다양한분야의보안프로토콜에사용이된다. SHA 해시함수는단방향암호화로서암 호화된값을복호화하지못한다. 본매뉴얼은 SHA256 소스코드를보다쉽게활용할수있도록소스코드에대한설명과함께사용시 주의사항을다룬매뉴얼이다. 2. 해시알고리즘 해시함수는임의길이의정보를입력으로받아, 고정된길이의암호문 ( 해시값 ) 을출력하는암호기술로암호화된정보는복호화가불가능한특징을가지고있다. 따라서해시함수를이용하면아래와같이비밀번호를입력하여암호문 ( 해시값 ) 을생성해낼수는있지만, 암호문 ( 해시값 ) 을가지고원래의비밀번호를알아낼수는없다. 즉, 개인정보처리자도시스템에저장된암호문 ( 해시값 ) 을가지고원래의사용자비밀번호를알수없기때문에안전한비밀번호관리가가능해진다. < 해시함수의개념 > - 4 -
3. 응용프로그램 Windows, Linux 등다양한운영체제환경에서응용프로그램을개발과함께암호화를적용할수있도록해시함수에대한소스코드를개발하였습니다. 기본적으로많이사용하는 C/C++ 및 Java에대한소스코드설명이제공된다. 3.1. C/C++ 프로젝트생성및소스추가, 빌드등배포되는소스코드를이용하여해시를실행하는방법에대해서 는 Microsoft 社의 Visual studio 2008 을활용하여설명하도록한다. 3.1.1 프로젝트생성및빌드 Visual studio 를실행하여 Win32 콘솔응용프로그램 을선택한다. 이름에는프로젝트명을기입하 고위치에는생성시키고자하는곳의위치를지정하여준다. 콘솔응용프로그램 으로선택한후마침버튼을누르면콘솔형태의프로젝트가생성된다. 미리컴 파일된헤더를체크해주면 int _tmain( int argc, TCHAR *argv[] ) 을자동으로생성시켜준다. 빈프로젝트는말그대로아무것도없는것으로직접헤더파일과소스파일을추가하여전부작성하는 것이다. 여기서는미리컴파일된헤더를사용하여프로젝트를구성하도록한다. - 5 -
프로젝트생성이완료되면 콘솔응용프로그램 을작성할수있도록기본적인.h 와.cpp 의파일들을 생성된다. KISA_sample.cpp 의 _tmain 함수내에서암호화 / 복호화소스를활용하도록한다. 프로젝트생성이완료된후, KISA_sample 프로젝트하위로 SHA256 폴더를추가하도록한다. - 6 -
KISA 에서배포하는소스코드 KISA_SHA256.c 및 KISA_SHA256.h 파일을드래그앤드롭하여해 당폴더로복사한다. 프로젝트속성에서 C/C++ 의추가포함디렉터리항목에포함시킨헤더와소스파일이있는폴더의절대경로또는상대경로를포함시켜야한다. Visual studio에서제공되는매크로함수를이용한상대경로를추가하였다. 매크로관련해서는도움말을이용하고여기서는따로설명을하지않는다. 여러개의폴더또한포함시킬수있으며구분자는 ";" 로하여연속하여기입하면된다. - 7 -
또한, 고급에서컴파일러옵션을 "C 코드로컴파일 (/IC)" 로변경한다. C++ 로해도컴파일이가능하나 배포되는소스코드가 C 이므로 C 컴파일러로구성하도록한다. 마지막으로.c 파일의경우 미리컴파일된헤더사용안함 으로설정하면초기빌드할수있는환 경이다갖추어졌다. - 8 -
3.1.2 소스코드설명 함수설명 void SHA256_Encrypt( IN const BYTE *pszplaintext, IN UINT pszmessage, OUT BYTE *pszdigest ); SHA256_Init, SHA256_Process, SHA256_Close 함수를내부적으로모두호출하여간편한인터페이스를 제공하기위한함수 pszmessage uplaintextlen pszdigest 입력메시지의포인터변수 입력메시지의바이트길이 SHA-256 해시값을저장할포인터변수 참고 : 1. IN 사용자가입력해야할매개변수를의미한다. 2. OUT 함수호출후값이채워지는매개변수를의미한다. void SHA256_Init( OUT SHA256_INFO *Info ); 연쇄변수와길이변수를초기화하는함수 Info SHA256_Process 호출시사용되는구조체 참고 : 1. IN 사용자가입력해야할매개변수를의미한다. 2. OUT 함수호출후값이채워지는매개변수를의미한다. - 9 -
void SHA256_Process( OUT SHA256_INFO *Info, IN const BYTE *pszmessage, IN UINT udatalen ); 임의의길이를가지는입력메시지를 512 비트블록단위로나누어압축함수를호출하는함수 Info pszmessage udatalen SHA-256 구조체의포인터변수 입력메시지의포인터변수 입력메시지의바이트길이 참고 : 1. IN 사용자가입력해야할매개변수를의미한다. 2. OUT 함수호출후값이채워지는매개변수를의미한다. void SHA256_Close( OUT SHA256_INFO *Info, OUT BYTE *pszdigest ); 메시지덧붙이기와길이덧붙이기를수행한후마지막메시지블록을가지고압축함수를호출하는함수 Info pszdigest SHA-256 구조체의포인터변수 SHA-256 해시값을저장할포인터변수 참고 : 1. IN 사용자가입력해야할매개변수를의미한다. 2. OUT 함수호출후값이채워지는매개변수를의미한다. 테스트화면 - 10 -
3.2. Java 다음은 Java 형태의프로그램을하나생성하여헤더및소스와파일추가하는방법과빌드하는방법 등을설명한다. 3.2.1 프로젝트생성및빌드 Eclipse 를실행하여하기이미지처럼 Java 프로젝트를선택한다. Next 를클릭하여 Project name 에는프로젝트명을기입한다. "Use default JRE" 를선택후 Finish 버튼을눌러프로젝트생성을완료한다. - 11 -
소스가있는폴더로이동하여프로젝트에추가할파일을드레그 & 드롭으로프로젝트로이동시킨다. 이 때 Copy files and folders 를선택하여복사하여준다. 테스트클래스를생성하여배포중인소스를사용할수있도록구성한다. 먼저, src 폴더를마우스로 우클릭하여 New -> Class 를선택한다. - 12 -
다음으로는 Package 와 Name 을입력후 Finish 버튼을클릭하여테스트클래스를생성한다. 생성된빈클래스안에아래와같이메인함수를추가후작업을하면된다. public static void main(string[] args) throws Exception { } - 13 -
3.2.2 소스코드설명 함수설명 public static void SHA256_Encrypt( byte[] pszmessage, int uplaintextlen, byte[] pszdigest ) SHA256_Init, SHA256_Process, SHA256_Close 함수를내부적으로모두호출하여간편한인터페이스를 제공하기위한함수 pszmessage uplaintextlen pszdigest 입력메시지의포인터변수 입력메시지의바이트길이 SHA-256 해시값을저장할포인터변수 public static void SHA256_Init( SHA256_INFO Info ) 연쇄변수와길이변수를초기화하는함수 Info SHA256_Process 호출시사용되는구조체 public static void SHA256_Process( SHA256_INFO Info, byte[] pszmessage, int udatalen ) 임의의길이를가지는입력메시지를 512 비트블록단위로나누어압축함수를호출하는함수 Info pszmessage udatalen SHA-256 구조체의포인터변수 입력메시지의포인터변수 입력메시지의바이트길이 public static void SHA256_Close( SHA256_INFO Info, byte[] pszdigest ) 메시지덧붙이기와길이덧붙이기를수행한후마지막메시지블록을가지고압축함수를호출하는함수 Info pszdigest SHA-256 구조체의포인터변수 SHA-256 해시값을저장할포인터변수 - 14 -
테스트화면 - 15 -
4. 웹프로그램 Data Base, Homepage 등다양한 Web Service 환경에서전송 저장되는구간의암호화를적용할수있도록국산암호소스코드를개발하였습니다. 기본적으로많이사용하는 ASP, JSP, PHP를기반으로소스코드등활용방법에대하여설명한다. 4.1. ASP 소스활용등배포되는소스코드를이용하여해시함수를실행하는방법에대해서는간단한에디터상 태에서설명하도록한다. 단, Windows Server 및 IIS 설정에대한설명은생략하기로한다. 4.1.1 소스코드추가 해시함수에대한소소코드가작성된파일을사용하고자하는파일에포함시킨다. 4.1.2 소스코드설명 함수설명 Public Function SHA256_Encrypt(sMessage) SHA256_Init, SHA256_Process, SHA256_Close 함수를내부적으로모두호출하여간편한인터페이스를 제공하기위한함수 smessage 입력메시지변수 - 16 -
Public Function SHA256_Init() 연쇄변수와길이변수를초기화하는함수 Private Function SHA256_Process(sMessage) 임의의길이를가지는입력메시지를 512 비트블록단위로나누어압축함수를호출하는함수 smessage 입력메시지 Public Function SHA256_Close(HASH, M) 메시지덧붙이기와길이덧붙이기를수행한후마지막메시지블록을가지고압축함수를호출하는함수 HASH M SHA256_Init 호출하여초기화된변수 SHA256_Process 로생성된변수 테스트페이지 - 17 -
4.2. JSP 소스활용등배포되는소스코드를이용하여해시함수를실행하는방법에대해서는간단한에디터상 태에서설명하도록한다. 단, 운영체제환경및 Tomcat 설정에대한설명은생략하기로한다. 4.2.1 소스코드추가 해시함수에대한소소코드가작성된파일을사용하고자하는파일에포함시킨다. 4.2.2 소스코드설명 함수설명 public static void SHA256_Encrypt( byte[] pszmessage, int uplaintextlen, byte[] pszdigest ) SHA256_Init, SHA256_Process, SHA256_Close 함수를내부적으로모두호출하여간편한인터페이스를 제공하기위한함수 pszmessage uplaintextlen pszdigest 입력메시지의포인터변수 입력메시지의바이트길이 SHA-256 해시값을저장할포인터변수 - 18 -
public static void SHA256_Init( SHA256_INFO Info ) 연쇄변수와길이변수를초기화하는함수 Info SHA256_Process 호출시사용되는구조체 public static void SHA256_Process( SHA256_INFO Info, byte[] pszmessage, int udatalen ) 임의의길이를가지는입력메시지를 512 비트블록단위로나누어압축함수를호출하는함수 Info pszmessage udatalen SHA-256 구조체의포인터변수 입력메시지의포인터변수 입력메시지의바이트길이 public static void SHA256_Close( SHA256_INFO Info, byte[] pszdigest ) 메시지덧붙이기와길이덧붙이기를수행한후마지막메시지블록을가지고압축함수를호출하는함수 Info pszdigest SHA-256 구조체의포인터변수 SHA-256 해시값을저장할포인터변수 테스트페이지 - 19 -
4.3. PHP 소스활용등배포되는소스코드를이용하여해시함수를실행하는방법에대해서는간단한에디터상 태에서설명하도록한다. 단, Apache 서버설정에대한설명은생략하기로한다. 4.3.1 소스코드추가 해시함수에대한소소코드가작성된파일을사용하고자하는파일에포함시킨다. 4.3.2 소스코드설명 o SHA256 static function SHA256_Encrypt( &$pszmessage, $uplaintextlen, &$pszdigest ) SHA256_Init, SHA256_Process, SHA256_Close 함수를내부적으로모두호출하여간편한인터페이스를 제공하기위한함수 $pszmessage $uplaintextlen $pszdigest 입력메시지의포인터변수 입력메시지의바이트길이 SHA-256 해시값을저장할포인터변수 - 20 -
static function SHA256_Init( &$Info ) 연쇄변수와길이변수를초기화하는함수 $Info SHA256_Process 호출시사용되는구조체 static function SHA256_Process(&$Info, &$pszmessage, $udatalen) 임의의길이를가지는입력메시지를 512 비트블록단위로나누어압축함수를호출하는함수 $Info $pszmessage $udatalen SHA-256 구조체의포인터변수 입력메시지의포인터변수 입력메시지의바이트길이 static function SHA256_Close( &$Info, &$pszdigest ) 메시지덧붙이기와길이덧붙이기를수행한후마지막메시지블록을가지고압축함수를호출하는함수 $Info $pszdigest SHA-256 구조체의포인터변수 SHA-256 해시값을저장할포인터변수 테스트페이지 - 21 -
[ 부록 ] 참조구현값 본 SHA-256 소스코드매뉴얼에서는평문메시지 2 가지에대하여아래와같이참조구현값 (Test Vectors) 이제공된다. [ 데이타 1] Input Message Initial hash value Digest H[0] H[1] H[2] H[3] H[4] H[5] H[6] H[7] "abc" 6a09e667 bb67ae85 3c6ef372 a54ff53a 510e527f 9b05688c 1f83d9ab 5be0cd19 BA7816BF 8F01CFEA 414140DE 5DAE2223 B00361A3 96177A9C B410FF61 F20015AD [ 데이타 2] Input Message Initial hash value Digest H[0] H[1] H[2] H[3] H[4] H[5] H[6] H[7] "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" 6a09e667 bb67ae85 3c6ef372 a54ff53a 510e527f 9b05688c 1f83d9ab 5be0cd19 248D6A61 D20638B8 E5C02693 0C3E6039 A33CE459 64FF2167 F6ECEDD4 19DB06C1-22 -