【问题标题】:PHP DES Encryption compatible with Delphi - encryption functionPHP DES Encryption 兼容 Delphi - 加密功能
【发布时间】:2013-05-17 23:03:25
【问题描述】:

我正在尝试从这个线程创建加密 PHP 算法:

how to sync encryption between delphi and php using dcpcrypt(见shunty的回复)

这是我目前所拥有的:

function encrypt($str, $key)
{
    $keysize = mcrypt_get_key_size(MCRYPT_DES, MCRYPT_MODE_CBC);

    $ivbytes = array(72, 163, 99, 62, 219, 111, 163, 114);
    $iv = implode(array_map("chr", $ivbytes));

    $pad = ord($str[strlen($str) - 1]);
    $enc = substr($str, 0, strlen($str) - $pad);

    $enc = base64_encode($str);
    $k = mhash(MHASH_SHA1, $key);

    //return substr($dec, 0, strlen($dec) - $pad);
    $dec = mcrypt_encrypt(MCRYPT_DES, substr($k, 0, $keysize), $enc, MCRYPT_MODE_CBC, $iv);

    return $dec;
}

我不确定我做错了什么,但用这个来测试它:

echo encrypt("this is a test", "test");

给出输出:=ž«RCdrçb~hý'¯á·OÊ 什么时候应该给出:WRaG/8xlxqqcTAJ5UAk4DA==

谁能帮我解释我哪里出错了,非常感谢我能得到的帮助。

编辑:

function encrypt_SO($str, $key)
    {
        $keysize = mcrypt_get_key_size(MCRYPT_DES, MCRYPT_MODE_CBC);

        $ivbytes = array(72, 163, 99, 62, 219, 111, 163, 114);
        $iv = implode(array_map("chr", $ivbytes));

        $pad = ord($str[strlen($str) - 1]);
        $enc = substr($str, 0, strlen($str) - $pad);
        $k = mhash(MHASH_SHA1, $key);

        //return substr($dec, 0, strlen($dec) - $pad);
        $dec = mcrypt_encrypt(MCRYPT_DES, substr($k, 0, $keysize), $enc, MCRYPT_MODE_CBC, $iv);

        return base64_encode($dec);
    }

将编码移到末尾。

编辑 2:感谢大家的有用帖子的解决方案:

function encrypt_SO($str, $key)
{
    $keysize = mcrypt_get_key_size(MCRYPT_DES, MCRYPT_MODE_CBC);

    $ivbytes = array(72, 163, 99, 62, 219, 111, 163, 114);
    $iv = implode(array_map("chr", $ivbytes));

    $k = mhash(MHASH_SHA1, $key);

    $blocksize = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
    $padsize = $blocksize - (strlen($str) % $blocksize);
    $str .= str_repeat(chr($padsize), $padsize);

    return base64_encode(mcrypt_encrypt(MCRYPT_DES, substr($k, 0, $keysize), $str, MCRYPT_MODE_CBC, $iv));
}

【问题讨论】:

  • WRaG/8xlxqqcTAJ5UAk4DA== 已经过 base64 编码,而 ž«RCdrç­b˜hý’¯á·OÊ 没有。
  • 啊,但我确实使用了这个:$enc = base64_encode($str); - 这不正确吗?我试图理解填充,但我认为我在某处犯了一个错误。
  • 你所说的一切都不会改变我评论的主旨。
  • 加密你base64编码。
  • 谢谢,所以我一直试图更好地理解解密算法,这就是我认为它正在做的事情:首先找到我猜想在加密方法中相同的密钥大小。然后计算IV我也猜想在加密方法中是相同的,因为它特定于Delphi的完成方式。然后计算填充,我不确定它是否正确,然后将密钥更改为 SHA1 哈希,然后加密,最后是 base 64 编码。我将编辑操作,我仍然无法使其正常工作,但我的理解是否正确?

标签: php delphi encryption des


【解决方案1】:

回答您的上述评论:

加密:

  • 获取密钥大小和块大小
  • 获取 IV - 这确实应该是随机生成的,并且可以正确生成,但要在不手动指定 IV 的情况下使用 DCPcrypt,您需要使用提供的 IV。
  • 散列密钥
  • 添加填充 - 你搞错了。对于此示例,您需要以下内容:

    $blocksize = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
    $padsize = $blocksize - (strlen($str) % $blocksize);
    $str .= str_repeat(chr($padsize), $padsize);
    
  • 加密

  • Base64 编码

解密:

  • 获取密钥大小
  • 获取 IV - 如上所述(必须与用于加密的那个相同,但同样,应该真正正确地以加密方式生成)。
  • 散列密钥
  • Base64 解码
  • 解密
  • 移除内边距

【讨论】:

  • 天哪,太感谢你了!!!两天来一直试图解决这个问题,多亏了你,我终于让它工作了。我将使用解决方案编辑 OP,但我使用了您的填充技术,并且还意识到加密方法是在 MCRYPT_MODE_ECB 而不是 MCRYPT_MODE_CBC 这也是我得到不同结果的原因。我在 Delphi 上使用 DCPcrypt 那么有什么方法可以从 DCPcrypt 更改 IV 还是太复杂了?不过我不太了解IV。
  • 另一个满意的客户 :-) 当然有更好的方法。如果您检查 DCPcrypt2.pas 中的源并查找 TDCP_cipher.InitStr,您将看到它是如何派生密钥的,然后使用 nil IV 调用 TDCP_cipher.Init。您在代码中所要做的就是调用 .Init 而不是 .InitStr - 但随后您必须研究生成 IV 的正确方法研究如何将 IV 传递或传输给接收者.我把它留作练习!
  • 好的,谢谢!我将开始查找有关生成 IV 的一些信息,并在今天晚些时候试一试,非常感谢您的帮助。 :)
猜你喜欢
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2014-02-26
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多