您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C#编程总结(七)数据加密——附源码
概述数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。加密建立在对信息进行数学编码和解码的基础上。加密类型分为两种,对称加密与非对称加密,对称加密双方采用共同密钥。非对称加密,这种加密方式存在两个密钥,一个是公共密钥(对外公开),一种是私人密钥(对外保密)。一、摘要算法数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法或散列算法。从严格意义上讲,摘要算法不是加密算法,但在具体应用中类似于加密算法使用,或者与加密算法一起使用,这里也拿来介绍下。应用范围:密码加密、数据完整性校验、数字签名等这里介绍常用的两种摘要算法,MD5与SHA1。提示:当前MD5已经被破解,推荐使用SHA11、MD5哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。加密哈希函数有这样一个属性:在计算上不大可能找到散列为相同的值的两个不同的输入;也就是说,两组数据的哈希值仅在对应的数据也匹配时才会匹配。数据的少量更改会在哈希值中产生不可预知的大量更改。MD5算法的哈希值大小为128位。MD5类的ComputeHash方法将哈希作为16字节的数组返回。请注意,某些MD5实现会生成32字符的十六进制格式哈希。若要与此类实现进行互操作,请将ComputeHash方法的返回值格式化为十六进制值。MD5加密:///summary///MD5加密为32字符长度的16进制字符串////summary///paramname=input/param///returns/returnspublicstaticstringEncryptByMD5(stringinput){MD5md5Hasher=MD5.Create();byte[]data=md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input));StringBuildersBuilder=newStringBuilder();//将每个字节转为16进制for(inti=0;idata.Length;i++){(data[i].ToString(x2));}returnsBuilder.ToString();}2、SHA1计算输入数据的SHA1哈希值。哈希值用作表示大量数据的固定大小的唯一值。如果相应的数据也匹配,则两个数据集的哈希应该匹配。数据的少量更改会在哈希值中产生不可预知的大量更改。SHA1算法的哈希值大小为160位。SHA1加密:///summary///SHA1加密////summary///paramname=input/param///returns/returnspublicstaticstringEncryptBySHA1(stringinput){SHA1sha=newSHA1CryptoServiceProvider();byte[]bytes=Encoding.Unicode.GetBytes(input);byte[]result=sha.ComputeHash(bytes);returnBitConverter.ToString(result);}二、对称加密对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。原理图:优点:算法公开、计算量小、加密速度快、加密效率高。缺点:密钥管理困难,使用成本较高。与公开密钥加密算法比起来,对称加密算法能够提供加密和认证却缺乏了签名功能,使得使用范围有所缩小。常用的对称加密算法有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等应用场景:数据传输、大数据量加密、敏感数据加密等等这里重点介绍常用的DES与AES加密算法。提示:DES已经被破解,推荐使用3DES或AES1、DES最早、最著名的保密密钥或对称密钥加密算法DES(DataEncryptionStandard)是由IBM公司在70年代发展起来的,并经政府的加密标准筛选后,于1976年11月被美国政府采用,DES随后被美国国家标准局和美国国家标准协会(AmericanNationalStandardInstitute,ANSI)承认。DES使用56位密钥对64位的数据块进行加密,并对64位的数据块进行16轮编码。与每轮编码时,一个48位的每轮密钥值由56位的完整密钥得出来。DES用软件进行解码需用很长时间,而用硬件解码速度非常快。幸运的是,当时大多数黑客并没有足够的设备制造出这种硬件设备。在1977年,人们估计要耗资两千万美元才能建成一个专门计算机用于DES的解密,而且需要12个小时的破解才能得到结果。当时DES被认为是一种十分强大的加密方法。随着计算机硬件的速度越来越快,制造一台这样特殊的机器的花费已经降到了十万美元左右,而用它来保护十亿美元的银行,那显然是不够保险了。另一方面,如果只用它来保护一台普通服务器,那么DES确实是一种好的办法,因为黑客绝不会仅仅为入侵一个服务器而花那么多的钱破解DES密文。但是,这个算法,现在已经能够轻易破解。不过对于日常的非机密文件同样可以继续使用。加密:///summary///加密字符串////summary///paramname=input/param///paramname=sKey/param///returns/returnspublicstaticstringEncryptString(stringinput,stringsKey){byte[]data=Encoding.UTF8.GetBytes(input);using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider()){=ASCIIEncoding.ASCII.GetBytes(sKey);des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);ICryptoTransformdesencrypt=des.CreateEncryptor();byte[]result=desencrypt.TransformFinalBlock(data,0,data.Length);returnBitConverter.ToString(result);}}解密:///summary///解密字符串////summary///paramname=input/param///paramname=sKey/param///returns/returnspublicstaticstringDecryptString(stringinput,stringsKey){string[]sInput=input.Split(-.ToCharArray());byte[]data=newbyte[sInput.Length];for(inti=0;isInput.Length;i++){data[i]=byte.Parse(sInput[i],NumberStyles.HexNumber);}using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider()){des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);ICryptoTransformdesencrypt=des.CreateDecryptor();byte[]result=desencrypt.TransformFinalBlock(data,0,data.Length);returnEncoding.UTF8.GetString(result);}}2、AES表示高级加密标准(AES)的所有实现都必须从中继承的抽象基类。密码学中的高级加密标准(AdvancedEncryptionStandard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。加密:///summary///AES加密算法////summary///paramname=input明文字符串/param///paramname=key密钥/param///returns字符串/returnspublicstaticstringEncryptByAES(stringinput,stringkey){byte[]keyBytes=Encoding.UTF8.GetBytes(key.Substring(0,32));using(AesCryptoServiceProvideraesAlg=newAesCryptoServiceProvider()){aesAlg.Key=keyBytes;aesAlg.IV=AES_IV;ICryptoTransformencryptor=aesAlg.CreateEncryptor(aesAlg.Key,aesAlg.IV);using(MemoryStreammsEncrypt=newMemoryStream()){using(CryptoStreamcsEncrypt=newCryptoStream(msEncrypt,encryptor,CryptoStreamMode.Write)){using(StreamWriterswEncrypt=newStreamWriter(csEncrypt)){swEncrypt.Write(input);}byte[]bytes=msEncrypt.ToArray();//returnConvert.ToBase64String(bytes);//此方法不可用returnBitConverter.ToString(bytes);}}}}解密:///summary///AES解密////summary///paramname=input密文字节数组/param///paramname=key密钥/param///returns返回解密后的字符串/returnspublicstaticstringDecryptByAES(stringinput,stringkey){//byte[]inputBytes=Convert.FromBase64String(input);//Encoding.UTF8.GetBytes(input);string[]sInput=input.Split(-.ToCharArray());byte[]inputBytes=newbyte[sInput.Length];for(inti=0;isInput.Length;i++){inputBytes[i]=byte.Parse(sInput[i],NumberStyles.HexNumber);}byte[]keyBytes=Encoding.UTF8.GetBytes(key.Substring(0,32));using(AesCryptoServi
本文标题:C#编程总结(七)数据加密——附源码
链接地址:https://www.777doc.com/doc-5670096 .html