Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# rijndael解密文件;要解密的数据长度无效";_C#_Encryption - Fatal编程技术网

C# rijndael解密文件;要解密的数据长度无效";

C# rijndael解密文件;要解密的数据长度无效";,c#,encryption,C#,Encryption,我尝试为基于rijndael和CBC的文件构建一个简单的De/En加密类。加密就像一个魔咒,但当我试图读取数据时,它总是给我“要解密的数据长度无效”。关于Stackoverflow的大多数问题的答案都是“您忘记刷新最后一个块了”,或者在解密或加密时使用正确的填充,这通常是解决方案,但在我的情况下不是。(我希望如此) 我优雅地接受我代码中的每一个解决方案或优化。也许加密并没有真正发挥出魅力。。。您是否尝试过用其他软件加密或解密您的文件?您可以使用软件X进行加密,然后让您的代码解密,或者反之亦然,以

我尝试为基于rijndael和CBC的文件构建一个简单的De/En加密类。加密就像一个魔咒,但当我试图读取数据时,它总是给我“要解密的数据长度无效”。关于Stackoverflow的大多数问题的答案都是“您忘记刷新最后一个块了”,或者在解密或加密时使用正确的填充,这通常是解决方案,但在我的情况下不是。(我希望如此)


我优雅地接受我代码中的每一个解决方案或优化。

也许加密并没有真正发挥出魅力。。。您是否尝试过用其他软件加密或解密您的文件?您可以使用软件X进行加密,然后让您的代码解密,或者反之亦然,以验证错误所在。在加密然后解密文件时,您的代码似乎工作正常,将从
encrypt()
返回的
密钥对立即传递到
decrypt()
。这表明在您的测试中,解密方法使用的密钥/IV与最初加密数据时使用的密钥/IV不同。
    public int BlockSize { get; set; } = 128;
    public int IVSize { get; set; } = 256;

public Stream Decrypt(KeyPair pair, string file)
    {
        if (pair?.IV == null || pair.Key == null)
        {
            throw new ArgumentException("Key missing");
        }

        var returningStream = new MemoryStream();
        using (var myRij = new RijndaelManaged())
        {
            myRij.IV = pair.IV;
            myRij.Key = pair.Key;
            myRij.Mode = CipherMode.CBC;
            myRij.Padding = PaddingMode.PKCS7;
            var decrypt = myRij.CreateDecryptor();

            using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
            using (var cryptoStream = new CryptoStream(fileStream, decrypt, CryptoStreamMode.Read))
            {
                var buffer = new byte[64];
                var read = cryptoStream.Read(buffer, 0, buffer.Length);
                while (read > 0)
                {
                    returningStream.Write(buffer, 0, read);
                    // I think the last Iteration is failing... 
                    // Also cryptoStream.CopyTo(returningStream) throws the exception
                    read = cryptoStream.Read(buffer, 0, buffer.Length);
                }
            }
        }

        returningStream.Position = 0;
        return returningStream;
    }

    public KeyPair Encrypt(string file, string outfile)
    {
        using (RijndaelManaged myRijndael = new RijndaelManaged())
        { 
            // Generate new IV and KEY
            myRijndael.KeySize = IVSize;
            myRijndael.BlockSize = BlockSize;
            myRijndael.Padding = PaddingMode.PKCS7;
            myRijndael.Mode = CipherMode.CBC;
            myRijndael.GenerateIV();
            myRijndael.GenerateKey();

            var encrypter = myRijndael.CreateEncryptor();

            // Create memoryspace for crypto
            using (var memory = new MemoryStream())
            {
                // Create cryptostream
                using (var cryptoStream = new CryptoStream(memory, encrypter, CryptoStreamMode.Write))
                {
                    // read file to encrypt
                    using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
                    {
                        // copy content to cryptostream
                        var buffer = new byte[64];
                        var read = fileStream.Read(buffer, 0, buffer.Length);
                        while (read > 0)
                        {
                            cryptoStream.Write(buffer, 0, read);
                            read = fileStream.Read(buffer, 0, buffer.Length);
                        }
                        cryptoStream.FlushFinalBlock();
                    }

                    using (var encryptedFile = new FileStream(outfile, FileMode.CreateNew, FileAccess.Write))
                    {
                        // Reset the stream position for reading
                        memory.Position = 0;

                        // read and copy content to file
                        memory.CopyTo(encryptedFile);
                    }                         
                }
            }

            return new KeyPair {IV = myRijndael.IV, Key = myRijndael.Key};
        }
    }