2011-09-16 20 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)も機能します。

デモ:http://ideone.com/WA5Tk

+0

。私は彼らが良く見えると思うし、自分で使ってもいいかもしれないが...これは正直なところ私より少し上だ。... – Shackrock

+0

私は自分自身を検索し、他の(類似の)機能を見つけた後で自分自身を書いた。彼らは正直であるように、彼らがどれほど強いのかわからない、強いように見えます。 –

+0

データを復号するためにIVを保存する必要がありますか? – xendi

2

あなたが暗号化モードに適したサイズを使用して、mcrypt_create_iv()を静脈を作成することができます。

$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が修正されました。コピー/貼り付けエラー。 –

関連する問題