各自独立:php,。net自己加密解密是没问题的首先测试过 MD5是一样的。但是用php和。net加密的结果不一样
用php加密的数据用。net解密就报错
请问为什么???
$keys ='key';
echo do_mencrypt('123r',$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);
}
}
}
用php加密的数据用。net解密就报错
请问为什么???
$keys ='key';
echo do_mencrypt('123r',$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);
}
}
}
解决方案 »
- 对一个窗体而言,为何构造函数不写代码可以,但是load事件必须要写上(虽然函数体为空)
- c# tabcontrol 的问题,希望在tabcontrol里面新建出来的页面里面自动有另一个form的内容
- C#串口通信 serialport类
- 哪位大哥能否帮个忙,把AspNetForums由sqlServer的驱动sqlDataPrider改一下,改成Access的驱动?
- 用c# 怎么实现 pdf格式怎么转换为word ?????????????????????????
- I need your help
- IIS打开网站后登陆后台进去后,页面显示空白,IIS配置正确
- 求winform DataGrid 增删改查(无BUG)源码谢谢 请发到[email protected]
- 请问我如何打开后缀为.resx的资源文件
- C#程序==吃内存的怪兽?
- 问一个实现界面的问题
- 请问下时间点选择控件是哪个啊,Winform
忘记怎么回事情了 囧