欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

des加密解密源码 C# key值问题分析

程序员文章站 2024-02-18 22:36:22
公司协议安全需求、需要对传输内容做des、md5加密。 因为是新人、刚交给我这个任务的时候有点眩晕。就开始在网上找各种des加密的内容。因为不懂以为需要把原理也搞明白,最...

公司协议安全需求、需要对传输内容做des、md5加密。

因为是新人、刚交给我这个任务的时候有点眩晕。就开始在网上找各种des加密的内容。因为不懂以为需要把原理也搞明白,最后误了时间、把自己也搞糊涂了。当然,逻辑能力强、有兴趣的朋友可以试着去搞搞。

先贴加密、解密的源码:

复制代码 代码如下:

/// <summary>      

/// 加密数据      

/// </summary>      

/// <param name="text"></param>      

/// <param name="skey"></param>      

/// <returns></returns>      

public static string encrypt(string text, string skey)         {          

descryptoserviceprovider des = new descryptoserviceprovider();          

byte[] inputbytearray;          

inputbytearray = encoding.default.getbytes(text);          

des.key = asciiencoding.ascii.getbytes(system.web.security.formsauthentication.hashpasswordforstoringinconfigfile(skey, "md5").substring(0, 8));          

des.iv = asciiencoding.ascii.getbytes(system.web.security.formsauthentication.hashpasswordforstoringinconfigfile(skey, "md5").substring(0, 8));          

system.io.memorystream ms = new system.io.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);          

}          

return ret.tostring();      

}

        #endregion

/// <summary>      

/// 解密数据      

/// </summary>      

/// <param name="text"></param>      

/// <param name="skey"></param>      

/// <returns></returns>      

public static string decrypt(string text, string skey)         {          

descryptoserviceprovider des = new descryptoserviceprovider();          

int len;          

len = text.length / 2;          

byte[] inputbytearray = new byte[len];          

int x, i;          

for (x = 0; x < len; x++)             {              

i = convert.toint32(text.substring(x * 2, 2), 16);              

inputbytearray[x] = (byte)i;             }          

des.key = asciiencoding.ascii.getbytes(system.web.security.formsauthentication.hashpasswordforstoringinconfigfile(skey, "md5").substring(0, 8));          

des.iv = asciiencoding.ascii.getbytes(system.web.security.formsauthentication.hashpasswordforstoringinconfigfile(skey, "md5").substring(0, 8));          

system.io.memorystream ms = new system.io.memorystream();          

cryptostream cs = new cryptostream(ms, des.createdecryptor(), cryptostreammode.write);          

cs.write(inputbytearray, 0, inputbytearray.length);          

cs.flushfinalblock();          

return encoding.default.getstring(ms.toarray());         }

#endregion

因为是第一次接触des并且公司协议文档的需求、让我对这段代码里面迷糊的有:

1:俩个参数

text 是要加密的内容

skey是作为加密内容的密钥。当然加密、解密时候的skey值,是要保持一致的。

2:des对象的key值

这个key值和iv值是固定的8位长度,一定要牢记。因为咱们的参数skey是不定长度的、所以采取了一个方式就是对其进行md5加密、然后再截取他的前8位。这是为了在解密的时候保证key一致。不然会解密出错。

最后,我说一下做为新人,我感觉牢记的几个地方,或许是大大们眼中写des必需的几点~~别喷我啊、

几个必要的对象:

descryptoserviceprovider 没有它你想怎么des呢、嘿嘿

memorystream    存储在内存的流对象

cryptostream    定义将数据流链接到加密转换流。通过它写入memorystream对象当中

最后转换成string。