-1

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

如何使用 dcpcrypt 在 delphi 和 php 之间同步加密(参见 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));
}
4

1 回答 1

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 解码
  • 解密
  • 移除填充物
于 2013-05-17T14:46:00.513 回答