2017-02-03 3 views
0

Я пытаюсь зашифровать string и описать его с помощью AES. Шифрование работало нормально, но я получаю сообщение об ошибке The input data is not a complete block. Есть ли проблема с моим дополнением?Расшифровка AES Входные данные не являются полным блоком

var aes = System.Security.Cryptography.Aes.Create(); 
aes.GenerateKey(); 
aes.GenerateIV(); 
aes.Mode = CipherMode.CBC; 
aes.Padding = PaddingMode.PKCS7; 

var desEncrypter = aes.CreateEncryptor(); 
var buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(text); 

finalV = Convert.ToBase64String(desEncrypter.TransformFinalBlock(buffer, 0, buffer.Length)); 

var desDecrypter = aes.CreateDecryptor(); 
var buff = System.Text.Encoding.ASCII.GetBytes(finalV); 

var origValue = desDecrypter.TransformFinalBlock(buff , 0, buff .Length); 

ответ

4

Вы создаете finalV путем преобразования байтов в Base64. Чтобы превратить это обратно в байты, вам нужно позвонить Convert.FromBase64String(finalV).

Вы вызываете ASCII.GetBytes(finalV), что дает вам байты, представляющие этот текст Base64, а не исходные байты.

EDIT

Не знаю, где вы застрять, но здесь работает код, основанный на ваших, так что вы можете дифф это и увидеть, где вы получаете ошибку:

string text = "ABC"; 

var aes = System.Security.Cryptography.Aes.Create(); 
aes.GenerateKey(); 
aes.GenerateIV(); 
aes.Mode = CipherMode.CBC; 
aes.Padding = PaddingMode.PKCS7; 

var desEncrypter = aes.CreateEncryptor(); 
var buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(text); 

var finalV = Convert.ToBase64String(desEncrypter.TransformFinalBlock(buffer, 0, buffer.Length)); 

var desDecrypter = aes.CreateDecryptor(); 
var buff = Convert.FromBase64String(finalV); 

var origValue = desDecrypter.TransformFinalBlock(buff, 0, buff.Length); 
string result = Encoding.ASCII.GetString(origValue); 
Console.WriteLine(result); 
+0

Спасибо, я исправил это. Теперь я могу преобразовать дешифрованное значение в 'byte []'. Кажется, я не могу преобразовать это в строку. Я попытался вызвать 'System.Text.Encoding.UTF8.GetString()', который должен принимать 'byte []', но я все еще получаю эту ошибку. – mysticalstick

+0

Ваш 'buff' не имеет никакого значения в качестве строки. Это encypted текст. Предполагая, что ваш код шифрования в порядке, тогда 'origValue' представляет ваше расшифрованное значение. Предполагая, что изначально была строка, это тот, который вам нужно вызвать: 'string decryptedText = Encoding.UTF8.GetString (origValue)'. –

+0

yes Я пробовал это, но получаю сообщение 'не может неявно преобразовать из строки в байт []'. Я напечатал тип 'origValue', чтобы проверить это раньше, и это' System.byte [] 'Я не знаю, откуда может возникнуть ошибка типа. – mysticalstick