【问题标题】:AES Decrypting c#AES解密c#
【发布时间】:2017-06-30 18:55:40
【问题描述】:

我试图解密字节,但在read = cryptoStream.Read(buffer, 0, len);inputFile.lenght = 4256, len = 4256 行中有错误“length of data to decrypt is invalid

这是解密代码

        byte[] salt = new byte[32];

        FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);

        fsCrypt.Seek(fsCrypt.Length - 376, SeekOrigin.Begin);
        fsCrypt.Read(salt, 0, salt.Length);
        byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
        RijndaelManaged AES = new RijndaelManaged();
        AES.KeySize = 256;
        AES.BlockSize = 128;
        var key = new Rfc2898DeriveBytes(passwordBytes, salt, 50000);
        AES.Key = key.GetBytes(AES.KeySize / 8);
        AES.IV = key.GetBytes(AES.BlockSize / 8);
        AES.Padding = PaddingMode.PKCS7;
        AES.Mode = CipherMode.CFB;
        int read;
        byte[] buffer = new byte[1048576];
        List < byte > bytes = new List < byte > ();

        fsCrypt.Seek(0, SeekOrigin.Begin);
        read = 1;
        var len = Convert.ToInt32(fsCrypt.Length);

        MemoryStream mem = new MemoryStream();
        fsCrypt.CopyTo(mem);
        mem.Position = 0;
        using(CryptoStream cryptoStream = new CryptoStream(mem, AES.CreateDecryptor(), CryptoStreamMode.Read)) // CryptoStream cryptoStream = new CryptoStream(fsCrypt, AES.CreateDecryptor(), CryptoStreamMode.Read
         {
          //var buffer2 = new byte[len];
          while ((read = cs.Read(buffer, 0, buffer.Length)) > 0) {
           foreach(var m in buffer)
           bytes.Add(m);
          }
         }

你能帮帮我吗?这段代码有什么问题?

我以AES encryption on large files为例

我如何加密:

byte[] salt = GenerateRandomSalt();


 //convert password string to byte arrray
 byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password);

 //Set Rijndael symmetric encryption algorithm 71 246
 RijndaelManaged AES = new RijndaelManaged();
 AES.KeySize = 256;
 AES.BlockSize = 128;
 AES.Padding = PaddingMode.PKCS7;


 var key = new Rfc2898DeriveBytes(passwordBytes, salt, 50000);
 AES.Key = key.GetBytes(AES.KeySize / 8);
 AES.IV = key.GetBytes(AES.BlockSize / 8);

 AES.Mode = CipherMode.CFB;
 var kk = key.ToString();


 FileStream fsIn = new FileStream(inputFile, FileMode.Open);


 byte[] buffer = new byte[1048576];
 int read = 0;



 byte[] encrypted;
 using(MemoryStream msEncrypt = new MemoryStream()) {
  using(CryptoStream csEncrypt = new CryptoStream(msEncrypt, AES.CreateEncryptor(), CryptoStreamMode.Write)) {
   fsIn.Seek(0, SeekOrigin.Begin);

   while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0) {
    csEncrypt.Write(buffer, 0, read);
   }
   encrypted = msEncrypt.ToArray();
  }
 }

 fsIn.Seek(0, SeekOrigin.Begin);
 fsIn.Write(encrypted, 0, encrypted.Length);

 fsIn.Seek(fsIn.Length, SeekOrigin.Begin);
 fsIn.Write(salt, 0, salt.Length);

【问题讨论】:

  • 你解密的数据长度不对
  • @JoePhillips 我添加了我如何编码文件的代码,你可以检查一下

标签: c# encryption aes


【解决方案1】:

您在加密时调用encrypted = msEncrypt.ToArray(); 过早,它必须在csEncrypt 的 using 语句结束之后,因此所有数据都会被刷新到内存流中。

在你的解密过程中,你也开始在文件的早期阶段

fsCrypt.Seek(fsCrypt.Length - 376, SeekOrigin.Begin); 应该是 fsCrypt.Seek(fsCrypt.Length - 32, SeekOrigin.Begin);,如果你写出来时你的 salt.Length 是 32。

最后,在将盐传递给mem 之前,您也不要修剪盐,因此您会将盐数据与密文一起传递到流中,这会使您的消息过长。

【讨论】:

  • 我在using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, AES.CreateEncryptor(), CryptoStreamMode.Write)) link 之后移动了encrypted = msEncrypt.ToArray(); 行,但是再次解密时出现错误
  • 非常感谢,不要告诉我如何从流中减少盐分?
  • ty,我写了这个fsCrypt.SetLength(fsCrypt.Length-32); 并且没有错误地解码,但是我在文本后面有很多空间,在记事本++ 中显示“NULL”link
  • 哦,我想我明白了
  • 是的,“NULL”我修复了,但现在添加到末尾“OЩ-ЖмЕЦФ»r'Іціъ”
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 2013-08-12
  • 2013-08-11
相关资源
最近更新 更多