如何在解密之前保护加密文件不被破坏

时间:2015-09-05 05:17:53

标签: c# vb.net encryption cryptography rijndael

我正在使用Rijndael算法加密pdf文件。加密和解密工作正常。加密会将pdf文件转换为扩展名为.key的文件。

问题是我能够在notepad中打开此文件(它显示一些Unicode字符)并破坏它。考虑以下情况:

我已打开文件并删除一些字符/添加一些字符save the notepad file。如果我将此文件传递给Decryption方法,我将把损坏的文件作为输出。我知道这种情况正在发生,因为在添加或删除文件中的字符时,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中尝试了这一点,以便将我的问题标记为两者。

2 个答案:

答案 0 :(得分: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验证,然后才解密
    3. 此外,如果这不是本地文件而是某种网络流,那么您必须在固定时间内进行验证 - 您不能使用正常的字节比较功能。这是因为时间攻击。但是对于本地文件,你可以做任何你喜欢的比较,因为没有时间攻击。

答案 1 :(得分:3)

您无法阻止任何人在他们喜欢的任何编辑器中打开文件并进行修改。将文件标记为只读可能会有所帮助,但无法解决问题。

您应该做的是生成加密文件的哈希值,然后在解密之前检查以确保该文件仍然生成相同的哈希值。如果没有,则表示文件已被篡改。