【问题标题】:How Can I Protect Encrypted Files From Being Corrupted Before Decryption在解密之前如何保护加密文件不被损坏
【发布时间】:2015-09-05 05:17:52
【问题描述】:

我正在使用 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 中尝试过,所以我将我的问题标记到两者。

【问题讨论】:

    标签: c# vb.net encryption cryptography rijndael


    【解决方案1】:

    答案是做两件事,

    1. 加密,
    2. 在加密数据上添加 HMAC(如使用相同密钥的 SHA256),并将其附加到加密流的末尾

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

    那么当你解密时,你

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

    此外,如果这不是本地文件而是某种网络流,那么您必须在恒定时间内进行验证 - 您不能使用正常的字节比较功能。这是因为定时攻击。但是对于本地文件,你可以做任何你喜欢的比较,因为没有时间攻击。

    【讨论】:

    • 请注意,这保护文件免受损坏,它只是检测损坏的文件,以便您可以对其采取行动。这基本上是“防篡改”与“防篡改”之间的区别。 “防篡改”的方法是禁止对文件的写访问。
    • 请注意,上述方案尚未针对重放攻击提供保护(此评论和上述评论不会使答案无效,它们只是向其添加安全相关信息)。
    【解决方案2】:

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

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

    【讨论】:

    • @un-lucky 看到另一个答案:)
    • 另一个答案将要求您存储(静态)HMAC 密钥和文件(或文件中)的身份验证标签。这个答案将要求您在文件被篡改之前存储文件的哈希值(与文件分开)。所以我不认为这些答案在这个意义上是相同的。
    • @MaartenBodewes True.
    猜你喜欢
    • 1970-01-01
    • 2016-06-05
    • 2011-08-29
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多