【问题标题】:PHP MCRYPT encrypt/decrypt returns invisible strange characters?PHP MCRYPT 加密/解密返回不可见的奇怪字符?
【发布时间】:2013-05-29 12:47:42
【问题描述】:

mcrypt_decrypt 给了我额外的不可见字符,这些字符通过在页面上回显是不可见的。只能通过将其写入文本文件来查看。意思是,只显示在页面上是可以的,很难被注意到。

这是谷歌搜索的代码示例。 请指导我正确用法是什么有问题:

function encrypt ($pure_string, $key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, $pure_string, MCRYPT_MODE_ECB, $iv);
    return $encrypted_string;
}

function decrypt ($encrypted_string, $key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}

但是当我尝试时:

$encrypted_string = encrypt("This is the original string.", "ABC123");
echo decrypt($encrypted_string, "ABC123");

.. 我得到类似的东西:

This is the original string.�������

������� 这个奇怪的字符实际上不可见 你/我只是 echo 它。只能写入文本文件才能看到。

  • 请问我错过了什么?
  • 有没有完美的方法来实现这种加密/解密?

谢谢。

【问题讨论】:

  • MCRYPT_MODE_ECB -- 糟糕 .. 你不应该使用这个
  • @Baba 不,这不是重复的。完全不同的问题。这也不是trim 的问题。
  • 添加它有重复,因为..你的加密有很多问题MCRYPT_RAND ,MCRYPT_MODE_ECB缺少PKCS7 padding,padding oracle attacks..你可以学习很多示例类必须在这里复制答案

标签: php character encryption mcrypt


【解决方案1】:

您可以使用trim($string, "\0\4") 来剪切这些字符。

【讨论】:

  • 这确实有效,即使我不确定它是否是好的解决方案。至少 ������� 字符消失了。
  • 你以后会有很多问题..你适当的填充..这并不难
【解决方案2】:

rtrim() 将删除 mcrypt 添加的填充...

【讨论】:

    【解决方案3】:

    这是填充。 ECB 模式要求输入是密码块大小的倍数,因此会添加额外的字节(很可能是 PKCS#5 填充)。

    要删除 PKCS#5 填充,您可以使用以下代码:

    $dec_s = strlen($decrypted);
    $padding = ord($decrypted[$dec_s-1]);
    $decrypted = substr($decrypted, 0, -$padding); 
    

    【讨论】:

    • 那么正确的用法是什么,因为我真的不知道。
    • o_O 抱歉,它返回的是空白字符串 ""。可以说$decrypted = "This is the original string.�������"。另外,是不是要放入解密(在解密字符串之后)对吗?
    • 嗯,最后到底是什么字符?你能显示 ord($decrypted[strlen($decrypted)-1]) 吗?
    【解决方案4】:

    函数加密 ($pure_string, $key) {

    => $key

    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, $pure_string, MCRYPT_MODE_ECB, $iv);

    => $encryption_key

    不等于

    【讨论】:

    • 如果它的代码示例,请以适当的方式包装它以突出显示并确保语法正确。此外,很少的解释通常是有用的。
    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 2020-11-21
    • 2015-09-04
    • 2013-04-06
    • 2011-01-24
    • 2015-11-10
    • 2014-06-28
    • 2014-09-12
    相关资源
    最近更新 更多