C#学习教程:三重加密在PHP和C#中的结果不同{编码byteEncoder=Encoding.Default;Stringkey="ShHhd8a08JhJiho98ayslcjh";Stringmessage="我们9点在秘密地点见面吧。";字符串加密=加密(消息,密钥,假);字符串解密=解密(加密,密钥,假);Console.WriteLine("消息:{0}",message);Console.WriteLine("加密:{0}",加密);Console.WriteLine("解密:{0}",解密);}publicstaticstringEncrypt(stringtoEncrypt,stringkey,booluseHashing){byte[]keyArray;byte[]toEncryptArray=UTF8Encoding.UTF8.GetBytes(toEncrypt);if(useHashing){MD5CryptoServiceProviderhashmd5=newMD5CryptoServiceProvider();keyArray=hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));}elsekeyArray=UTF8Encoding.UTF8.GetBytes(key);TripleDESCryptoServiceProvidertdes=新的TripleDESCryptoServiceProvider();tdes.Key=keyArray;tdes.Mode=CipherMode.ECB;tdes.Padding=PaddingMode.PKCS7;ICryptoTransformcTransform=tdes.CreateEncryptor();byte[]resultArray=cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);返回Convert.ToBase64String(resultArray,0,resultArray.Length);}publicstaticstringDecrypt(stringtoDecrypt,stringkey,booluseHashing){byte[]keyArray;byte[]toEncryptArray=Convert.FromBase64String(toDecrypt);if(useHashing){MD5CryptoServiceProviderhashmd5=newMD5CryptoServiceProvider();keyArray=hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));}elsekeyArray=UTF8Encoding.UTF8.GetBytes(key);TripleDESCryptoServiceProvidertdes=newTripleDESCryptoServiceProvider();tdes.Key=keyArray;tdes.Mode=CipherMode.ECB;tdes.Padding=PaddingMode.PKCS7;ICryptoTransformcTransform=tdes.CreateDecryptor();byte[]resultArray=cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);返回UTF8Encoding.UTF8.GetString(resultArray);当我用PHP加密时,我得到:arTdPqWOg6VppOqUD6mGITjb24+x5vJjfAufNQ4DN7rVEtpDmhFnMVM+W/WFlksR我不太了解密码学,也想不通有什么想法为什么?谢谢。彼得是对的。PHP只是用零填充,而您在C#代码中使用PKCS#7。下面是一些应该正确的代码:functionpkcs7_pad($text,$blocksize){$pad=$blocksize-(strlen($text)%$blocksize);返回$text.str_repeat(chr($pad),$pad);}$input=pkcs7_pad("让我们9点钟在秘密地点见面。",16);或者,您应该能够将其放入您的C#代码中:tdes.Padding=PaddingMode.Zeros;它也可以工作(虽然安全性稍差)。我不懂PHP,也没有仔细分析过你的C#代码,但由于大多数加密字符串都是相同的,所以数据的填充可能会有所不同?也许PHP正在使用不同于C#代码中使用的PaddingMode.PKCS7的模式?(如果我可以发表评论,这将是评论......)作为旁注:如果您使用的是ECB,那么您不需要IV。事实上,大多数时候使用ECB存在安全风险,因此您确实需要使用其他东西,例如带有IV的CBC。IV是一个随机的非秘密值,其大小与密码块大小相同(3DES为8个字节)。必须为每条消息创建一个新的IV,解密方必须知道加密方使用的IV。事实上,IV是与加密消息一起发送的。以上是C#学习教程:三重加密在PHP和C#中不产生相同结果的所有内容分享,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注it-本文来自网络合集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
