首页 新闻 搜索 专区 学院

求C#DES加密的key可为任意长度字符或为空代码

1
悬赏园豆:10 [待解决问题]

其它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可任意长度或为空的代码,在此拜谢!


大仙们快出来帮忙!

jansnes的主页 jansnes | 初学一级 | 园豆:192
提问于:2012-04-05 17:01
< >
分享
所有回答(3)
0

使用hash就可以了,hash 16bytes就可以了

today4king | 园豆:3299 (老鸟四级) | 2012-04-05 17:12

现在手上的就是DES,我要想办法去对接,并进行解密,所以必须是C#的DES,key可以为空

支持(0) 反对(0) jansnes | 园豆:192 (初学一级) | 2012-04-05 17:21

@jansnes: hash跟空不冲突,比如如果是空hash值可以指定为-1或者0都可以。

支持(0) 反对(0) today4king | 园豆:3299 (老鸟四级) | 2012-04-05 18:12

@今昭: 

很感谢你能回答我的问题,我现在就是不知道这怎么使用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互相转换

支持(0) 反对(0) jansnes | 园豆:192 (初学一级) | 2012-04-05 19:22

@今昭: 

hash这样写是对的吗?

byte[] tmpSource;
byte[] tmpHash;
tmpSource = ASCIIEncoding.ASCII.GetBytes("");
tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);

然后再  des.Key = tmpHash; 这样还是一样出错,可能是我没找到写法

支持(0) 反对(0) jansnes | 园豆:192 (初学一级) | 2012-04-05 19:43

@今昭: 朋友这个能帮我解决下吗?或者有其它办法可以解决吗? 麻烦你帮我支个招,谢谢了

支持(0) 反对(0) jansnes | 园豆:192 (初学一级) | 2012-04-06 11:20

@jansnes: http://www.cnblogs.com/cshapwinforms/archive/2007/06/27/797479.html

md5的结果就有16位的,也是常用的hash方法之一。

支持(0) 反对(0) today4king | 园豆:3299 (老鸟四级) | 2012-04-11 10:53
0

关注。。。

KivenRo | 园豆:1722 (小虾三级) | 2012-04-06 09:20
0

mark

pfdcnblogs | 园豆:172 (初学一级) | 2013-03-20 13:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册