【发布时间】: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