开发者该如何利用 C# 加解密?( 二 )

3.对称可逆加密对称可逆加密就是用密钥将需要加密的内容进行加密,然后将加密后的内容发送给接收方,接收方街道内容后利用相同的密钥进行解密后就拿到了明文 。对称可逆加密方式有一个严重的问题就是要保证密钥的安全,一旦密钥泄密第三方就可以利用这个密钥对解密收到的密文,甚至可以利用密钥伪造信息发送给接收方,接收方也就无法分辨出到底是谁发送的密文 。
最常用的对称可逆加密算法是 DES ,下面我们通过代码看一下 DES 的实现:
public class DES{/// <summary>/// 密钥/// </summary>private byte key = ASCIIEncoding.ASCII.GetBytes("123456");/// <summary>/// 偏移量/// </summary>private byte iv = ASCIIEncoding.ASCII.GetBytes("123456".Insert(0, "w").Substring(0, 8));/// <summary>/// 加密/// </summary>/// <param name="text">需要加密的值</param>/// <returns>加密后的结果</returns>public string Encrypt(string text){DESCryptoServiceProvider dsp = new DESCryptoServiceProvider;using (MemoryStream memStream = new MemoryStream){CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(key, iv), 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);}}/// <summary>/// 解密/// </summary>/// <param name="encryptText"></param>/// <returns>解密后的结果</returns>public 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(key, iv), CryptoStreamMode.Write);crypStream.Write(buffer, 0, buffer.Length);crypStream.FlushFinalBlock;return ASCIIEncoding.UTF8.GetString(memStream.ToArray);}}}4.非对称可逆加密非对称加密比较麻烦,发送方和接收方都保存有两个密钥,其中一个密钥是公钥,公钥是对外公开的,任何人都可以拿到,另一个是私钥,每个人的私钥不一样 。规则是由A公钥加密的信息只能用A的私钥解密,由A的私钥加密的消息只能由A的公钥解密 。
非对称可逆加密的模式由两种:

  1. 加密模式
    使用接收方的公钥加密,然后使用接收方的私钥解密,这样可以保证只有特定的接收方能收到信息,但是无法确认发送方是谁 。
  2. 认证模式
    使用发送方的私钥加密,然后使用发送方的公钥解密,这样可以保证特定发送方发送消息,但是无法确定消息是发给了谁 。
从上述两种模式的描述中我们可以看到他们存在问题,因此就出现了数字签名,在上述认证模式中加入了散列算法(例如MD5),对明文进行处理后再把信息进行加密后发送出去,接收方收到信息解密后比较信息的散列值和原始消息的散列值就可以确定信息是否被篡改 。
常用的非对称可逆加密算法常用的是RSA,代码实现如下:
public class Rsa{/// <summary>/// 获取加密/解密对/// </summary>/// <returns>Encrypt Decrypt</returns>public static KeyValuePair<string, string> GetKeyPair{RSACryptoServiceProvider RSA = new RSACryptoServiceProvider;string publicKey = RSA.ToXmlString(false);string privateKey = RSA.ToXmlString(true);return new KeyValuePair<string, string>(publicKey, privateKey);}/// <summary>/// 加密/// </summary>/// <param name="content"></param>/// <param name="encryptKey">加密key</param>/// <returns></returns>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);}/// <summary>/// 解密/// </summary>/// <param name="content"></param>/// <param name="decryptKey">解密key</param>/// <returns></returns>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);}/// <summary>/// 产生一组新的密钥/// </summary>/// <param name="content"></param>/// <param name="encryptKey">加密key</param>/// <param name="decryptKey">解密key</param>/// <returns>加密后结果</returns>private static string Encrypt(string content, out string publicKey, out string privateKey){RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider;publicKey = rsaProvider.ToXmlString(false);privateKey = rsaProvider.ToXmlString(true);UnicodeEncoding ByteConverter = new UnicodeEncoding;byte DataToEncrypt = ByteConverter.GetBytes(content);byte resultBytes = rsaProvider.Encrypt(DataToEncrypt, false);return Convert.ToBase


推荐阅读