【问题标题】:How does this encryption decryption work?这种加密解密是如何工作的?
【发布时间】:2011-05-22 14:26:59
【问题描述】:

我在调试完为什么是not working on my server之后在CakePHP的核心类中发现了这个加密解密代码。

我只是想知道它背后的逻辑。它究竟是如何加密和解密的?为什么使用 $j 的 for..loop,以及 XOR 运算符 ^ 对此有何帮助?

function cipher($text, $key) {
    if (!defined('CIPHER_SEED')) {
        //This is temporary will change later
        define('CIPHER_SEED', '76859309657453542496749683645');
    }
    srand(CIPHER_SEED);
    $out = '';

    for ($i = 0; $i < strlen($text); $i++) {
        for ($j = 0; $j < ord(substr($key, $i % strlen($key), 1)); $j++) {
            $toss = rand(0, 255);
        }
        $mask = rand(0, 255);
        $out .= chr(ord(substr($text, $i, 1)) ^ $mask);
    }
    return $out;
}

【问题讨论】:

标签: php encryption cakephp-1.2


【解决方案1】:

^按位异或运算符。因此,它通过 bitwise 将每个字符与“随机”字符异或来依次加密每个字符。这个操作是它自己的逆操作,即(a ^ b) ^ b == a。因此,只要您在解密过程中生成与加密过程中相同的“随机”掩码字符序列,您就总能找回开始时的内容。

$j 循环看起来像是在使用$key 来丢弃rand() 生成的一定比例的值流。这看起来像是从同一个 RNG 中获取许多不同随机流的廉价方法。不过,我不确定这是否是一种非常安全的方法。与 AES 等既定方法相比,自制的加密尝试通常存在极其严重的缺陷。

【讨论】:

  • 但是在这个函数中,既然$mask是一个随机数,$out怎么会给出加密/解密的文本呢?
  • @mmhan: $mask 并不是真正随机的;它是用rand() 生成的,它总是用相同的种子初始化。所以事实上,它完全是确定性的。
猜你喜欢
  • 2013-10-28
  • 2012-05-06
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
相关资源
最近更新 更多