J'ai créé une classe pour le cryptage et le décryptage à l'aide d'AES..NET AES/Rijndael - décryptage incohérent lors de la réutilisation du décrypteur
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
}
Comme vous pouvez le voir, dans les deux cas, je suis écrit à un MemoryStream
via un CryptoStream
. Si je crée un nouveau décrypteur via m_provider.CreateDecyptor(s_key, s_iv)
à chaque appel à Decrypt
cela fonctionne très bien.
Qu'est-ce qui a mal tourné ici? Pourquoi le décrypteur se comporte-t-il comme si son IV était oublié? Y at-il quelque chose que l'appel à StreamReader.ReadToEnd()
fait qui aide m_decryptor
fonctionne correctement?
Je voudrais éviter l'une ou l'autre des deux approches «fonctionnantes» que j'ai énumérées ici, car il y a un coup de performance sur les deux et c'est un chemin très critique. Merci d'avance.
Veuillez écrire le code ** réel ** qui est en train de chiffrer et de déchiffrer. L'approche ne semble pas être problématique. –
Mis à jour avec la classe complète. – iamtyler