Шифрование AES без использования IV
https://msdn.microsoft.com/en-us/library/system.security.cryptography.aes(v=vs.110).aspx
Я планирую использовать AES для шифрования / дешифрования моих сообщений. Я не хочу использовать IV во время шифрования / дешифрования, потому что я уже защищаю свой Ключ в KeyVault, и я просто хочу передать только один Ключ другим сторонам, которые могут дешифровать мои сообщения.
Какие-либо предложения? Как я могу сделать IV как дополнительный / удаленный.
0 ответов
При шифровании генерируйте свой IV и предварительно ожидайте его в зашифрованном тексте.
Шифрование:
private string EncryptString(string plainText, byte[] Key)
{
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
using (Aes _aesAlg = Aes.Create())
{
_aesAlg.Key = Key;
ICryptoTransform _encryptor = _aesAlg.CreateEncryptor(_aesAlg.Key, _aesAlg.IV);
using (MemoryStream _memoryStream = new MemoryStream())
{
_memoryStream.Write(_aesAlg.IV, 0, 16);
using (CryptoStream _cryptoStream = new CryptoStream(_memoryStream, _encryptor, CryptoStreamMode.Write))
{
using (StreamWriter _streamWriter = new StreamWriter(_cryptoStream))
{
_streamWriter.Write(plainText);
}
return Convert.ToBase64String(_memoryStream.ToArray());
}
}
}
}
Дешифрирование:
private string DecryptString(string cipherText, byte[] Key)
{
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
string plaintext = null;
byte[] _initialVector = new byte[16];
byte[] _cipherTextBytesArray = Convert.FromBase64String(cipherText);
byte[] _originalString = new byte[_cipherTextBytesArray.Length - 16];
Array.Copy(_cipherTextBytesArray, 0, _initialVector, 0, 16);
Array.Copy(_cipherTextBytesArray, 16, _originalString, 0, _cipherTextBytesArray.Length - 16);
using (Aes _aesAlg = Aes.Create())
{
_aesAlg.Key = Key;
_aesAlg.IV = _initialVector;
ICryptoTransform decryptor = _aesAlg.CreateDecryptor(_aesAlg.Key, _aesAlg.IV);
using (MemoryStream _memoryStream = new MemoryStream(_originalString))
{
using (CryptoStream _cryptoStream = new CryptoStream(_memoryStream, decryptor, CryptoStreamMode.Read))
{
using (StreamReader _streamReader = new StreamReader(_cryptoStream))
{
plaintext = _streamReader.ReadToEnd();
}
}
}
}
return plaintext;
}
Ссылка: AES_algorithm_withoutIv.