怎么样给SHA1、MD5、DES加密?
简化加密(MSDN)
散列-散列是一种单向算法,一旦数据被转换,将无法再获得其原始值。SHA1 和 MD5.
SHA1 :
importSystem.Security.Cryptography
PrivateSubHashText(ByValTextToHashAsString)
DimSHA1AsSHA1CryptoServiceProvider
DimbytValue()AsByte
DimbytHash()AsByte
'创建新的加密服务提供程序对象
SHA1=NewSHA1CryptoServiceProvider
'将原始字符串转换成字节数组
bytValue=_
System.Text.Encoding.UTF8.GetBytes(TextToHash)
'计算散列,并返回一个字节数组
bytHash=SHA1.ComputeHash(bytValue)
SHA1.Clear()
'返回散列值的Base64编码字符串
Debug.WriteLine(Convert.ToBase64String(bytHash))
EndSub
PrivateSubHashText(ByValTextToHashAsString)
DimSHA1AsSHA1CryptoServiceProvider
DimbytValue()AsByte
DimbytHash()AsByte
'创建新的加密服务提供程序对象
SHA1=NewSHA1CryptoServiceProvider
'将原始字符串转换成字节数组
bytValue=_
System.Text.Encoding.UTF8.GetBytes(TextToHash)
'计算散列,并返回一个字节数组
bytHash=SHA1.ComputeHash(bytValue)
SHA1.Clear()
'返回散列值的Base64编码字符串
Debug.WriteLine(Convert.ToBase64String(bytHash))
EndSub
MD5
importCryptoServiceProvider
PrivateSubHashTextMD5(ByValTextToHashAsString)
Dimmd5AsMD5CryptoServiceProvider
DimbytValue()AsByte
DimbytHash()AsByte
'创建新的加密服务提供程序对象
md5=NewMD5CryptoServiceProvider
'将原始字符串转换成字节数组
bytValue=System.Text.Encoding._
UTF8.GetBytes(TextToHash)
'计算散列,并返回一个字节数组
bytHash=md5.ComputeHash(bytValue)
md5.Clear()
'返回散列值的Base64编码字符串
Debug.WriteLine(Convert.ToBase64String(bytHash))
EndSub
PrivateSubHashTextMD5(ByValTextToHashAsString)
Dimmd5AsMD5CryptoServiceProvider
DimbytValue()AsByte
DimbytHash()AsByte
'创建新的加密服务提供程序对象
md5=NewMD5CryptoServiceProvider
'将原始字符串转换成字节数组
bytValue=System.Text.Encoding._
UTF8.GetBytes(TextToHash)
'计算散列,并返回一个字节数组
bytHash=md5.ComputeHash(bytValue)
md5.Clear()
'返回散列值的Base64编码字符串
Debug.WriteLine(Convert.ToBase64String(bytHash))
EndSub
区别:
1、MD5 使用的加密密钥比 SHA1 使用的密钥大,因此 MD5 散列较难破解。
2、SHA1 从实践或理论上来讲没有发生冲突的可能性。MD5 从理论上讲有发生冲突的可能性。
“盐”值
盐值也可以为您提供一层额外的安全保护。使用 .NET Framework 类 RNGCryptoServiceProvider 创建一个随机的数字字符串。RNG 表示随机数生成器。该类可以创建一个任意长度的随机字节数组,长度可以被指定。
方法例子:
usingRNGCryptoServiceProvider;
privatestringCreateSalt()
{
byte[]bytSalt=newbyte[8];
RNGCryptoServiceProviderrng;
rng=newRNGCryptoServiceProvider();
rng.GetBytes(bytSalt);
returnConvert.ToBase64String(bytSalt);
}
privatestringCreateSalt()
{
byte[]bytSalt=newbyte[8];
RNGCryptoServiceProviderrng;
rng=newRNGCryptoServiceProvider();
rng.GetBytes(bytSalt);
returnConvert.ToBase64String(bytSalt);
}
根据盐值&口令一道提交加密。
对称算法(或密钥算法)
使用一个密钥和一个初始化向量 (IV) 来保证数据的安全。使用该数据的双方都必须知道这个密钥和初始化向量才能够加密和解密数据。非常适于加密大型的数据流。这些算法可以加密数据,也可以解密数据。它们都相当安全,但如果有足够的时间,也可能会被破密,因为有人可能会搜索每个已知的密钥值组合。
- DES
- RC2
- Rijndael
-
TripleDES
不对称算法(或公钥算法)
没有对称算法快,但其代码较难破密。这些算法取决于两个密钥,一个是私钥,另一个是公钥。公钥用来加密消息,私钥是可以解密该消息的唯一密钥。公钥和私钥通过数学方法链接在一起,因此要成功进行加密交换,必须获得这两个密钥。
对称加密步骤:
1、生成密钥方法(以DES 为例):
private SymmetricAlgorithm mCSP;//对称算法类
mCSP=new DESCryptoServiceProvider();
mCSP.GenerateKey(); //生成密钥
string key=Convert.ToBase64String(mCSP.Key);// 密钥值
2、生成初始化向量 (IV):
IV 将帮助算法生成最终加密字符串的数据块。IV 用于开始第一个块的加密。如果不提供 IV,那么只要密钥相同,在字符串之间传递的通用数据将保持同一种模式。因此,需要使用 IV 作为加密数据的“随机”组件。通过这种方式,只要使用的 IV 不同,即使密钥相同,同一个数据也会被加密成完全不同的值。
mCSP.GenerateIV(); //生成IV
string iv=Convert.ToBase64String(mCSP.IV);
3、加密数据
privatestringEncryptString(stringValue)
{
ICryptoTransformct;//需要此接口才能在任何服务提供程序上调用CreateEncryptor方法,服务提供程序将返回定义该接口的实际encryptor对象。
MemoryStreamms;
CryptoStreamcs;
byte[]byt;
ct=mCSP.CreateEncryptor(mCSP.Key,mCSP.IV);
byt=Encoding.UTF8.GetBytes(Value);//将原始字符串转换成字节数组。大多数.NET加密算法处理的是字节数组而不是字符串。
//创建CryptoStream对象cs后,现在使用CryptoStream对象的Write方法将数据写入到内存数据流。这就是进行实际加密的方法,加密每个数据块时,数据将被写入MemoryStream对象。
ms=newMemoryStream();
cs=newCryptoStream(ms,ct,CryptoStreamMode.Write);
cs.Write(byt,0,byt.Length);
cs.FlushFinalBlock();
cs.Close();
returnConvert.ToBase64String(ms.ToArray());
}
4、解密数据
privatestringDecryptString(stringValue)
{
ICryptoTransformct;
MemoryStreamms;
CryptoStreamcs;
byte[]byt;
ct=mCSP.CreateDecryptor(mCSP.Key,mCSP.IV);
byt=Convert.FromBase64String(Value);
ms=newMemoryStream();
cs=newCryptoStream(ms,ct,CryptoStreamMode.Write);
cs.Write(byt,0,byt.Length);
cs.FlushFinalBlock();
cs.Close();
returnEncoding.UTF8.GetString(ms.ToArray());
}
Encrypt 函数和 Decrypt 函数只有三个不同之处。
- 需要使用 CryptoServiceProvider 类的 CreateDecryptor 方法来创建相应的 ICtryptoTransform 对象。
- 需要将 Base64 编码字符串转换成字节数组。需要使用 Convert.FromBase64String 方法来实现此转换。
- 通过对原始字节数组进行转换,将字节数组转换成相应的内存数据流。需要将内存数据流从字节数组转换回可以在窗体上再次显示的普通字符串。需要使用 Encoding.UTF8.GetString() 方法来实现此转换。
本文地址:http://www.45fan.com/dnjc/69697.html