【发布时间】:2012-01-20 15:37:11
【问题描述】:
我必须在 PHP 中解密一个用这个 C# 类编码的字符串(它是here)
使用系统; 使用 System.Security.Cryptography; 使用 System.Text; 公共静态类加密 { 公共静态字符串加密(字符串输入,字符串密钥) { byte[] inputArray = UTF8Encoding.UTF8.GetBytes(input); TripleDESCryptoServiceProvider TripleDES = new TripleDESCryptoServiceProvider(); TripleDES.Key = UTF8Encoding.UTF8.GetBytes(key); TripleDES.Mode = CipherMode.ECB; TripleDES.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = TripleDES.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length); 三重DES.清除(); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } 公共静态字符串解密(字符串输入,字符串密钥) { byte[] inputArray = Convert.FromBase64String(input); TripleDESCryptoServiceProvider TripleDES = new TripleDESCryptoServiceProvider(); TripleDES.Key = UTF8Encoding.UTF8.GetBytes(key); TripleDES.Mode = CipherMode.ECB; TripleDES.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = TripleDES.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length); 三重DES.清除(); 返回 UTF8Encoding.UTF8.GetString(resultArray); } }我尝试了在网上找到的不同示例,但似乎没有任何效果。我认为第一个问题来自 php mcrypt_generic_init 中的 $iv 参数,然后另一个问题来自 php 函数中缺少的填充。 你能帮我在PHP中转换上面的c#Decrypt函数吗? 谢谢。
【问题讨论】:
-
如果您想尝试一个不需要
mcrypt的解决方案,并且可以让您的代码更容易移植到没有它的实例,您可以尝试phpseclib。如果 mcrypt 函数可用,这将使用它们,如果不可用,则使用内部实现。 -
IV 应该无关紧要,因为 C# 代码使用的是
CipherMode.ECB(这对 IMO 来说很糟糕)。 -
@poupou 是的,IV 无关紧要,ECB 只能用于无法与随机数据区分开来的纯文本(例如其他安全生成的密钥)
-
Pons,不要设置 IV,它不应该出现在 ECB 模式中,并且一个糟糕的实现可能会 XOR 第一个纯文本块与给定的 IV。不过,您最好切换到 CBC 并使用 IV,它也可能与实现之间更兼容(因为在我在 stackoverflow 上看到的大多数描述中,ECB 都是不安全的)。
标签: php encryption 3des tripledes