我正在使用一个应用程序来解密使用 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 = 9Btonelength = 1Description = ABC Rescuerecord_delay = 1.5ignore_after = 5更新 3经过一些研究,我相信我的问题与文件编码和/或换行符有关。我试图匹配的输出文件是在 UNIX LF 中,我的尝试是 WINDOWS CR LF。目标类型也是两行。当我在 Notepad++ 中打开这两个文件时,消除了类似中文的字符,我可以看到前 10 个字符是匹配的。当我尝试使用在线工具 dectypt 时,看起来我的文件和目标文件具有相同的内容,只是间距/格式不同。所以我很接近。我现在的问题是,在使用 MCRYPT 和 file_put_contents 将输出写入文件时,有没有办法使用 LF 将输出设置为 UNIX 编码?
1 回答
MMMHUHU
TA贡献1834条经验 获得超8个赞
这个问题的解决方案归结为填充,使 PHP 版本的密文与基于 Python 的应用程序的加密和解密能力兼容。此外,能够使用更新的 openssl 与已弃用的 MCRYPT 来做到这一点。
加密:
$padded_data = $plaintext . str_repeat("\0",(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);
- 1 回答
- 0 关注
- 128 浏览
添加回答
举报
0/150
提交
取消