1、对称加密
又称为私人密钥加密/共享密钥加密,加密与解密使用同一密钥。
对称加密:ke=kd。
特点:
(1)加密强度不高,但效率高;
(2)密钥分发困难。(大量明文为了保证加密效率一般使用对称加密)
常见对称密钥加密算法:DES、3DES(三重DES)、AES、RC-5、IDEA算法。
2、非对称加密
又称为公开密钥加密。
非对称加密ke!=kd; 密钥必须成对使用(公钥加密,相应的私钥解密)
特点:加密速度慢,但强度高。
常见非对称密钥加密算法:RSA、DSA、ECC。
算法类型 | 算法 | |
对称加密算法(共享密钥) | 分组加密 | DES、AES、3DES、IDEA等 |
流密码 | RC-5等 | |
非对称加密算法(公开密钥) | RSA、DSA、ECC等 |
3、数字签名
数字签名的过程如图所示(发送者使用自己的私钥对摘要签名,接收者利用发送者的公钥对接收到的摘要进行验证)
4、数字摘要
由单向散列函数加密成固定长度的散列值。
常见的摘要算法:MD5(128位)、SHA(160位),由于SHA通常采用的密钥长度较长,因此安全性高于MD5.
签名的作用:
①接收者可验证消息来源的真实性;
②发送者无法否认发送过该消息;
③接收者无法伪造或篡改消息。
签名的过程:
①信息发送者使用一个单向散列函数(Hash函数)对信息生成信息摘要。
②信息发送者使用自己的私钥签名信息摘要。
③信息发送者把信息本身和已签名的信息摘要一起发送出去。
④信息接收者通过使用与信息发送者使用的同一个单向散列函数(Hash函数)对接收的信息本身生成新的信息摘要,再使用信息发送者的公钥对信息摘要进行验证,以确认信息发送者的身体和信息是否被修改过。
5、数字证书的应用
1)、数字证书的内容包括:CA签名、用户信息(用户名称)、用户公钥等。
2)、证书中的CA签名验证数字证书的可靠性。
3)、用户公钥:客户端利用证书中的公钥加密,服务器利用自己的私钥解密。
6、C#中使用
1.MD5使用
MD5公开的算法,任何语言实现后其实都一样,通用的。不可逆加密:原文--加密--密文,密文无法解密出原文。
1)相同原文加密的结果是一样的
2)不同长度的内容加密后加过都是32位
3) 原文差别很小,结果差别很大
4)不管文件多大,都能产生32位长度摘要
文件内容有一点改动,结果变化非常大
文件内容不变,名字变了,结果是不变
字符串加密方法:
public static string Encrypt(string source,int length=32)
{
if (string.IsNullOrEmpty(source))
{
return string.Empty;
}
HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
byte[] bytes = Encoding.UTF8.GetBytes(source);
byte[] hashValue = provider.ComputeHash(bytes);
StringBuilder sb = new StringBuilder();
switch (length)
{
case 16:
for (int i = 4; i < 12; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
case 32:
for (int i = 0; i < 16; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
default:
for (int i = 0; i < hashValue.Length; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
}
return sb.ToString();
}
文件摘要提取:
public static string AbstractFile(Stream stream)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(stream);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
2、DES使用
密钥长度8,即_rgbKey、_rgbIV数据长度为8。加密算法都是公开的,密钥是保密的, 即使拿到密文,也无法推算密钥,也推算不了原文。
加密方法:
public static string Encrypt(string text)
{
DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
using (MemoryStream memStream = new MemoryStream())
{
CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
StreamWriter sWriter = new StreamWriter(crypStream);
sWriter.Write(text);
sWriter.Flush();
crypStream.FlushFinalBlock();
memStream.Flush();
return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
}
}
解密方法:
public static string Decrypt(string encryptText)
{
DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
byte[] buffer = Convert.FromBase64String(encryptText);
using (MemoryStream memStream = new MemoryStream())
{
CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
crypStream.Write(buffer, 0, buffer.Length);
crypStream.FlushFinalBlock();
return ASCIIEncoding.UTF8.GetString(memStream.ToArray());
}
}
3.RSA
加密后能解密回原文,加密key和解密key是一对。算法是公开的,加密key和解密key是不能互相推导的 ,有了密文,没有解密key,也推导不出原文。
加密方法:
public static string Encrypt(string content,string encryptKey)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(encryptKey);
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] DataToEncrypt = ByteConverter.GetBytes(content);
byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false);
return Convert.ToBase64String(resultBytes);
}
解密方法:
public static string Decrypt(string content,string decryptKey)
{
byte[] dataToDecrypt = Convert.FromBase64String(content);
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(decryptKey);
byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false);
UnicodeEncoding ByteConverter = new UnicodeEncoding();
return ByteConverter.GetString(resultBytes);
}
调用:
KeyValuePair<string, string> encryptDecrypt = RsaEncrypt.GetKeyPair();
string rsaEn1 = RsaEncrypt.Encrypt("F896ADCB-9D5A-4751-8037-02C913B48F38", encryptDecrypt.Key);
string rsaDe1 = RsaEncrypt.Decrypt(rsaEn1, encryptDecrypt.Value);
Console.WriteLine("************************************");
Console.WriteLine("加密后:" + rsaEn1);
Console.WriteLine("解密后:" + rsaDe1);