C#常用的加密解密方法.docx

上传人:b****7 文档编号:8964572 上传时间:2023-02-02 格式:DOCX 页数:19 大小:26.50KB
下载 相关 举报
C#常用的加密解密方法.docx_第1页
第1页 / 共19页
C#常用的加密解密方法.docx_第2页
第2页 / 共19页
C#常用的加密解密方法.docx_第3页
第3页 / 共19页
C#常用的加密解密方法.docx_第4页
第4页 / 共19页
C#常用的加密解密方法.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

C#常用的加密解密方法.docx

《C#常用的加密解密方法.docx》由会员分享,可在线阅读,更多相关《C#常用的加密解密方法.docx(19页珍藏版)》请在冰豆网上搜索。

C#常用的加密解密方法.docx

C#常用的加密解密方法

C#常用的加密解密方法

开篇

C#内置很多加密解密的方法,有MD5,SHA1,base64等。

这里会简单介绍下这几个方法以及用法。

 

这几个加密解密会分为两类说,一类是只有加密,没有解密类型的MD5,SHA1。

此类加密常用在数据校验。

一类是有加密,有解密类型的base64,DES,RSA。

此类加密常用在数据传输。

数据校验型

MD5

MessageDigestAlgorithmMD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

该算法的文件号为RFC1321(R.Rivest,MITLaboratoryforComputerScienceandRSADataSecurityInc.April1992)。

MD5即Message-DigestAlgorithm5(信息-摘要算法5),用于确保信息传输完整一致。

是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。

将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

p.s.内容来自XX百科。

MD5主要是用来做数据校验的。

拿网上下载软件来说,有很多软件在下载的时候都会提供一个MD5校验码,就是用来校验软件是否被他人修改过。

还有就是用户账号系统,用户注册后,数据库存储的不是明文密码,而是MD5码。

测试代码:

演示如何获取一个字符串的MD5hash以及校验MD5hash:

usingSystem;

usingSystem.Security.Cryptography;

usingSystem.Text;

namespaceMD5Test

