/// <summary> /// Serializes data. /// </summary> /// <typeparam name="_T">data type to be serialized</typeparam> /// <param name="dataToSerialize">data to be serialized</param> /// <returns>serialized data</returns> public object Serialize <_T>(_T dataToSerialize) { using (EneterTrace.Entering()) { byte[][] aData = new byte[3][]; // Generate random key for AES. AesManaged anAes = new AesManaged(); anAes.KeySize = myAesBitSize; anAes.GenerateIV(); anAes.GenerateKey(); // Serialize data with AES using the random key. AesSerializer anAesSerializer = new AesSerializer(anAes.Key, anAes.IV, myUnderlyingSerializer); aData[2] = (byte[])anAesSerializer.Serialize <_T>(dataToSerialize); // Encrypt the random key with RSA using the public key. // Note: Only guy having the private key can decrypt it. RSACryptoServiceProvider aCryptoServiceProvider = new RSACryptoServiceProvider(); aCryptoServiceProvider.ImportParameters(myPublicKey); aData[0] = aCryptoServiceProvider.Encrypt(anAes.Key, false); aData[1] = aCryptoServiceProvider.Encrypt(anAes.IV, false); // Serialize encrypted data, key and iv with the underlying serializer. object aSerializedData = myUnderlyingSerializer.Serialize <byte[][]>(aData); return(aSerializedData); } }
/// <summary> /// Deserializes data. /// </summary> /// <typeparam name="_T">data type to be deserialized</typeparam> /// <param name="serializedData">serialized data</param> /// <returns>deserialized data type</returns> public _T Deserialize <_T>(object serializedData) { using (EneterTrace.Entering()) { // Deserialize data byte[][] aData = myUnderlyingSerializer.Deserialize <byte[][]>(serializedData); // Use the private key to decrypt the key and iv for the AES. RSACryptoServiceProvider aCryptoServiceProvider = new RSACryptoServiceProvider(); aCryptoServiceProvider.ImportParameters(myPrivateKey); byte[] aKey = aCryptoServiceProvider.Decrypt(aData[0], false); byte[] anIv = aCryptoServiceProvider.Decrypt(aData[1], false); // Decrypt data content which its encrypted with AES. AesSerializer anAes = new AesSerializer(aKey, anIv, myUnderlyingSerializer); _T aDeserializedData = anAes.Deserialize <_T>(aData[2]); return(aDeserializedData); } }