我试图将以下C#方法移植到PHP,但无法获得正确的输出。将C#中的TripleDESCryptoServiceProvider移植到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);
}
由于某种原因,我不能让PHP代码相同,一个在C#中的输出。
此外,我知道mcrypt_get_block_size
和其他mcrypt
相关方法在PHP 7.1中已弃用,建议不要使用它。
为什么使用Triple DES和8字节密钥?这只是恢复到不安全的DES。 ] ECB模式不安全,请参阅[ECB模式](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29),向下滚动到企鹅。 – zaph
最好不要使用PHP mcrypt,它是弃用的,多年未更新,不支持标准的PKCS#7(néePKCS#5)填充,只有**非标准的null填充**不能甚至可以用于二进制数据。 mcrypt有很多优秀的[bug](https://sourceforge.net/p/mcrypt/bugs/),可以追溯到2003年.mcrypt-extension已被弃用,将在PHP 7.2中被删除。请考虑使用[defuse](https://github.com/defuse/php-encryption)或[RNCryptor](https://github.com/RNCryptor),他们提供了一个完整的解决方案,并且正在维护和正确。 – zaph
我很欣赏这个建议,但我不能更改C#代码,因为它不是我的。它是我们客户的遗留软件的一部分。我的任务是使现有C#代码的PHP等效。 – xar