2008년 07월 29일
AES 소스
16바이트 특정 키와 블록 할 바이트 영역(16,24,32) 를 설정한뒤 암호화 하는 방식입니다.
이 알고리즘은 오픈 소스이므로 누구나 갖다 쓸 수 있습니다.
코드 사용법은 이러합니다
#define Key "1234567890123456"
이렇게 16바이트 키를 설정한뒤(테스트 해본 결과 굳이 16바이트를 맞춰 주지 않아도 됩니다)
////////////////////////////슈도 코드///////////////////////////////////////////////////////
char *szHeader = new char[1024000]; //1mb정도 설정
//visual c++에서는 char buf[1024000];이런식으로 크게 버퍼를 할당하면 런타임시 에러가 납니다.
//유닉스에서는 그렇지 않다고 하네요...그래서 위처럼 동적할당으로 잡아줘야 합니다 ㅠ_ㅠ
hFile_Header=CreateFile(m_szFilePath,GENERIC_READ,0,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile_Header != INVALID_HANDLE_VALUE){
ReadFile(hFile_Header,szHeader,HEADER_SIZE_OFFSET,&dwRead_Header,NULL);
CloseHandle(hFile_Header);
}
CRijndael oRijndael; //AES 클래스 객체 할당
oRijndael.MakeKey(Key,CRijndael::sm_chain0,16,16);
oRijndael.ResetChain();
memcpy(szHeader_In,szHeader,HEADER_SIZE_OFFSET);
oRijndael.Decrypt(szHeader_In,szHeader_Out,Size,CRijndael::CBC);
여기서는 szHeader 버퍼에는 특정 파일을 읽었을때의 값입니다
Decrypt 할때 주의점은 세번째 아규먼트의 Size값이 MakeKey에서 할당한 4번째 인자 값과
바이트 수가 일치 하여야지 블록 암호화가 이루어 집니다.
가령 위에서는 16으로 설정되어 있으면 16배수로 블록사이즈를 잡아줘야 합니다.
또한 어떤것은 512바이트 마다 키값을 재할당하여 encrypt한 경우도 있으니 그 바이트 영역마다
키값을 설정하여 decrypt를 수행해야 합니다.
PS. AES 암호화 소스코드를 첨부 파일로 올려 놓습니다.(사실 제가 필요할때마다 갖다쓰기 위해서 ...-_-;)Rinjdael.zip
# by | 2008/07/29 16:51 | c++ | 트랙백










