【问题标题】:PHP: encrypt string in one page and decrypt it in another using POST?PHP:在一个页面中加密字符串并使用POST在另一个页面中解密它?
【发布时间】:2016-04-06 17:48:32
【问题描述】:

我正在尝试加密一个 php 页面中的字符串并使用 $_POST[] 将其传递到另一个页面并再次解密。

加密工作正常,但是当我将其发布到另一个页面进行解密时,它根本没有被解密,我再次得到另一个加密字符串!

这是我加密的第 1 页上的代码:

<?php
/*
 * PHP mcrypt - Basic encryption and decryption of a string
 */
$string = "somemails@yahoo.co.uk";
$secret_key = "This is my secret key";

// Create the initialization vector for added security.
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);

// Encrypt $string
$encrypted_string = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret_key, $string, MCRYPT_MODE_CBC, $iv);

// Decrypt $string
$decrypted_string = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secret_key, $encrypted_string, MCRYPT_MODE_CBC, $iv);

echo "Original string : " . $string . "<br />\n";
echo "Encrypted string : " . $encrypted_string . "<br />\n";
echo "Decrypted string : " . $decrypted_string . "<br />\n";
?>

<form action="2.php" method="post">
<input type="text" id="" name="input" value="<?php echo $encrypted_string; ?>"/>
<button type="submit" >submit</button>
</form>

这是我试图再次解密的第 2 页中的代码:

<?php
    $input = $_POST['input'];

    $secret_key = "This is my secret key";

// Create the initialization vector for added security.
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);

// Encrypt $string
$encrypted_string = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret_key, $input, MCRYPT_MODE_CBC, $iv);

// Decrypt $string
$decrypted_string = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secret_key, $encrypted_string, MCRYPT_MODE_CBC, $iv);


echo $decrypted_string;
?>

有人可以就这个问题提出建议吗?我正在尝试做的事情有可能吗?

【问题讨论】:

  • mcrypt_create_iv 使用 MCRYPT_MODE_ECB 和 mcrypt_encrypt,mcrypt_decrypt 使用 MCRYPT_MODE_CBC....尝试使用其中任何一个!
  • 请注意,您将未经身份验证的密文存储在客户端上,这会使您的表单容易受到选择密文攻击。请不要自己动手;请查看defuse's library。 (它是 MIT 许可的。)
  • @ScottArciszewski,我最终选择了BLOWFISH
  • 为什么要使用河豚而不是化解? Blowfish 未经过身份验证。
  • @ScottArciszewski,我真的不需要验证值!我只需要一种方法来加密$variable,这样用户就无法在浏览器中看到它,因为它位于隐藏的 html 输入中,然后在下一页再次解密。

标签: php encryption


【解决方案1】:

请注意以下行:

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);

每次调用它都会生成随机 IV。因此,您需要使用与加密它相同的 IV。因此,我建议您也发布 IV 值或使用特定的 IV,例如:

$iv = "My Secret IV"; //On both pages

【讨论】:

  • 这就像一个魅力,它解密了第二页中的值,但我在两个页面上都收到了这个错误:Warning: mcrypt_encrypt() [function.mcrypt-encrypt]: The IV parameter must be as long as the blocksize
  • 尝试使用 POST 发送 IV 而不是使用您自己的 IV。
  • 我确实尝试将其作为 POST 发送,但这不起作用,我在第二页上再次获得了加密字符串,但是当我使用自己的“Secret IV”时,它在第二页上有效但我在第 1 页和第 2 页都收到了这个错误。
  • 其实 Mangesh 是对的(在 cmets 中),你使用了两种模式,只尝试一种 mcrypt 模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多