【发布时间】:2015-03-08 12:49:38
【问题描述】:
我编写了以下代码来制作加密和解密机制。一切正常,但如果有人在解密时输入了错误的密钥,我想防止显示不可读的字符。相反,我想向他显示某个错误消息。我该怎么做?
我的 PHP 代码:
<?php
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
function encrypt($plaintext,$key) {
global $iv, $iv_size;
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $plaintext, MCRYPT_MODE_CBC, $iv);
$ciphertext = $iv . $ciphertext;
return base64_encode($ciphertext);
}
function decrypt($ciphertext_base64,$key) {
global $iv, $iv_size;
$ciphertext_dec = base64_decode($ciphertext_base64);
$iv_dec = substr($ciphertext_dec, 0, $iv_size);
$ciphertext_dec = substr($ciphertext_dec, $iv_size);
return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
}
echo decrypt(encrypt('Hello World','123'),'123');
// Correct key used for decryption and result will be `Hello world`
echo decrypt(encrypt('Hello World','123'),'321');
// Wrong key used for decryption and result will be something like :ŘI¨ĄěđŘcSNŔ¶¸˘ÚE‘Z‰ŃZŃ9
?>
【问题讨论】:
-
在现实生活中,你怎么知道解密的钥匙给错了??除非你已经知道解密的正确答案??如果您或某人保留未加密的数据以用于比较以检查解密,那么哪种方式会破坏加密任何内容。
-
@RiggsFolly,我正在编写一个为人们加密和解密数据的应用程序。如果他们只输入正确的密钥,他们就可以看到原始数据。否则,我必须要求他们再次输入密钥。要知道我的意思,请使用 onetimesecret.com 并使用密钥创建一次性链接。然后尝试使用错误的键打开该链接,看看会发生什么。
-
是的,但我的意思是,知道密钥错误的唯一方法是知道密钥是什么。如果我使用你的系统来创建我的秘密,我不得不希望你不要保留密钥。 否则它不是秘密所以我绝对不会使用你的系统或onetimesecret.com
-
@RiggsFolly,是的,你是对的。实际上我不知道 onetimesecret.com 中使用了什么机制。但是,正如您所说,我必须避免存储任何可以由我自己或其他人轻松返回的原始数据。
-
@RiggsFolly,你对汉字所说的话有何看法? (方法一和二)
标签: php encryption key mcrypt