【问题标题】:C# Rijandel File Decryption padding is invalid and cannot be removedC# Rijandel 文件解密填充无效且无法删除
【发布时间】:2017-03-11 22:08:39
【问题描述】:

我想从单个文件流中加密文件,但是当解密填充无效且无法删除时出现此错误,但如果我设置填充,加密和解密方法具有相同的填充。Zeros 不加密文件

  private static readonly byte[] SALT = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c };
    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes("TestKey", SALT);
    public bool EncryptFileP(string Path)
    {
        FileInfo IOF = new FileInfo(Path);
        WRStream = new FileStream(Path, FileMode.Open);

        CryptoStream cryptoStream;
        Rijndael rijndael = Rijndael.Create();

        rijndael.Key = pdb.GetBytes(16);
        rijndael.IV = pdb.GetBytes(16);

        rijndael.Mode = CipherMode.CBC;
        rijndael.Padding = PaddingMode.PKCS7;

        cryptoStream = new CryptoStream(WRStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);

        cryptoStream.Close();
        WRStream.Close();

        return true;
    }
    public bool DecryptFileP(string Path)
    {
        FileInfo IOF = new FileInfo(Path);
        WRStream = new FileStream(Path, FileMode.Open);

        CryptoStream cryptoStream;
        Rijndael rijndael = Rijndael.Create();

        rijndael.Key = pdb.GetBytes(16);
        rijndael.IV = pdb.GetBytes(16);

        rijndael.Mode = CipherMode.CBC;
        rijndael.Padding = PaddingMode.PKCS7;

        cryptoStream = new CryptoStream(WRStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write);

        cryptoStream.Close(); //error! padding is invalid and cannot be removed 
        WRStream.Close();


        return true;
    }

【问题讨论】:

  • 表示解密失败,至少有一个加密数据、IV、密钥或参数不正确或解密不正确。使用 PKCS#7 填充正确的东西使用。
  • 如果任何给定的答案解决了您的问题,您可以accept 其中一个。如果没有,请详细说明问题所在。

标签: c# encryption padding


【解决方案1】:

在我看来,您正在创建的流中缺少读写。

在某些时候要加密文件,您需要将要加密的纯文本数据写入您的cryptoStreamEncryptFileP,同样,当您解密时,您需要读回@987654323 @在DecryptFileP。这些流不会像您正在尝试那样加密/解密文件

【讨论】:

    【解决方案2】:

    你必须分别实例化Rfc2898DeriveBytes来进行加密和解密,因为它是有状态的。将Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes("TestKey", SALT); 移动到EncryptFilePDecryptFileP


    安全提示:

    IV 必须是不可预测的(阅读:随机)。不要使用静态 IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定之前发送相同消息前缀的时间。 IV 不是秘密,因此您可以将其与密文一起发送。通常,它只是简单地添加到密文中,并在解密之前被切掉。

    最好对您的密文进行身份验证,这样就不会像padding oracle attack 这样的攻击。这可以通过 GCM 或 EAX 等经过身份验证的模式或encrypt-then-MAC 方案来完成。

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多