我正在开发一个小程序,它必须加密基本句子并回显结果。然后我希望能够复制粘贴结果,并能够以我编码的方式解码文本。它不需要太安全,因此我选择使用Mcrypt。
当我尝试解密时,它会给出奇怪的(ASCII?)字母,我不明白它们来自哪里。尝试使用base64编码/解码来解决它,但这也无济于事。我需要更改什么才能让它正常工作?
<?php
// Define Mcrypt variables
$enc = MCRYPT_RIJNDAEL_128;
$mode = MCRYPT_MODE_CBC;
$key = 'SanderDitIsNodigVoor16bi';
$iv = mcrypt_create_iv(mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM);
// Check if 'submit' is set
if (isset($_POST['submit'])) {
// Check if 'text' is set
if (!empty($_POST['text'])) {
// Check if 'crypt' is set
if (isset($_POST['crypt'])) {
// Retrieve 'text'
$input = $_POST['text'];
// Check for encrypt/decrypt
switch ($_POST['crypt']) {
case 'encrypt':
$result = encrypt();
break;
case 'decrypt':
$result = decrypt();
break;
}
echo $result;
}
// If 'crypt' is not set
else {
echo 'Please select encrypt or decrypt.';
}
}
// If 'text' is not set
else {
echo 'Please fill in some text.';
}
}
function encrypt() {
global $enc, $key, $input, $mode, $iv;
$encrypted = mcrypt_encrypt($enc, $key, $input, $mode, $iv);
$output = base64_encode($encrypted);
return $output;
}
function decrypt() {
global $enc, $key, $input, $mode, $iv;
$decrypted = base64_decode($input);
$output = mcrypt_decrypt($enc, $key, $decrypted, $mode, $iv);
return $output;
}
?>
要明确的是,如果我在加密中包含mcrypt_decrypt以确保它不是我在函数本身中搞砸了的东西,它会正确地解密它。但是,当我试图将两者分开时,事实并非如此。我很难过。
答案 0 :(得分:1)
您要向encrypt
和decrypt
发送相同的输入,即:
$input = $_POST['text'];
加密将成功加密,但您总是试图解密'解密'短语!
您必须将encrypted
短语传递给解密功能
并且不要忘记已弃用mcrypt_*扩展名的重要提示:
这个扩展依赖于libmcrypt,它已经死了,没有维护 2007。
请不要依赖它,考虑切换到维护良好 替代方案(openssl,crypt,密码散列函数,phpseclib, password_compat ...)
并且,尝试停止使用global
变量,不建议这样做。