private void SetContentKeyFromHeader(byte[] headerBytes) { var decryptedBytes = new byte[headerBytes.Length]; using (MemoryStream inStream = new MemoryStream(headerBytes)) { using (CryptoStream decryptStream = new CryptoStream(inStream, HeaderCryptoProvider.CreateDecryptor(), CryptoStreamMode.Read)) { if (decryptStream.Read(decryptedBytes, 0, decryptedBytes.Length) == decryptedBytes.Length) { var key = new byte[ContentCryptoProvder.Key.Length]; var iv = new byte[ContentCryptoProvder.IV.Length]; Array.ConstrainedCopy(decryptedBytes, GetKeyHeaderOffset(), key, 0, key.Length); Array.ConstrainedCopy(decryptedBytes, GetIVHeaderOffset(), iv, 0, iv.Length); ContentCryptoProvder.Key = key; ContentCryptoProvder.IV = iv; } } } }
private byte[] GetEncryptedHeaderBytes() { var contentKeyBytes = GetClearHeader(); var encryptedContentKeyBytes = new byte[PasswordKeyHash.Length + HeaderCryptoProvider.IV.Length + contentKeyBytes.Length]; using (MemoryStream buffStream = new MemoryStream(encryptedContentKeyBytes)) { //write the password hash to the buffer for password validation buffStream.Write(PasswordKeyHash, 0, PasswordKeyHash.Length); //write the header IV to the buffer for header decryption buffStream.Write(HeaderCryptoProvider.IV, 0, HeaderCryptoProvider.IV.Length); using (CryptoStream csEncrypt = new CryptoStream(buffStream, HeaderCryptoProvider.CreateEncryptor(), CryptoStreamMode.Write)) { csEncrypt.Write(contentKeyBytes, 0, contentKeyBytes.Length); } } return(encryptedContentKeyBytes); }