【发布时间】:2010-07-29 20:48:57
【问题描述】:
我创建了一个使用 AES 进行加密和解密的类。
public class AesEncryptionProvider {
#region Fields
// Encryption key
private static readonly byte[] s_key = new byte[32] {
// Omitted...
};
// Initialization vector
private static readonly byte[] s_iv = new byte[16] {
// Omitted...
};
private AesCryptoServiceProvider m_provider;
private ICryptoTransform m_encryptor;
private ICryptoTransform m_decryptor;
#endregion
#region Constructors
private AesEncryptionProvider () {
m_provider = new AesCryptoServiceProvider();
m_encryptor = m_provider.CreateEncryptor(s_key, s_iv);
m_decryptor = m_provider.CreateDecryptor(s_key, s_iv);
}
static AesEncryptionProvider () {
Instance = new AesEncryptionProvider();
}
#endregion
#region Properties
public static AesEncryptionProvider Instance { get; private set; }
#endregion
#region Methods
public string Encrypt (string value) {
if (string.IsNullOrEmpty(value)) {
throw new ArgumentException("Value required.");
}
return Convert.ToBase64String(
Transform(
Encoding.UTF8.GetBytes(value),
m_encryptor));
}
public string Decrypt (string value) {
if (string.IsNullOrEmpty(value)) {
throw new ArgumentException("Value required.");
}
return Encoding.UTF8.GetString(
Transform(
Convert.FromBase64String(value),
m_decryptor));
}
#endregion
#region Private methods
private byte[] Transform (byte[] input, ICryptoTransform transform) {
byte[] output;
using (MemoryStream memory = new MemoryStream()) {
using (CryptoStream crypto = new CryptoStream(
memory,
transform,
CryptoStreamMode.Write
)) {
crypto.Write(input, 0, input.Length);
crypto.FlushFinalBlock();
output = memory.ToArray();
}
}
return output;
}
#endregion
}
如您所见,在这两种情况下,我都通过CryptoStream写给MemoryStream。如果我在每次调用Decrypt 时通过m_provider.CreateDecyptor(s_key, s_iv) 创建一个新的解密器,它就可以正常工作。
这里出了什么问题?为什么解密器表现得好像忘记了 IV?对StreamReader.ReadToEnd() 的调用是否有助于m_decryptor 正常运行?
我想避免我在此处列出的两种“有效”方法中的任何一种,因为这两种方法都会影响性能,这是一条非常关键的路径。提前致谢。
【问题讨论】:
-
请发布实际加解密代码。这种方法听起来没有问题。
标签: .net encryption aes rijndael