2011-09-16 3 views
5

좋아, 내가 PHP mcrypt을 사용하여 내 자신의 암호화/암호 해독 방법을 만들려고했는데, 나는 그들에게 "쓰레기"라고 전화를 걸었다. 그들은 "Initialization Vectors"와 같은 것을 언급하고있었습니다. 기본적으로, 어떻게 이러한 암호화 방법을 더 만들 수 있습니다적절한 PHP mcrypt 암호화 방법?

function encrypt($key, $data){ 
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT); 
    return base64_encode($encrypted_data); 
} 

function decrypt($key, $encryptedData){ 
    $dec = base64_decode($encryptedData); 
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $dec, MCRYPT_DECRYPT); 
    return trim($decrypt); 
} 

내가이 최고의 작업 할 그들은 mcrypt에 올 때 나는 새로운 세계에 오리입니다 제외시켰다 수 있습니다, 어떤 제안을 환영합니다, 감사합니다!

답변

3

다음은 내가 사용하는 mcrypt 기능의 일부입니다. 그들은 PHP manual에 따라 사용해야하는 mcrypt_genericmdecrypt_generic을 사용합니다. 나도 몰라

function encrypt($key, $data){ 
    $b = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
    $enc = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, ''); 
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($enc), MCRYPT_DEV_URANDOM); 
    mcrypt_generic_init($enc, md5($key), $iv); 

    // PKCS7 Padding from: https://gist.github.com/1077723 
    $dataPad = $b-(strlen($data)%$b); 
    $data .= str_repeat(chr($dataPad), $dataPad); 

    $encrypted_data = mcrypt_generic($enc, $data); 

    mcrypt_generic_deinit($enc); 
    mcrypt_module_close($enc); 

    return array(
     'data' => base64_encode($encrypted_data), 
     'iv' => base64_encode($iv) 
    ); 
} 

function decrypt($key, $iv, $encryptedData){ 
    $iv = base64_decode($iv); 
    $enc = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, ''); 
    mcrypt_generic_init($enc, md5($key), $iv); 

    $encryptedData = base64_decode($encryptedData); 
    $data = mdecrypt_generic($enc, $encryptedData); 
    mcrypt_generic_deinit($enc); 
    mcrypt_module_close($enc); 

    // PKCS7 Padding from: https://gist.github.com/1077723 
    $dataPad = ord($data[strlen($data)-1]); 

    return substr($data, 0, -$dataPad); 
} 

훨씬에 대한 mcrypt 중 하나, 그래서 난 그냥 좀 함께 이러한 해킹. 나는 md5 키를 항상 32 문자 (최대 키 길이)로 설정하고 무작위로 "초기화 벡터"를 계산합니다.

PKCS7 Padding을 사용하면 공백으로 끝나는 문자열을 가질 수 있으므로 (trim이 제거하므로) 문자열이 특정 길이 일 때 암호화가 더 효율적입니다.

여기서는 AES 256 (MCRYPT_RIJNDAEL_256)을 사용하고 있지만 AES 192 (MCRYPT_RIJNDAEL_192)도 사용할 수 있습니다.

데모 : 당신은 당신의 암호화 모드에 적합한 크기를 사용하여, mcrypt_create_iv()와 정맥 주사를 만들 수 있습니다 http://ideone.com/WA5Tk

+0

. 나는 그들이 멋지다고 생각하고, 심지어 그들 자신을 사용할지도 모릅니다. 그러나 이것이 솔직히 말해서 조금 위에 있습니다. ... – Shackrock

+0

나는 주위를 검색하고 다른 (유사한) 기능을 찾은 후에이 글을 썼습니다. 그들은 강해 보입니다. 얼마나 강렬한 지, 솔직히 말해 보이지 않습니다. –

+0

그래서 데이터를 해독하기 위해 IV를 저장해야합니까? – xendi

2

.

$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_192, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM); 

그런 다음 선택적 5 번째 매개 변수로 mcrypt_cbc()으로 전달하십시오. 내가 원래 기능에 여기에서 한 유일한 변화는 $iv에 전달됩니다 :이 기능의 강도에 대한 의견을 들어 본 적이 있다면 난 그냥 궁금 해서요

function encrypt($key, $data, $iv){ 
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT, $iv); 
    return base64_encode($encrypted_data); 
} 

function decrypt($key, $encryptedData, $iv){ 
    $dec = base64_decode($encryptedData); 
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $dec, MCRYPT_DECRYPT, $iv); 
    return trim($decrypt); 
} 
+0

그는'MCRYPT_RIJNDAEL_192'를 사용하는 암호화에서,'mcrypt_get_iv_size'에서 이것을 사용하여 초기화 벡터가 올바른 길이인지 확인하십시오. –

+1

@Rocket 수정. 복사/붙여 넣기 오류. –