Unix 格式的 PHP DES ECB

我正在使用一个应用程序来解密使用 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++ 中比较结果时

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

http://img2.mukewang.com/6442579e0001860e06570071.jpg.

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

http://img4.mukewang.com/644257ad0001eb9e06550048.jpg

  <?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


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


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


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


呼啦一阵风
浏览 133回答 1
1回答

MMMHUHU

这个问题的解决方案归结为填充,使 PHP 版本的密文与基于 Python 的应用程序的加密和解密能力兼容。此外,能够使用更新的 openssl 与已弃用的 MCRYPT 来做到这一点。加密:$padded_data&nbsp;=&nbsp;$plaintext&nbsp;.&nbsp;str_repeat("\0",(8-(strlen($plaintext)&nbsp;%&nbsp;8))); $encrypted_data&nbsp;=&nbsp;&nbsp;openssl_encrypt($padded_data,"DES-ECB",$key,$options=OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);解密:$plaintext&nbsp;=&nbsp;openssl_decrypt($ciphertext,"DES-ECB",$key,$options=OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);
打开App,查看更多内容
随时随地看视频慕课网APP