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);
我正在使用一个应用程序来解密文本配置文件,该文件使用 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);