Encryption 文件的加密和解密

Encryption 文件的加密和解密,encryption,des,Encryption,Des,我正在尝试加密和解密一个文件。该文件可以是txt、jpg、doc、pdf等任何文件。 IV在密文前面。但在解密时,如果我读取前8个字节,它会给我不同的值,然后是加密时IV的值 这是我加密文件的代码 fsOut = new FileStream(savepath, FileMode.OpenOrCreate, FileAccess.Write); des = new DESCryptoServiceProvider(); des.Ke

我正在尝试加密和解密一个文件。该文件可以是txt、jpg、doc、pdf等任何文件。 IV在密文前面。但在解密时,如果我读取前8个字节,它会给我不同的值,然后是加密时IV的值

这是我加密文件的代码

fsOut = new FileStream(savepath, FileMode.OpenOrCreate, FileAccess.Write);
                des = new DESCryptoServiceProvider();
                des.Key = ASCIIEncoding.ASCII.GetBytes(secretkey);                 

                des.GenerateIV();                

                desencrypt = des.CreateEncryptor();
                cryptoStream = new CryptoStream(fsOut, desencrypt, CryptoStreamMode.Write);

                //write the IV to beginning of encrypted data
                BinaryWriter bw = new BinaryWriter(cryptoStream);
                bw.Write(des.IV, 0, des.IV.Length);

                // Now will initialize a buffer and will be 
                // processing the input file in chunks. 
                // This is done to avoid reading the whole file (which can be
                // huge) into memory. 
                int bufferLen = 4096;
                byte[] buffer = new byte[bufferLen];
                int bytesRead;
                do
                {
                    // read a chunk of data from the input file 
                    bytesRead = filestream.Read(buffer, 0, bufferLen);
                    // Encrypt it 
                    cryptoStream.Write(buffer, 0, bytesRead);
                }
                while (bytesRead != 0);

                cryptoStream.FlushFinalBlock();
这将生成一个到指定位置的加密文件

下面是我的解密代码

des = new DESCryptoServiceProvider();
                des.Key = Encoding.ASCII.GetBytes(secretkey);

                byte[] iv = new byte[8];
                sourcefile.Read(iv, 0, 8);
                des.IV = iv;

                desdecrypt = des.CreateDecryptor();
                msOut = new MemoryStream();
                cryptoStream = new CryptoStream(sourcefile, desdecrypt, CryptoStreamMode.Read);

                StreamWriter fsDecrypted = new StreamWriter("D:\\tempDecrypted.jpg");
                fsDecrypted.Write(new StreamReader(cryptoStream).ReadToEnd());
                fsDecrypted.Flush();
                fsDecrypted.Close();

您正在将IV写入
加密流
,因此它将被转换为密文。IV应该在密文前面加上明文,它不应该是密文的一部分。

您需要将IV写入未加密的流。还有一些注意事项:1)DES不安全。改用AES。2) 您不应该使用ASCII作为正确的键。要么是正确的密钥,然后需要使用十六进制或Base64。或者它是一个密码,然后你需要使用一个盐密码散列来将它转换成一个密钥。好吧,我对这一点完全不熟悉,不知道哪一个最好,如何实现。基本上我想加密和解密文件,而不是字符串data@CodesInChaos-你能告诉我怎么做吗?是的,但是怎么做。我的意思是如何将IV作为纯文本写入密码文本的开头,将其写入
fsOut
maybe?嘘。