{

classProgram

{

staticvoidMain(string[]args)

{

stringsource="HappyBirthday!

";

stringhash=GetMd5Hash(source);

Console.WriteLine("TheMD5hashof"+source+"is:

"+hash);

Console.WriteLine("Verifyingthehash...");

if(VerifyMd5Hash(source,hash))

{

Console.WriteLine("Thehashesarethesame.");

}

else

{

Console.WriteLine("Thehashesarenotsame.");

}

Console.ReadKey();

}

///

///获取一个字符串的32位16进制字符串格式MD5码

///

///原字符串

///

staticstringGetMd5Hash(stringinput)

{

MD5CryptoServiceProvidermd5Hasher=newMD5CryptoServiceProvider();

byte[]inputBytes=Encoding.Default.GetBytes(input);

byte[]data=md5Hasher.ComputeHash(inputBytes);

StringBuildersBuilder=newStringBuilder();

//将data中的每个字符都转换为16进制的

for(inti=0;i

{

sBuilder.Append(data[i].ToString("x2"));

}

returnsBuilder.ToString();

}

///

///验证Md5hash

///

///原字符串

///原字符串的md5码

///

staticboolVerifyMd5Hash(stringinput,stringhash)

{

stringhashOfInput=GetMd5Hash(input);

StringComparercomparer=StringComparer.OrdinalIgnoreCase;

if(0==comparer.Compare(hashOfInput,hash))

{

returntrue;

}

else

{

returnfalse;

}

}

}

}

SHA1

安全哈希算法(SecureHashAlgorithm)主要适用于数字签名标准(DigitalSignatureStandardDSS)里面定义的数字签名算法(DigitalSignatureAlgorithmDSA)。

对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。

当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。

在传输的过程中,数据很可能会发生变化,这时候就会产生不同的消息摘要。

SHA1有如下特性:

①不可以从消息摘要中复原信息

②两个不同的消息不会产生同样的消息摘要,(但会有1x10^48分之一的机率出现相同的消息摘要,一般使用时忽略)。

p.s.内容摘自XX百科

sha1和md5的用途类似,用来验证数据。

测试代码:

演示通过sha1获取一个字符串的hash并做验证:

usingSystem;

usingSystem.Security.Cryptography;

usingSystem.Text;

namespaceSHA1Test

{

classProgram

{

staticvoidMain(string[]args)

{

stringsource="HappyBirthday!

";

stringhash=GetSha1Hash(source);

Console.WriteLine("TheSHA1Hashof"+source+"is:

"+hash);

Console.WriteLine("Verifyingthehash....");

if(VerifySha1Hash(source,hash))

{

Console.WriteLine("Thehashesarethesame...");

}

else

{

Console.WriteLine("TheHashesarenotsame...");

}

Console.ReadKey();

}

staticstringGetSha1Hash(stringinput)

{

byte[]inputBytes=Encoding.Default.GetBytes(input);

SHA1sha=newSHA1CryptoServiceProvider();

byte[]result=sha.ComputeHash(inputBytes);

StringBuildersBuilder=newStringBuilder();

for(inti=0;i

{

sBuilder.Append(result[i].ToString("x2"));

}

returnsBuilder.ToString();

}

staticboolVerifySha1Hash(stringinput,stringhash)

{

stringhashOfInput=GetSha1Hash(input);

StringComparercomparer=StringComparer.OrdinalIgnoreCase;

if(0==comparer.Compare(hashOfInput,hash))

{

returntrue;

}

else

{

returnfalse;

}

}

}

}

加密数据传输

这个类型的加密可以解密,主要用来把加密后的数据进行传输,对方收到数据后进行解密。

base64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

可查看RFC2045~RFC2049,上面有MIME的详细规范。

Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。

例如,在JavaPersistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTPGETURL中的参数。

在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。

采用Base64编码具有不可读性,需要解码后才能阅读。

p.s.内容摘自XX百科

测试代码:

usingSystem;

usingSystem.Text;

namespaceBase64Test{

classProgram{

staticvoidMain(string[]args){

stringsource="HappyBirthday!

";

stringencryStr=EncryptBase64(source);

Console.WriteLine("原数据:

"+source);

Console.WriteLine("加密后的数据:

"+encryStr);

stringdecryStr=DecryptBase64(encryStr);

Console.WriteLine("解密后的数据:

"+decryStr);Console.ReadKey();}

///

///base64加密

///

///

///

StaticstringEncryptBase64(stringinput){

byte[]inputBytes=Encoding.UTF8.GetBytes(input);

returnConvert.ToBase64String(inputBytes);

}

///

///base64解密

///

///

///

staticstringDecryptBase64(stringinput){

byte[]inputBytes=Convert.FromBase64String(input);

returnEncoding.UTF8.GetString(inputBytes);

}

}

}

base64的加密解密规则比较固定,所以破解也容易,在网上找个在线base64解密就可以破解加密后的内容,所以敏感数据不推荐使用base64。

DES

对称加密算法

DES全称为DataEncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),

并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。

在某些文献中,作为算法的DES称为数据加密算法(DataEncryptionAlgorithm,DSA),已与作为标准的DES区分开来。

P.s.内容摘自XX百科

测试代码:

usingSystem;

usingSystem.IO;

usingSystem.Security.Cryptography;

usingSystem.Text;

namespaceDESTest{

classProgram{

staticvoidMain(string[]args){

stringkey="The_key!

";

stringsource="HappyBirthday!

";

Console.WriteLine("Sourcestring:

"+source);

stringencryptStr=EncryptDES(source,key);

Console.WriteLine("Encryptstring:

"+encryptStr);

stringdecryptStr=DecryptDES(encryptStr,key);

Console.WriteLine("Decryptstring:

"+decryptStr);

Console.ReadKey();

}///

///进行DES加密

///

///要加密的字符串

///密钥,必须为8位

///以Base64格式返回的加密字符串

staticstringEncryptDES(stringpToEncrypt,stringsKey){

using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider()){

byte[]inputByteArray=Encoding.UTF8.GetBytes(pToEncrypt);

des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);

des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);

System.IO.MemoryStreamms=newSystem.IO.MemoryStream();

using(CryptoStreamcs=newCryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write)){

cs.Write(inputByteArray,0,inputByteArray.Length);cs.FlushFinalBlock();

cs.Close();

}

stringstr=Convert.ToBase64String(ms.ToArray());

ms.Close();

returnstr;

}

}

staticstringDecryptDES(stringpToDecrypt,stringsKey){

byte[]inputByteArray=Convert.FromBase64String(pToDecrypt);

using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider()){

des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);

des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);

MemoryStreamms=newMemoryStream();

using(CryptoStreamcs=newCryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write)){

cs.Write(inputByteArray,0,inputByteArray.Length);

cs.FlushFinalBlock();

cs.Close();

}

stringstr=Encoding.UTF8.GetString(ms.ToArray());

ms.Close();

returnstr;

}

}

}

DES加密解密需要提供一个key,双方可以约定一个共同的key使用。

RSA

非对称加密算法

大名鼎鼎的RSA算法->_->,此处没有介绍,自行XX,Google。

只说明,RSA需要两把key,即密钥,一个publickey进行加密,一个privatekey用来解密。

也可称为公钥,私钥。

测试代码:

演示如何生成公钥,私钥,以及适用公钥加密,私钥解密。

usingSystem;

usingSystem.Security.Cryptography;

usingSystem.Text;

namespaceRSATest

{

classProgram

{

staticvoidMain(string[]args)

{

try

{

UnicodeEncodingbyteConverter=newUnicodeEncoding();

byte[]dataToEncrypt=byteConverter.GetBytes("HappyBirthday!

");

byte[]encryptedData;

byte[]decryptedData;

using(RSACryptoServiceProviderrsa=newRSACryptoServiceProvider())

{

//数据加密获取publickey信息

//(usingRSACryptoServiceProvider.ExportParameters(false)

encryptedData=EncryptRSA(dataToEncrypt,rsa.ExportParameters(false),false);

//数据解密,获取privatekey信息

//(usingRSACryptoServiceProvider.ExportParameters(true))

decryptedData=DecryptRSA(encryptedData,rsa.ExportParameters(true),false);

Console.WriteLine("DecryptedString:

"+byteConverter.GetString(decryptedData));

}

Console.ReadKey();

}

catch(ArgumentNullException)

{

Console.WriteLine("Encryptionfailed!

");

}

}

///

///加密数据

///

///要加密的byte数组

///

///

///

staticbyte[]EncryptRSA(byte[]dataToEncrypt,RSAParametersrsaKeyInfo,booldoOAEPadding)

{

try

{

byte[]encryptedData;

using(RSACryptoServiceProviderrsa=newRSACryptoServiceProvider())

{

//导入RSAkey信息,这里导入公钥信息

rsa.ImportParameters(rsaKeyInfo);

//加密传入的byte数组,并指定OAEPpadding

//OAEPpadding只可用在微软Windowxp及以后的系统中

encryptedData=rsa.Encrypt(dataToEncrypt,doOAEPadding);

}

returnencryptedData;

}

catch(CryptographicExceptione)

{

Console.WriteLine(e.Message);

returnnull;

}

}

///

///解密数据

///

///

///

///

///

staticbyte[]DecryptRSA(byte[]dataToDecrypt,RSAParametersrsaKeyInfo,booldoOAEPPadding)

{

try

{

byte[]decryptedData;

using(RSACryptoServiceProviderrsa=newRSACryptoServiceProvider())

{

rsa.ImportParameters(rsaKeyInfo);

decryptedData=rsa.Decrypt(dataToDecrypt,doOAEPPadding);

}

returndecryptedData;

}

catch(CryptographicExceptione)

{

Console.WriteLine(e.Message);

returnnull;

}

}

}

}

使用xml形式的密钥加密解密

–生成xml格式的密钥

生成的密钥会以xml的格式放在你工程bin\Debug目录下。

///

///生成RSApublickeyprivatekey

///

publicstaticvoidGenerateRSAKey(){

RSACryptoServiceProviderrsa=new

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1