C# des加密,密钥可以不是8位?

wihelm 2014-06-25 11:00:33
string strRtn;
try
{
DESCryptoServiceProvider desc = new DESCryptoServiceProvider();//des进行加密
byte[] key = System.Text.Encoding.Unicode.GetBytes(encryptkey);
byte[] data = System.Text.Encoding.Unicode.GetBytes(encryptstring);
MemoryStream ms = new MemoryStream();//存储加密后的数据
CryptoStream cs = new CryptoStream(ms, desc.CreateEncryptor(key, key), CryptoStreamMode.Write);
cs.Write(data, 0, data.Length);//进行加密
cs.FlushFinalBlock();
strRtn = Convert.ToBase64String(ms.ToArray());
return strRtn;
}
这个程序里,encryptkey是密钥,为四位Oyea,怎么回事?
mrsoft加密后为lr0rYp7VuGmBxE2R+l+EJQ==
不知道怎么进行的加密?
自己后来又下载了一个des字符串加密解密,发现密钥必须为8位,那么这个程序里是怎么加密的,为什么密钥不是8位?又是怎么得到的lr0rYp7VuGmBxE2R+l+EJQ==??
谢谢!
...全文
650 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
md5e 2014-06-25
  • 打赏
  • 举报
回复
将二进制转为64位字节 Convert.ToBase64String(ms.ToArray());
wihelm 2014-06-25
  • 打赏
  • 举报
回复
引用 5 楼 liuchaolin 的回复:
应该是 ASCIIEncoding.ASCII.GetBytes(encryptkey); 和 System.Text.Encoding.Unicode.GetBytes(encryptkey); 的区别 ASCII英文好像是二位的 Unicode都是四位的
那个必须8位的代码,果然把Encoding.GetEncoding("utf-8").GetBytes(p_strKey)改为Encoding.Unicode.GetBytes(p_strKey)就可以输入4为密钥了。不过算出来加密后是:96bd2b629ed5b86981c44d91fa5f8425。 lr0rYp7VuGmBxE2R+l+EJQ==怎么来的?怎么还有“=”,“+”等,算不出lr0rYp7VuGmBxE2R+l+EJQ==啊。难道算法不一样?我看着一样的啊。。。 那个des字符串加密解密程序的代码: :
 /// <summary>
    /// DES加密,加密utf-8字符集数据,为静态函数
    /// </summary>
    /// <param name="p_strEncypt">需要加密字符串</param>
    /// <param name="p_strKey">密钥,只能8位</param>
    /// <returns>加密后字符串</returns>
    public static string DESEncryptEncodUTF(string p_strEncypt, string p_strKey)
    {
        StringBuilder sb = new StringBuilder();
        string strData = string.Empty;//加密后返回的字符串
        p_strEncypt = System.Web.HttpUtility.UrlEncode(p_strEncypt, System.Text.Encoding.UTF8);

        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        byte[] btMyStrs = Encoding.GetEncoding("utf-8").GetBytes(p_strEncypt);
        byte[] btMyKeys = Encoding.GetEncoding("utf-8").GetBytes(p_strKey);
        des.IV = btMyKeys;
        des.Key = btMyKeys;
        MemoryStream memoryStream = new MemoryStream();
        CryptoStream cryptoStream = new CryptoStream(memoryStream, des.CreateEncryptor(), CryptoStreamMode.Write);
        cryptoStream.Write(btMyStrs, 0, btMyStrs.Length);
        cryptoStream.FlushFinalBlock();

        foreach (byte bt in memoryStream.ToArray())
        {
            sb.AppendFormat("{0:X2}", bt);
        }

        strData = sb.ToString().ToLower();
        return strData;
    }
md5e 2014-06-25
  • 打赏
  • 举报
回复
应该是 ASCIIEncoding.ASCII.GetBytes(encryptkey); 和 System.Text.Encoding.Unicode.GetBytes(encryptkey); 的区别 ASCII英文好像是二位的 Unicode都是四位的
wihelm 2014-06-25
  • 打赏
  • 举报
回复
引用 2 楼 liuchaolin 的回复:
可以的,只要在最后进行 新密钥=md5(密钥).substring(2,8);
谢回复,没看到这样的代码,是这里的文件:[url=http://substring][/url] WinOperationClass.cs里面的代码。
wihelm 2014-06-25
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
encryptkey在哪里定义,在哪里赋值的,代码贴出来
SqlBaseClass G_SqlExecute = new SqlBaseClass(); //声明数据库操作类对象 private string encryptkey = "Oyea"; //密钥 自己在byte[] key = System.Text.Encoding.Unicode.GetBytes(encryptkey);下设置断点,赋值给a,确实是Oyea 代码有点多,贴不下,其实就是这个代码:http://download.csdn.net/detail/sequh/450840,里面的WinOperationClass.cs文件。 WinOperationClass文件: http://pan.baidu.com/s/1kTHVEsB
md5e 2014-06-25
  • 打赏
  • 举报
回复
可以的,只要在最后进行 新密钥=md5(密钥).substring(2,8);
於黾 2014-06-25
  • 打赏
  • 举报
回复
encryptkey在哪里定义,在哪里赋值的,代码贴出来
wihelm 2014-06-25
  • 打赏
  • 举报
回复
引用 7 楼 liuchaolin 的回复:
将二进制转为64位字节 Convert.ToBase64String(ms.ToArray());
OK了,感激万分,谢谢!!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