2013-12-17 18 views
0

Я не совсем уверен, как это объяснить, поэтому я добавлю свой код и попытаюсь с ним работать. Как вы видите, это вряд ли соответствует общим стандартам программирования. Я пытаюсь удалить всю «случайность» из ключа и iv поколения, поэтому я предоставил свою собственную строку и соответствующим образом добавил ее в значения AES.Шифрование и дешифрование AES

Как только это значение зашифровано, я конвертирую его в строку и сохраняю в базе данных в качестве параметра пароля. Моя проблема заключается в возможности расшифровать его обратно до исходного значения пароля, которое необходимо позже для некоторых веб-запросов. Я попытался преобразовать значение строки обратно в массив байтов, но получаю ошибку «Недопустимый размер блока», за которым следует «Bad PKCS7 padding. Недопустимая длина 250». Не знаю, что это значит.

Любые идеи?

static public void Main() 
{ 
    string original ="{password for testing purposes}"; 
    string originalkey = "{128 key}"; 
    string originaliv = "{16 iv}"; 


    byte[] enckey = Encoding.UTF8.GetBytes(originalkey); 
    byte[] enciv = Encoding.UTF8.GetBytes(originaliv); 

    using (AesManaged myAes = new AesManaged()) 
    { 
     myAes.Key = enckey;    
     myAes.IV = enciv; 
     byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV); 
     string result = Encoding.UTF8.GetString(encrypted); 

     string roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV); 


     Console.WriteLine("Encrypted: {0}", result); 
     Console.WriteLine("Round Trip: {0}", roundtrip); 


     byte[] decrypted = Encoding.UTF8.GetBytes(result); 

     roundtrip = DecryptStringFromBytes_Aes(decrypted, myAes.Key, myAes.IV); 


     Console.WriteLine("Encrypted: {0}", roundtrip); 
     Console.WriteLine("Round Trip: {0}", result); 

    } 
     } 
+0

Просто кодирующий ваши байты [] массив блобы в строку может дать вам несколько вопросов, - это мог бы содержат нулевые байты, это может привести к неправильной обработке символов базой данных (в зависимости от конфигурации БД). Постарайтесь придерживаться кодировки, где текстовое кодирование не будет мешать строке (например, строки с шестнадцатеричными значениями байтов или кодировкой Base64) – elgonzo

ответ

3

Вы берете двоичные, нетекстовые данные и преобразуете их в строку, а затем пытаетесь вернуть их обратно в двоичные данные. Если вы хотите сохранить строковое представление зашифрованных данных, я бы предложил использовать алгоритм кодирования с двоичным кодом, такой как кодировка Base64 (см. An efficient way to Base64 encode a byte array?).

Если вы можете сохранить его как двоичный (например, в столбце varbinary SQL Server), вы можете полностью пропустить кодировку строки.

byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV); 
roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV); 

Console.WriteLine("Original: {0}", original); 
Console.WriteLine("Decrypted: {0}", roundtrip); 
3

Проблема заключается в кодировке, которую вы используете. Предполагается, что массив байтов - это строка UTF8, и я не уверен, что это так. Используя ответ Jon тарелочек из this question, я бы следующие для преобразования вашего массива байт в строку и обратно:

string result = Convert.ToBase64String(encrypted); 
... 
byte[] decrypted = Convert.FromBase64String(result); 
Смежные вопросы