ここに私が使用するmcrypt関数のスニペットがあります。彼らはPHP manualに従って使用されるmcrypt_generic
とmdecrypt_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
。私は彼らが良く見えると思うし、自分で使ってもいいかもしれないが...これは正直なところ私より少し上だ。... – Shackrock
私は自分自身を検索し、他の(類似の)機能を見つけた後で自分自身を書いた。彼らは正直であるように、彼らがどれほど強いのかわからない、強いように見えます。 –
データを復号するためにIVを保存する必要がありますか? – xendi