/// <summary> /// /// </summary> /// <param name="secretKey"></param> /// <param name="plainData"></param> /// <returns></returns> public static ProtectedMemory EncryptData(ProtectedString secretKey, ProtectedMemory plainData) { ProtectedMemory returnValue = null; System.Byte[] encryptedData = null; #region Check protection of secret key if (!secretKey.IsProtected) { throw new UnsecureException(); } #endregion #region Check protection of plain data if (!plainData.IsProtected) { throw new UnsecureException(); } #endregion #region Prepare encryption provider // Unprotect memory containing secret key secretKey.Unprotect(); // Create encryption provider System.Security.Cryptography.SymmetricAlgorithm encryptionProvider = System.Security.Cryptography.Aes.Create(); encryptionProvider.Mode = System.Security.Cryptography.CipherMode.CBC; encryptionProvider.Key = secretKey.GetBytes(); encryptionProvider.GenerateIV(); // Reprotect memory containing secret key secretKey.Protect(); #endregion // Create encryptor System.Security.Cryptography.ICryptoTransform encryptor = encryptionProvider.CreateEncryptor(encryptionProvider.Key, encryptionProvider.IV); // Create handle to stream data into memory using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream()) { // Write IV to temp memory (IV length is static => 16 ) memoryStream.Write(encryptionProvider.IV, 0, 16); // Create handle for data encryption; data streamed to this stream will be automatically encrypted and streamed to memory using (System.Security.Cryptography.CryptoStream cryptoStream = new System.Security.Cryptography.CryptoStream(memoryStream, encryptor, System.Security.Cryptography.CryptoStreamMode.Write)) { // Create handle to write data to a stream; data written to this stream will be automatically encrypted and streamed to memory using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(cryptoStream)) { // Unprotect plain data plainData.Unprotect(); #region Write and encrypt plain data to temp memory foreach (System.Byte b in plainData.GetBytes()) { streamWriter.Write((System.Char)b); } #endregion // Reprotect plain data plainData.Protect(); } } // Save content of temp memory in temp buffer encryptedData = memoryStream.ToArray(); } // Dispose encryptor encryptor.Dispose(); // Dispose encryption provider encryptionProvider.Dispose(); #region Save cyphered data in protected memory // Create protected memory for cyphered data returnValue = new ProtectedMemory(encryptedData.Length); // Unprotect memory for cyphered data returnValue.Unprotect(); // Copy cyphered data in encrypted memory for (System.Int32 i = 0; i < encryptedData.Length; i++) { returnValue.SetByte(i, encryptedData[i]); } // Reprotect memory with cyphered data returnValue.Protect(); #endregion return(returnValue); }
public override void GenerateIV() { _symmetricAlgorithm.GenerateIV(); }