[英]php decrypt string with MCRYPT_RIJNDAEL_256
<?php
function encrypt ($key,$iv,$str)
{
$block=mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$padding=$block-(strlen($str) % $block);
$str.=str_repeat(chr($padding), $padding);
$encryptxt=mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$key,$str,MCRYPT_MODE_CBC,$iv);
$encryptxt64=base64_encode($encryptxt);
return $encryptxt64;
}
function decrypt ($key,$iv,$str)
{
$block=mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$padding=$block-(strlen($str) % $block);
$str.=str_repeat(chr($padding), $padding);
$decryptxt=mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$key,$str,MCRYPT_MODE_CBC,$iv);
$decryptxt64=base64_decode($decryptxt);
return $decryptxt64;
}
echo encrypt("1234567890123456","12345678901234561234567890123456","test")."\n<br/>";
echo decrypt("1234567890123456","12345678901234561234567890123456","xHqKvRQ6FXehOGGMrKoek04146M2l9bv1ScP6C1qCyg=")."\n<br/>";
?>
我发现这种方式可以加密字符串,效果很好,但是当我尝试解密字符串时,以上代码无法正常工作。 解密输出喜欢
S '= ɚ?
有人知道如何修复解密部分吗?谢谢!
正如我在评论中所述,这就是你所拥有的
//encrypt
$encryptxt=mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$key,$str,MCRYPT_MODE_CBC,$iv);
$encryptxt64=base64_encode($encryptxt);
//decrypt
$decryptxt=mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$key,$str,MCRYPT_MODE_CBC,$iv);
$decryptxt64=base64_decode($decryptxt);
应该是FILO(后进先出)
这样一来,您将解密crypto的输出而不是 base64编码的输出,
像这样:
$encryptxt=mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$key,$str,MCRYPT_MODE_CBC,$iv);
$encryptxt64=base64_encode($encryptxt);
//decrypt
$decryptxt64=base64_decode($str);
$decryptxt=mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$key,$decryptxt64,MCRYPT_MODE_CBC,$iv);
请注意,MCRYPT_RIJNDAEL_256不是AES 256,因为您需要带有32字节密钥的MCRYPT_RIJNDAEL_128,因此在某些方面128更好,(128是较小的块密码)
我建议做的另一件事是在加密之前对输入字符串进行md5哈希处理,然后将其添加到输入字符串中。 这样一来,当您解密它时,您可以减去前32个字符,然后使用它来检查输入。 基本上,您需要知道输入字符串才能查看它是否已解密。 但是,通过对它进行散列然后进行类似的比较,您不再需要知道它即可检查它是否有效。
所以大家在一起(还没有测试过,但应该可以让您接近)
function encrypt ($key,$iv,$str)
{
$block=mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$padding=$block-(strlen($str) % $block);
$str.=str_repeat(chr($padding), $padding);
///prepend a md5 hash of the plain text input before encrypting it ( so we can check it later )
$str = md5( $str ) . $str;
$encryptxt=mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$key,$str,MCRYPT_MODE_CBC,$iv);
$encryptxt64=base64_encode($encryptxt);
return $encryptxt64;
}
function decrypt ($key,$iv,$str)
{
$block=mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$padding=$block-(strlen($str) % $block);
$str.=str_repeat(chr($padding), $padding);
$decryptxt64=base64_decode($str);
$decryptxt=mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$key,$decryptxt64,MCRYPT_MODE_CBC,$iv);
///Separate the md5 hash from the other text, and then hash the other text and compare to the hash we included when encrypting if they are = it all worked.
/// it is perfectly safe to use md5 here because it will be part of what we encrypt, and not accessible until it is decrypted.
///it's sole purpose is to give us 2 things we can compare to check that the decryption worked
$hash = substr( $decryptxt, 0, 32); //find first 32 characters (md5 output is always 32 characters long )
$decryptxt = substr($decryptxt, 33); //find everything after the fist 32
if( $hash != md5($decryptxt) ){
die( 'fail' ); /// or some other error
}
return $decryptxt64;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.