详解.NET中的加密算法总结(自定义加密Helper类续(4)

现在我们已经完成了通用的对称加密算法,我们只需一组加密和解密方法就可以随意的使用任意一种对称加密算法了,而不是为每个加密和解密算法编写相应的加密和解密方法。

 非对称加密算法

.NET Framework中提供四种非对称加密算法(DSA,ECDiffieHellman, ECDsa和RSA),它们都继承于抽象类AsymmetricAlgorithm,接下来我们将提供RSA算法的实现。

RSA加密算法是一种非对称和双钥加密算法,在公钥加密标准和电子商业中RSA被广泛使用。

在双钥加密的情况下,密钥有两把,一把是公开的公钥,还有一把是不公开的私钥。

双钥加密的原理如下:

a) 公钥和私钥是一一对应的关系,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立。

b) 所有的(公钥, 私钥)对都是不同的。

c) 用公钥可以解开私钥加密的信息,反之亦成立。

d) 同时生成公钥和私钥应该相对比较容易,但是从公钥推算出私钥,应该是很困难或者是不可能的。

现在的数字签名加密主要是使用RSA算法,什么是数字签名大家请点这里(中文)和这里(英文)。

现在我们知道RSA算法是使用公钥和密钥进行加密和解密,所以我们先定义一个方法来生成公钥和密钥。

/// <summary> /// Generates the RSA public and private key. /// </summary> /// <param>The algorithm to creates key.</param> /// <returns></returns> public static void GenerateRSAKey(RSACryptoServiceProvider algorithm) { // Contains public and private key. RSAPrivateKey = algorithm.ToXmlString(true); using (var streamWriter = new StreamWriter("PublicPrivateKey.xml")) { streamWriter.Write(RSAPrivateKey); } // Only contains public key. RSAPubicKey = algorithm.ToXmlString(false); using (var streamWriter = new StreamWriter("PublicOnlyKey.xml")) { streamWriter.Write(RSAPubicKey); } }

通过RSACryptoServiceProvider的ToXmlString()方法我们生成了一对公钥和密钥,当参数为true 表示同时包含 RSA 公钥和私钥,反之表示仅包含公钥。

/// <summary> /// Encrypts with the specified RSA algorithm. /// </summary> /// <param>A RSA object.</param> /// <param>The plain text to decrypt.</param> /// <param>The key.</param> /// <param>The encoding.</param> /// <returns></returns> public static string Encrypt(RSACryptoServiceProvider rsa, string plainText, string key, Encoding encoding) { if (null == rsa) throw new ArgumentNullException("rsa"); if (String.IsNullOrEmpty(plainText)) throw new ArgumentNullException("plainText"); if (String.IsNullOrEmpty(key)) throw new ArgumentNullException("key"); if (null == encoding) throw new ArgumentNullException("encoding"); string publicKey; // Reads public key. using (var streamReader = new StreamReader("PublicOnlyKey.xml")) { publicKey = streamReader.ReadToEnd(); } rsa.FromXmlString(publicKey); byte[] cipherBytes = rsa.Encrypt(plainText.ToBytesEncoding(encoding), true); rsa.Clear(); return cipherBytes.ToBase64String(); }

接着我们定义RSA的加密方法,首先我们从流中读取密钥和公钥,然后传递给FromXmlString()方法,最后对平文进行加密。

/// <summary> /// Decrypts with the specified RSA algorithm. /// </summary> /// <param>a RSA object.</param> /// <param>The cipher text to encrypt.</param> /// <param>The key.</param> /// <param>The encoding.</param> /// <returns></returns> public static string Decrypt(RSACryptoServiceProvider rsa, string cipherText, string key, Encoding encoding) { string privateKey; // Reads the private key. using (var streamReader = new StreamReader("PublicPrivateKey.xml")) { privateKey = streamReader.ReadToEnd(); } rsa.FromXmlString(privateKey); byte[] plainBytes = rsa.Decrypt(cipherText.FromBase64String(), true); rsa.Clear(); return plainBytes.FromByteToString(encoding); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjyyyp.html