从URL进行php解密失败

从URL进行php解密失败,php,encryption,mcrypt,Php,Encryption,Mcrypt,我使用php decrypion检查:回复请求的电子邮件地址与发送请求的电子邮件地址相同 这是代码,但在底部,simpy失败了 网址是: blah.com/page?keyemail=fSHEk8KC17siklGHsj0HJA== 下面的代码还显示了我所做的一些测试,以确保加密/解密工作正常。。。我记下密码看看发生了什么 $key="XiTo74UI09wwe4YeUmuvbL0E"; $iv = mcrypt_create_iv (mcrypt_get_block_size (MCRYP

我使用php decrypion检查:回复请求的电子邮件地址与发送请求的电子邮件地址相同

这是代码,但在底部,simpy失败了

网址是:

blah.com/page?keyemail=fSHEk8KC17siklGHsj0HJA==
下面的代码还显示了我所做的一些测试,以确保加密/解密工作正常。。。我记下密码看看发生了什么

$key="XiTo74UI09wwe4YeUmuvbL0E";

$iv = mcrypt_create_iv (mcrypt_get_block_size (MCRYPT_TripleDES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);

// Encrypting
function encrypt($string, $key) {
    $enc = "";
    global $iv;
    $enc=mcrypt_cbc (MCRYPT_TripleDES, $key, $string, MCRYPT_ENCRYPT, $iv);

  return base64_encode($enc);
}

// Decrypting
function decrypt($string, $key) {
    $dec = "";
    $string = trim(base64_decode($string));
    global $iv;
    $dec = mcrypt_cbc (MCRYPT_TripleDES, $key, $string, MCRYPT_DECRYPT, $iv);
  return $dec;
}

// test example
$email = 'me@me.com';

echo "email is $email<br /><br />";

$email_key = encrypt($email, $key);

echo "key is $email_key<br /><br />";

$email_key2 = decrypt($email_key, $key);

echo "decrypted is $email_key2<br /><br />";
// END test example, all is ok


// this is the code that fails
$to_de = $_GET[keyemail];

echo "keyemail again is $to_de<br /><br />";

$email_key3 = decrypt($to_de, $key);

echo $email_key3;
$key=“XiTo74UI09wwe4YeUmuvbL0E”;
$iv=mcrypt\u create\u iv(mcrypt\u get\u block\u size(mcrypt\u TripleDES,mcrypt\u MODE\u CBC),mcrypt\u DEV\u RANDOM);
//加密
函数加密($string,$key){
$enc=“”;
全球四美元;
$enc=mcrypt_cbc(mcrypt_三元组,$key,$string,mcrypt_ENCRYPT,$iv);
返回base64_编码($enc);
}
//解密
函数解密($string,$key){
$dec=”“;
$string=trim(base64_解码($string));
全球四美元;
$dec=mcrypt_cbc(mcrypt_三元组,$key,$string,mcrypt_DECRYPT,$iv);
返回$dec;
}
//测试示例
$email='1me@me.com';
echo“email是$email

”; $email\u key=encrypt($email,$key); echo“key是$email_key

”; $email\u key 2=解密($email\u key,$key); echo“解密为$email_key2

”; //结束测试示例,一切正常 //这就是失败的代码 $to_de=$_获取[keyemail]; echo“keyemail再次是$to_de

”; $email_key3=解密($to_de,$key); echo$email_key3;
当我回显$email_key3时返回的内容是以某种方式编码的-它应该是me@me.com


我可能错过了一些明显的东西,但我已经失去了

我注意到您正在使用的加密方法是添加随机盐。这意味着使用相同的密钥加密相同的字符串不会产生相同的输出。 尝试使用非随机KDF。
尝试此主题的答案:

您不能在每页上生成新的
IV
,您必须将加密步骤中的
IV
存储在文件或数据库中,或者将其附加到加密字符串中。在下一页生成新IV将不允许您解密字符串


另外,如果可能的话,我会在电子邮件中传递一个哈希值(加上一个salt)-而不是一个加密的表单。

既然你已经知道它应该来自什么电子邮件,那么最好在这里使用哈希值,但是
$\u GET['keyemail']
的变量转储应该是什么,而不是
$\u GET[keyemail]
因为即使PHP将keyemail翻译成字符串,如果我没记错的话,它也会抛出一个E_通知。那么返回的结果是什么?你也能为我们打印出来吗?@meza:请学习如何正确使用数组索引:当我进行AES加密/解密时,我每次都会通过以下方式创建一个随机IV:
$IV=mcrypt\u create\u IV($IV\u大小,mcrypt\u RAND)只要我有相同的密钥和iv大小,我相信它应该会工作(并且会工作),除非这是该算法特有的东西?如果不同的iv对输入和输出都有效-iv的意义是什么?要么你的算法不需要它,要么它必须是相同的。