使用 C# 的 Rijndael ManagedEncryption 方法






4.87/5 (16投票s)
使用 C# .NET 加密或不加密
引言
本示例演示如何使用 .NET 版本 1.1 以来提供的 RijndaelManaged
类。
使用方法
使用 .NET 进行加密非常简单。为此,我们使用 RijnDaelManaged
类。我们需要通过调用
来初始化此类。创建类后,我们需要通过创建名为 NewRijndaelManaged(
)Rfc2898DeriveBytes
的类来创建我们的密钥,如下所示:Rfc2898DeriveBytes(Inputkey, salt)
。此类的构造函数需要 2 个输入参数:密码和盐值。在下面的代码中,我们使用两个 GUID 作为密码和盐值。
当使用以下文本“My super secret text
”调用 EncryptRijndael(string text)
函数时,这将产生以下 string
“sBJUwV7Vo+ou9kYds6HfqFRHLcGf5MLiRUZk8ICt9h8=
”。要解密此 string
,我们调用 DecryptRijndael(string cipherText)
,它将返回原始文本。为了让一切都超级简单,我将所有内容包装在一个简单的 static
类中,该类完成所有工作(需要做的少量工作)。
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
namespace RijndaelManagedEncryption
{
public class RijndaelManagedEncryption
{
#region Consts
/// <summary>
/// Change the Inputkey GUID when you use this code in your own program.
/// Keep this inputkey very safe and prevent someone from decoding it some way!!
/// </summary>
internal const string Inputkey = "560A18CD-6346-4CF0-A2E8-671F9B6B9EA9";
#endregion
#region Rijndael Encryption
/// <summary>
/// Encrypt the given text and give the byte array back as a BASE64 string
/// </summary>
/// <param name="text" />The text to encrypt
/// <param name="salt" />The pasword salt
/// <returns>The encrypted text</returns>
public static string EncryptRijndael(string text, string salt)
{
if (string.IsNullOrEmpty(text))
throw new ArgumentNullException("text");
var aesAlg = NewRijndaelManaged(salt);
var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
var msEncrypt = new MemoryStream();
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
using (var swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(text);
}
return Convert.ToBase64String(msEncrypt.ToArray());
}
#endregion
#region Rijndael Dycryption
/// <summary>
/// Checks if a string is base64 encoded
/// </summary>
/// <param name="base64String" />The base64 encoded string
/// <returns>Base64 encoded stringt</returns>
public static bool IsBase64String(string base64String)
{
base64String = base64String.Trim();
return (base64String.Length%4 == 0) &&
Regex.IsMatch(base64String, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None);
}
/// <summary>
/// Decrypts the given text
/// </summary>
/// <param name="cipherText" />The encrypted BASE64 text
/// <param name="salt" />The pasword salt
/// <returns>The decrypted text</returns>
public static string DecryptRijndael(string cipherText, string salt)
{
if (string.IsNullOrEmpty(cipherText))
throw new ArgumentNullException("cipherText");
if (!IsBase64String(cipherText))
throw new Exception("The cipherText input parameter is not base64 encoded");
string text;
var aesAlg = NewRijndaelManaged(salt);
var decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
var cipher = Convert.FromBase64String(cipherText);
using (var msDecrypt = new MemoryStream(cipher))
{
using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (var srDecrypt = new StreamReader(csDecrypt))
{
text = srDecrypt.ReadToEnd();
}
}
}
return text;
}
#endregion
#region NewRijndaelManaged
/// <summary>
/// Create a new RijndaelManaged class and initialize it
/// </summary>
/// <param name="salt" />The pasword salt
/// <returns></returns>
private static RijndaelManaged NewRijndaelManaged(string salt)
{
if (salt == null) throw new ArgumentNullException("salt");
var saltBytes = Encoding.ASCII.GetBytes(salt);
var key = new Rfc2898DeriveBytes(Inputkey, saltBytes);
var aesAlg = new RijndaelManaged();
aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);
aesAlg.IV = key.GetBytes(aesAlg.BlockSize / 8);
return aesAlg;
}
#endregion
}
}
为了测试上面的类,我添加了一个示例程序,如下所示
历史
- 2013-12-31 - 首次版本
- 2013-01-02 - 版本 1.1,更改了代码,以便可以使用随机生成的盐值