各自独立: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('\0');
}
return newV;
}
string upPadding(string p)
{
return p = p.Replace("\0","");
}
}
}
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); } } }
上帝 没人会吗?######会不会是不同机器上的操作系统的位数不同啊,32位和64位?
######DESCryptoServiceProvider? TripleDESCryptoServiceProvider();这个貌似是3DES吧~?###### 我也遇到这样的问题,这是为什么么
###### C# padding方式改为Zeros试试 ######这个我自己解决了 忘记怎么解决了 悲剧 !######这个我解决了 但是忘记怎么解决的了 悲剧######
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。