2015-09-05 29 views
2

我正在使用Rijndael算法加密pdf文件。加密和解密工作正常。加密会将pdf文件转换为扩展名为.key的文件。如何在解密之前保护加密文件不被破坏

问题是我可以在notepad(它显示一些Unicode字符)打开此文件并损坏它。考虑到这种情况下:

我已经打开了文件,并删除一些字符/添加一些文字save the notepad file。如果我将这个文件传递给解密方法,我会将损坏的文件作为输出。我知道这是因为在添加或删除文件中的字符时byteStream变化(填充已更改)。

这里是我的问题:

有什么办法来解决这个问题?换句话说,禁止编辑加密文件?**

以下是方法我用了加密,

VB代码

Dim plainFile As String = basePath & "\cryptoText.pdf" 
    Dim password As String = "somePass" 
    Dim UE As New UnicodeEncoding() 
    Dim key As Byte() = UE.GetBytes(password) 
    Dim cryptFile As String = basePath & "\cryptoText.key" 
    Dim fsCrypt As New FileStream(cryptFile, FileMode.Create) 
    Dim RMCrypto As New RijndaelManaged() 
    Using csKey As New CryptoStream(fsCrypt, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write) 
     Dim FsIn As New FileStream(plainFile, FileMode.Open) 
     Dim data As Integer 
     While (data = FsIn.ReadByte()) <> -1 
       csKey.WriteByte(CByte(data)) 
     End While 
     FsIn.Close() 
    End Using 
    fsCrypt.Close() 

C#代码

string plainFile = basePath + "\\cryptoText.pdf"; 
    string password = "somePass"; 
    UnicodeEncoding UE = new UnicodeEncoding(); 
    byte[] key = UE.GetBytes(password); 
    string cryptFile = basePath + "\\cryptoText.key"; 
    FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create); 
    RijndaelManaged RMCrypto = new RijndaelManaged(); 
    using (CryptoStream csKey = new CryptoStream(fsCrypt, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write)) { 
     FileStream FsIn = new FileStream(plainFile, FileMode.Open); 
     int data = 0; 
     while ((data == FsIn.ReadByte()) != -1) { 
      csKey.WriteByte(Convert.ToByte(data)); 
     } 
     FsIn.Close(); 
    } 
    fsCrypt.Close(); 

备注:我已经试过了在c#和vb.net中,以便将我的问题标记为两者。

回答

4

答案是做两件事情,

  1. 加密,
  2. 添加HMAC到它(如使用相同的密钥SHA256),对加密的数据,并将其钉到CryptoStream的
  3. 的端部

https://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha256%28v=vs.110%29.aspx

然后当你解密,你

  1. 验证HMAC是有效的,
  2. IFF#1验证,然后才把解密

而且,如果这不是本地文件,但某种形式的网络数据流,那么你要做的核查时间不变 - 你不能使用正常的字节比较函数。这是因为计时攻击。但对于本地文件,由于没有定时攻击,您可以进行任何比较。

+0

感谢您的建议和信息链接 –

+0

请注意,这*不*保护文件免受损坏,它只是检测损坏的文件,所以你可以采取行动。这基本上是“防篡改”与“防篡改”之间的区别。 “防篡改”的方式是禁止对文件进行写入访问。 –

+0

请注意,上述方案尚未受到重播攻击的保护(此评论和上述评论不会使答案无效,他们只是添加安全相关信息)。 –

3

你无法真正阻止任何人在任何他们需要的编辑器中打开文件并修改它。将文件标记为只读可能会有所帮助,但不会解决问题。

你应该做的是生成加密文件的散列,然后在解密之前检查以确保文件仍然生成相同的散列。如果没有,你知道该文件已被篡改。

+0

好的,但我怎么能做到这一点? –

+0

@不幸运看到其他答案:) – StillLearnin

+0

另一个答案将要求您存储(静态)HMAC密钥和文件的认证标签。这个答案将要求你在文件被篡改之前,先存储文件的散列(与文件分开)。所以我不认为这些答案在这个意义上是相同的。 –