2015-07-06 3 views
0

Не понимаю, почему приведенный ниже код не работает.Шифрование/Расшифровка не возвращает исходную длину данных

public string Encrypt(System.Byte value) 
{ 
    return Convert.ToBase64String(Encrypt(BitConverter.GetBytes(value))); 
} 

public bool Decrypt(string encryptedValue, out System.Byte value) 
{ 
    byte[] data = Decrypt(Convert.FromBase64String(encryptedValue)); 
    if (data.Length != sizeof(System.Byte)) // <===== THIS IS TRUE!!! 
    { 
     value = default(System.Byte); 
     return false; 
    } 
    value = data[0]; 
    return true; 
} 

В частности, byte массив, возвращаемый из Decrypt(byte[], out byte) имеет длину 2 байта, вместо ожидаемого 1 байт в длину.

Обратите внимание, что второй байт всегда равен нулю, а первый байт имеет правильное значение. Поэтому я могу заставить код работать, просто беря первый байт. Но кто-нибудь знает, почему я получаю дополнительный байт. Я предполагаю, что это может быть связано с Convert.FromBase64String.

Ниже приведены мои базовые методы Encrypt и Decrypt.

public virtual byte[] Encrypt(byte[] data) 
{ 
    using (Rijndael algorithm = Rijndael.Create()) 
    using (ICryptoTransform encryptor = algorithm.CreateEncryptor(Key.KeyString, Key.KeyBytes)) 
    { 
     MemoryStream ms = new MemoryStream(); 
     using (Stream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
     { 
      cs.Write(data, 0, data.Length); 
     } 
     return ms.ToArray(); 
    } 
} 

public virtual byte[] Decrypt(byte[] data) 
{ 
    using (Rijndael algorithm = Rijndael.Create()) 
    using (ICryptoTransform decryptor = algorithm.CreateDecryptor(Key.KeyString, Key.KeyBytes)) 
    { 
     MemoryStream ms = new MemoryStream(); 
     using (Stream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) 
     { 
      cs.Write(data, 0, data.Length); 
     } 
     return ms.ToArray(); 
    } 
} 
+0

Почему 'data.Length == sizeof (byte)'? sizeof, вероятно, возвращает 1 все время ... –

+0

Для этого метода он должен всегда возвращать 1, потому что это размер дешифрованных данных (байт). –

ответ

2

Метод BitConverter.GetBytes не обеспечивает перегрузку, которая принимает byte. Я предполагаю, что он продвигает его в (2 байт) ushort, а затем шифрует его, следовательно, получается 2 байта при расшифровке.

+0

Молодцы. Это именно то, что происходило. Я полностью пропустил это. Благодаря! –

Смежные вопросы