2009. 11. 27. 15:42

PHP로 mcrypt_ 함수를 다른 언어(C++,C#)와 사용할때 주의 사항


<?
$mcrypt_key = "abcdefghijklmnop";
$mcrypt_iv = "abcdefghijklmnop";

$str = "테스트요";
$encode = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $mcrypt_key, $str, MCRYPT_MODE_CBC, 
$mcrypt_iv); $enc_str = base64_encode($encode); echo $enc_str."<br />"; $decode = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $mcrypt_key, $enc_str, MCRYPT_MODE_CBC,
$mcrypt_iv); echo $dec; ?>
PHP의 mcrypt 함수로 아주 간단하게 AES(rijndael128) 암호화와 복호화를 한는 소스입니다.
128bit 암호화 알고리즘으로 암호화를 진행하고 있으며 각각 암호화하는 블럭의 크기는 128bit(16byte) 입니다.
블럭의 크기를 알고자 하신다면 mcrypt_get_block_size 함수로 구하실 수 있습니다.

블럭의 크기를 이야기 하는 이유는 문자열을 블럭단위로 암호화하기 때문에 마지막 블럭의 크기는 문자열의 길이가 딱 16byte로 나누어 떨어지지 않는한 16byte가 되지 못하고 빈 공간만큼 특정문자로 채우게 됩니다(pad)

VC++, C# 등에서 mcrypt를 사용할경우 남은 공간을 채울 문자(모드)를 여러가지중 하나로 정하도록 되어있는데
PHP의 경우에는 자동적으로 Zero패딩(Zeros) 으로 처리되게 됩니다.(남는 부분을 null = 0x00로 채움) 따라서 VC++ 등에서 pad를 그냥 default 설정으로 할경우 암,복호화가 되지 않을 수 있습니다.
그래서 다른 언어상에서 암호화 복호화를 위해서는 반드시 Zero패딩(Zeros)로 설정하셔야 합니다.
(PKCS5로 하면 안됨)