2013-12-16 4 views
1

у меня есть следующие вспомогательные функции для сериализации мои объекты в зашифрованном массив байтов, а также для десериализации из расшифрованного массива байтовшифрования и дешифрования массива байтов

//encryption key 
public static byte[] Key = new byte[]{0x43, 0x72, 0x6e, 0x6d, 0x54, 0x4d, 0x65, 
             0x94, 0x16, 0x32, 0x44, 0x84, 0x7e, 0x18, 
             0x64, 0x76, 0x6e, 0x63, 0x64, 0x7a, 0x5f, 
             0x84, 0x7f, 0x9a}; 

//Decrypt byte[] 
public static byte[] Decrypt(byte[] data) 
{ 
    MemoryStream ms = new MemoryStream(); 
    Rijndael alg = Rijndael.Create(); 
    alg.Key = Key; 
    CryptoStream cs = new CryptoStream(ms, 
    alg.CreateDecryptor(), CryptoStreamMode.Write); 
    cs.Write(data, 0, data.Length); 
    cs.Close(); 
    byte[] decryptedData = ms.ToArray(); 
    return decryptedData; 
} 

//Encrypt byte[] 
public static byte[] Encrypt(byte[] data) 
{ 
    MemoryStream ms = new MemoryStream(); 
    Rijndael alg = Rijndael.Create(); 
    alg.Key = Key; 
    CryptoStream cs = new CryptoStream(ms, 
    alg.CreateEncryptor(), CryptoStreamMode.Write); 
    cs.Write(data, 0, data.Length); 
    cs.Close(); 
    byte[] encryptedData = ms.ToArray(); 
    return encryptedData; 
} 

//serialize object to memory stream 
public static MemoryStream SerializeToStream(object o) 
{ 
    MemoryStream stream = new MemoryStream(); 
    IFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, o); 
    return stream; 
} 

//deserialize object from memory stream 
public static T DerializeFromStream<T>(MemoryStream memoryStream) where T : new() 
{ 
    if (memoryStream == null) { return new T(); } 
    T o; 
    BinaryFormatter binaryFormatter = new BinaryFormatter(); 
    using (memoryStream) 
    { 
     memoryStream.Seek(0, SeekOrigin.Begin); 
     o = (T)binaryFormatter.Deserialize(memoryStream); 
    } 
    return o; 
} 

и вот тест, используя вышеуказанные функции полезности

//serialize to stream then to byte array 
var obj = new SomeObject(); 
var bytes = SerializeToStream(obj).ToArray(); 
bytes = Encrypt(bytes); 

//deserialize to decrypted byte array then to stream then to object 
var memoryStream = new MemoryStream(); 
var Decryptedbytearray = Decrypt(bytes); 
//fille the stream 
memoryStream.Write(Decryptedbytearray, 0, Decryptedbytearray.Length); 
//deserialize the object from the stream 
//it fails here giving an exception saying the binary data is not valid 
var obj2 = DerializeFromStream<SomeObject>(memoryStream); 

проблема возникает при десериализации объекта, см. Прокомментированную последнюю строку, что я делаю неправильно?

+0

Вы пытались его отладить? – MarcinJuraszek

+0

@MarcinJuraszek, конечно, но я получаю недействительные двоичные данные при десериализации, сериализованная часть работает нормально до сих пор – FPGA

ответ

3

Если вы отлаживаете свой код, вы увидите, что он не дешифрует правильно. Причина в том, что вам нужно использовать не только тот же key, но и тот же IV.

От MSDN:

Свойство IV является автоматически устанавливается новое случайное значение каждый раз, когда вы создаете новый экземпляр одного из классов SymmetricAlgorithm или при ручном вызове метода GenerateIV. Размер собственности IV должен быть таким же, как свойство BlockSize, деленное на 8.

Посмотри на this question подробности о том, как создать ключ и IV из ключевой фразы.

+0

теперь отлично работает, спасибо большое – FPGA

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