PHP Unix 格式的 DES ECB

PHP DES ECB with Unix Format

我正在使用一个应用程序来解密文本配置文件,该文件使用 DEC ECB 加密并具有 8 个字符的密钥。我能够使用 MCRYPT 生成在 https://www.tools4noobs.com/.

上测试时匹配的加密结果
mcrypt_encrypt(MCRYPT_DES, $key, $text, MCRYPT_MODE_ECB, $iv)

我认为我的编码有问题。当我在记事本中打开我的加密结果时,我看到了加密的字符串(与我在使用 tools4noobs.com 工具时得到的相匹配。当我对我正在使用的应用程序中的示例加密文件执行相同操作时,我得到什么看起来像汉字。

剽⚚侱鮡㾆퓼ᦐ㒉勣�竐㉁

当我在 Notepad++ 中查看时,我得到一个序列,它不再包含中文字符,看起来更像我生成的加密文件,但仍然不完全匹配。这两个文件都是 ANSI。我的是 Windows (CR LF) 行格式的单行,要匹配的示例是 Unix (LF)。

}Rš&±O¡›†?üÔ‰4ãR õ‡ßÐzA2ûœbýdž¹g#—b¼fÇ!ù

似乎不​​仅仅是我的行格式错误。任何建议或方向将不胜感激。

更新 1 我在评论中看到了对更好示例的请求。在 Notepad++ 中比较结果时

我应该得到这个,用目标软件加密的示例数据

我得到的是这个,相同的数据通过我的PHP用相同的密钥加密

    <?php
   $iv_size = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB);
   $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
   $key = "12345678";
   $text = file_get_contents('test.cfg');
   //echo $text;

   $crypttext = mcrypt_encrypt(MCRYPT_DES, $key, $text, MCRYPT_MODE_ECB, $iv);
   echo $crypttext;

   file_put_contents('test.enc', $crypttext);
   echo "ENCRYPTION COMPLETE"; 


?>

更新 2

$key = "12345678";

$文本

[Tone1]

Atonelength = 9
Btonelength = 1
Description = ABC Rescue
record_delay = 1.5
ignore_after = 5

更新 3

经过一些研究,我认为我的问题与文件编码 and/or 换行符有关。我尝试匹配的输出文件在 UNIX LF 中,我的尝试是 WINDOWS CR LF。目标类型也是两行。

当我在 Notepad++ 中打开这两个文件时,消除了类似中文的字符,我可以看到前 10 个字符是匹配的。当我尝试使用在线工具 dectypt 时,看起来我的文件和目标文件具有相同的内容,只是 spacing/format 不同。所以我很接近。

我现在的问题是,在使用 MCRYPT 和 file_put_contents 将其写入文件时,有没有办法将输出设置为使用 LF 的 UNIX 编码?

此问题的解决方案归结为填充,使 PHP 版本的密文与基于 Python 的应用程序的加密和解密能力兼容。此外,能够使用更新的 openssl 与已弃用的 MCRYPT 来做到这一点。

加密:

$padded_data = $plaintext . str_repeat("[=10=]",(8-(strlen($plaintext) % 8)));
$encrypted_data =  openssl_encrypt($padded_data,"DES-ECB",$key,$options=OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);  

解密:

$plaintext = openssl_decrypt($ciphertext,"DES-ECB",$key,$options=OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);