其它java,C代码的DES的KEY可任意长度字符或为空,现在我使用的C# des加密算法,当key为空时出错,请高手支招,贴出key 可任意长度字符的代码
网上的代码,key不可为空,必须要8位
尹学渊用VC++写的,可key为空,加密结果到到其它工具或其它语言写的工具上去 反解,并且一切正常
尹学渊用VC++写的(http://www.cnblogs.com/erwin/archive/2009/04/14/1435288.html#2346568),key为空得到的密文可到其它标准DES上去反解原文
求key可任意长度或为空的代码,在此拜谢!
大仙们快出来帮忙!
使用hash就可以了,hash 16bytes就可以了
现在手上的就是DES,我要想办法去对接,并进行解密,所以必须是C#的DES,key可以为空
@jansnes: hash跟空不冲突,比如如果是空hash值可以指定为-1或者0都可以。
@今昭:
很感谢你能回答我的问题,我现在就是不知道这怎么使用hash 16bytes
我把我现在使用的C#DES代码贴出来,麻烦大哥帮我加一下好吗? 很感谢你
//加密方法
public static string Encrypt(string pToEncrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
//以下两个很重要 ,解决了其它语言结果不一样的问题
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.Zeros;
//把字符串放到byte数组中 //原来使用的UTF8编码,我改成Unicode编码了,不行
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
//建立加密对象的密钥和偏移量 //原文使用ASCIIEncoding.ASCII方法的GetBytes方法 //使得输入密码必须输入英文文本
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}
//pToDecrypt为需要解密字符串,sKey为密钥
public static string Decrypt(string pToDecrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
//以下两个很重要 ,解决了其它语言结果不一样的问题
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.Zeros;
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for (int x = 0; x < pToDecrypt.Length / 2; x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
//建立加密对象的密钥和偏移量,此值重要,不能修改
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
//建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象
StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
以上C#DES方法是我现在用的,现就是想让key为空时不出错,并能与其它标准DES互相转换
@今昭:
hash这样写是对的吗?
byte[] tmpSource;
byte[] tmpHash;
tmpSource = ASCIIEncoding.ASCII.GetBytes("");
tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
然后再 des.Key = tmpHash; 这样还是一样出错,可能是我没找到写法
@今昭: 朋友这个能帮我解决下吗?或者有其它办法可以解决吗? 麻烦你帮我支个招,谢谢了
@jansnes: http://www.cnblogs.com/cshapwinforms/archive/2007/06/27/797479.html
md5的结果就有16位的,也是常用的hash方法之一。
关注。。。
mark