【问题标题】:Decrypted string is sometimes not same as encrypted source解密的字符串有时与加密的源不同
【发布时间】:2014-10-01 19:36:56
【问题描述】:
class Auth extends MySQLi {
public function aes_enc($encrypt, $mc_key, $iv) {
    $passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, substr($mc_key, 0, 32), trim($encrypt), MCRYPT_MODE_CBC, $iv));
    return $passcrypt;

}

public function aes_dec($decrypt, $mc_key, $iv) {

    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, substr($mc_key, 0, 32), trim($decrypt), MCRYPT_MODE_CBC, $iv));
    return $decrypted;

}

public function salt() {
return str_shuffle('abcdefghijklmnoprsquvzyx0123456789-.,;:_<>');
}

public function iv() {
return mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
}
}

在 test.php 上,如下代码:

<?
require('Auth.php');
$Auth = new Auth;

$str = "verygudlongpassword";

for ($i = 0; $i < 1000; $i++) {
    $salt = sha1($Auth->salt());
    $iv = $Auth->iv();

    $enc = $Auth->aes_enc($str, $salt, $iv);
    $dec = $Auth->aes_dec($enc, $salt, $iv);

    if ($str != $dec) {
        echo $salt . "<br>\n";
    }
}
?>

有时,$dec != $str。为什么会这样?我什至没有将任何东西保存到 DB atm 中,所以不是这样。 感谢您的帮助。

我真的没有什么要说的了,但是网站不允许我发帖。 (nvm那部分)

【问题讨论】:

  • trim() 是否有可能正在删除某些内容?我的猜测是加密可能生成了一个空格字符,trim() 删除了它。
  • 我也这么认为,但事实并非如此。

标签: php encryption aes rijndael


【解决方案1】:

在查看您的代码并在本地使用它之后。您的解密似乎在解密的文本上留下了一些空白。我从所有位置删除了trim() 函数除了来自aes_dec() 的返回值,代码现在成功加密/解密您的字符串1000 次。

所以看起来修剪是问题和解决方案。

class Auth extends MySQLi {
    public function aes_enc($encrypt, $mc_key, $iv)
    {
        $passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, substr($mc_key, 0, 32), $encrypt, MCRYPT_MODE_CBC, $iv);
        return $passcrypt;
    }

    public function aes_dec($decrypt, $mc_key, $iv)
    {
        $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, substr($mc_key, 0, 32), $decrypt, MCRYPT_MODE_CBC, $iv));
        return $decrypted;

    }

    public function salt()
    {
        return str_shuffle('abcdefghijklmnoprsquvzyx0123456789-.,;:_<>');
    }

    public function iv()
    {
        return mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
    }
}

$Auth = new Auth;

$str = "verygudlongpassword";

for ($i = 0; $i < 1000; $i++) {
    $salt = sha1($Auth->salt());
    $iv = $Auth->iv();

    $enc = $Auth->aes_enc($str, $salt, $iv);
    $dec = $Auth->aes_dec($enc, $salt, $iv);

    if ($str != $dec) {
        echo "Decryption failed!<br>\n";
    } else {
        echo "Decryption success! String: $dec<br>\n";
    }
}

【讨论】:

  • 你是巫师吗?严肃地说:谢谢,它奏效了。
猜你喜欢
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2012-07-01
  • 2018-08-26
  • 1970-01-01
相关资源
最近更新 更多