2013. 8. 6. 10:09

mcrypt pkcs5 패딩 적용 라이브러리

일반적으로 C, C++, .net등에서는 PKCS5패딩을 기본으로 사용하지만 PHP는 Zeros패딩만 사용하기때문에

암/복호화가 안된다. PHP쪽에서 PKCS5패딩을 사용하도록 적용한 라이브러리

/**
 * mcrypt 관련 함수
 */

define('ENC_KEY', hex2bin(md5('키값')));
define('ENC_IV', hex2bin(md5('IV값')));

/**
 * PKCS5 패딩추가
 * @param string $text
 * @param int $blocksize
 * @return string
 */
function pkcs5_pad ($text, $blocksize) { 
    $pad = $blocksize - (strlen($text) % $blocksize); 
    return $text . str_repeat(chr($pad), $pad); 
} 
/**
 * PKCS5 패딩제거
 * @param string $text
 * @return boolean|string
 */
function pkcs5_unpad($text) { 
    $pad = ord($text{strlen($text)-1}); 
    if ($pad > strlen($text)) return false; 
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; 
    return substr($text, 0, -1 * $pad); 
}
/**
 * hex2bin
 * @param string $hexdata
 */
function hex2bin($hexdata) {
    $bindata="";
    for ($i=0,$cnt=strlen($hexdata);$i<$cnt;$i+=2) {
        $bindata .= chr(hexdec(substr($hexdata,$i,2)));
    }
    return $bindata;
}
/**
 * 키를 통해 암호화
 * @param string $str
 */
function m_encrypt($str) {
    $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, 'cbc'); 
    $input = pkcs5_pad($str, $size); 
    
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, ENC_KEY, $input, MCRYPT_MODE_CBC, ENC_IV));
}
/**
 * 키를 통해 복호화
 * @param string $str
 */
function m_decrypt($str) {
    return pkcs5_unpad(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, ENC_KEY, base64_decode($str), MCRYPT_MODE_CBC, ENC_IV));
}