C# 如何 和php 的des 加密解密 保持一致
各自独立:php,。net自己加密解密是没问题的
首先测试过 MD5是一样的。
但是用php和。net加密的结果不一样
用php加密的数据用。net解密就报错
请问为什么???
首先测试过 MD5是一样的。
但是用php和。net加密的结果不一样
用php加密的数据用。net解密就报错
请问为什么???
php 代码是先写的 不能更改得 让c#来配合php 囧
<?php $keys ='key'; echo do_mencrypt('12345678',$keys); echo '<br/>'.md5($keys); /** *加密函数 *$input 要被加密的字符串 *$key 密钥 */ function do_mencrypt($input, $key) { $input = base64_encode(trim($input)); $key = substr(md5($key), 0, 24); $td = mcrypt_module_open('tripledes', '', 'ecb', ''); $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); mcrypt_generic_init($td, $key, $iv); $encrypted_data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); return trim(base64_encode($encrypted_data)); } /** *解密函数 *$input 要被解密的字符串 *$key 密钥 */ function do_mdecrypt($input, $key) { $input = base64_decode(trim($input)); $td = mcrypt_module_open('tripledes', '', 'ecb', ''); $key = substr(md5($key), 0, 24); $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); mcrypt_generic_init($td, $key, $iv); $decrypted_data = mdecrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); return trim(base64_decode($decrypted_data)); } ?>
using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; using System.IO; namespace detest { public class dllEncrypt { //矢量,矢量可以为空 private const string sIV = "qcDY6X+aPLw="; //构造一个对称算法 private SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider(); public dllEncrypt() { } #region public string EncryptString(string Value) /// /// 加密字符串 /// /// 输入的字符串 /// 加密后的字符串 public string EncryptString(string Value,string sKey) { ICryptoTransform ct; MemoryStream ms; CryptoStream cs; byte[] byt; sKey = Md5(sKey); sKey = sKey.Substring(0,24); mCSP.Key = Encoding.UTF8.GetBytes(sKey); Value = Convert.ToBase64String(Encoding.UTF8.GetBytes(Value)); //mCSP.IV = Convert.FromBase64String(sIV); //指定加密的运算模式 mCSP.Mode = System.Security.Cryptography.CipherMode.ECB; //获取或设置加密算法的填充模式 mCSP.Padding = System.Security.Cryptography.PaddingMode.None; mCSP.GenerateIV(); ct = mCSP.CreateEncryptor(); byt = padding(Encoding.UTF8.GetBytes(Value)); ms = new MemoryStream(); cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); cs.Write(byt, 0, byt.Length); cs.FlushFinalBlock(); cs.Close(); return Convert.ToBase64String(ms.ToArray()); } #endregion #region public string DecryptString(string Value) /// /// 解密字符串 /// /// 加过密的字符串 /// 解密后的字符串 public string DecryptString(string Value, string sKey) { ICryptoTransform ct; MemoryStream ms; CryptoStream cs; byte[] byt; sKey = Md5(sKey); sKey = sKey.Substring(0, 24); mCSP.Key = Encoding.UTF8.GetBytes(sKey); //mCSP.IV = Convert.FromBase64String(sIV); mCSP.Mode = System.Security.Cryptography.CipherMode.ECB; mCSP.Padding = System.Security.Cryptography.PaddingMode.None; mCSP.GenerateIV(); ct = mCSP.CreateDecryptor(); byt = Convert.FromBase64String(Value); Console.WriteLine(Encoding.UTF8.GetString(byt)); ms = new MemoryStream(); cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); cs.Write(byt, 0, byt.Length); cs.FlushFinalBlock(); cs.Close(); String re = Encoding.UTF8.GetString(ms.ToArray()); re = upPadding(re); re = Encoding.UTF8.GetString(Convert.FromBase64String(re)); return re; } #endregion public static string Md5(string str) { string pwd = ""; MD5 md5 = MD5.Create();//实例化一个md5对像 // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(str)); // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 for (int i = 0; i < s.Length; i++) { // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 pwd = pwd + s[i].ToString("X"); } return pwd.ToLower(); } static byte[] padding(byte[] source) { int len = source.Length; int s = len / 8; if (len % 8 > 0) { s = s + 1; } byte[] newV = new byte[s * 8]; for (int i = 0; i < len; i++) { newV[i] = source[i]; } for (int i = len; i < s * 8 - len; i++) { newV[i] = Convert.ToByte(''); } return newV; } string upPadding(string p) { return p = p.Replace("",""); } } }
using System; using System.Collections.Generic; using System.Text; namespace detest { class Program { static void Main(string[] args) { String key = "key"; dllEncrypt ec = new dllEncrypt(); String en = ec.EncryptString("123r", key); Console.WriteLine(en); String ot = ec.DecryptString(en, key); Console.WriteLine(ot); Console.Write(1); } } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
C# padding方式改为Zeros试试
这个我解决了 但是忘记怎么解决的了 悲剧
这个我自己解决了 忘记怎么解决了 悲剧 !
C# padding方式改为Zeros试试
我也遇到这样的问题,这是为什么么
DESCryptoServiceProvider?
TripleDESCryptoServiceProvider();这个貌似是3DES吧~?
会不会是不同机器上的操作系统的位数不同啊,32位和64位?
上帝 没人会吗?