【发布时间】:2018-03-30 01:05:22
【问题描述】:
我正在尝试将以下 C# 方法移植到 PHP,但无法正确输出。
public static string Encrypt()
{
String text = "123456";
String key = "1r1ppl3x";
byte[] arrText = UTF8Encoding.UTF8.GetBytes(text);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = (new UnicodeEncoding()).GetBytes(key);
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(arrText, 0, arrText.Length);
tdes.Clear();
String encrypted = Convert.ToBase64String(resultArray, 0, resultArray.Length);
return encrypted;
}
到目前为止我在 PHP 中的尝试:
function encrypt()
{
$key = utf8_encode("1r1ppl3x\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
$data = utf8_encode("123456");
$blocksize = mcrypt_get_block_size(MCRYPT_TRIPLEDES, MCRYPT_MODE_ECB);
$tripleKey = substr($key, 0, mcrypt_get_key_size(MCRYPT_TRIPLEDES, MCRYPT_MODE_ECB));
$paddingSize = $blocksize - (strlen($data) % $blocksize);
$data .= str_repeat(chr($paddingSize), $paddingSize);
$encodedText = mcrypt_encrypt(MCRYPT_TRIPLEDES, $tripleKey, $data, MCRYPT_MODE_ECB);
return base64_encode($encodedText);
}
由于某种原因,我无法获得与 C# 中相同的 PHP 代码输出。
另外,我知道mcrypt_get_block_size 和其他mcrypt 相关方法在 PHP 7.1 中已被弃用,不建议使用它。
【问题讨论】:
-
为什么要使用带有 8 字节密钥的三重 DES?那只是恢复到不安全的DES。 ]ECB 模式不安全,请参阅ECB mode,向下滚动至 Penguin。
-
感谢您的建议,但我无法更改 C# 代码,因为它不是我的。它是我们客户遗留软件的一部分。我的任务是制作与现有 C# 代码等效的 PHP。
-
@zaph 谢谢你看看。
-
有一个选择,安全重要吗?
标签: c# php encryption mcrypt tripledes