使用DES解密垃圾的文件加密 - C#

时间:2013-12-08 00:24:02

标签: c# .net encryption cryptography des

我正在尝试使用DESCryptoServiceProvider在C#中编写一个简单的文件加密器。我正在加密的文件格式是.jpg。加密看起来很好,但是当我解密加密文件时,我在Windows Photo Viewer中收到一条错误消息。

这是我的代码:

public static void Encrypt(string inputFileName, string outputFileName, string key)
    {
        var inputPath = path + "\\" + inputFileName;
        var outputPath = path + "\\" + outputFileName; 

        try
        {
            FileStream fsInput = new FileStream(inputPath, FileMode.Open, FileAccess.Read);
            FileStream fsEncrypted = new FileStream(outputPath, FileMode.Create, FileAccess.Write);

            DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
            DES.Key = ASCIIEncoding.ASCII.GetBytes(key);
            DES.IV = ASCIIEncoding.ASCII.GetBytes(key);
            DES.Padding = PaddingMode.None;

            ICryptoTransform desencrypt = DES.CreateEncryptor();
            CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);

            byte[] bytearrayinput = new byte[fsInput.Length - 1];
            fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
            cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

            Console.WriteLine("file encrypted @ {0}", outputFileName);
        }
        catch(Exception ex) 
        {
            Console.WriteLine("catch in encryption: " + ex.Message + "\n\nclosing...");
        }
    }

    public static void Decrypt(string inputFileName, string outputFileName, string key)
    {
        var inputPath = path + "\\" + inputFileName;
        var outputFileHoler = inputFileName.Substring(0, (outputFileName.IndexOf('.') + 4)); //FIX TO REMOVE REGEX
        var outputPath = path + "\\" + outputFileHoler;

        Console.WriteLine(outputPath); //TEMP

        try
        {
            DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
            DES.Key = ASCIIEncoding.ASCII.GetBytes(key);
            DES.IV = ASCIIEncoding.ASCII.GetBytes(key);
            DES.Padding = PaddingMode.None;

            FileStream fsread = new FileStream(inputPath, FileMode.Open, FileAccess.Read);

            ICryptoTransform desdecrypt = DES.CreateDecryptor();
            CryptoStream cryptostream = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
            StreamWriter fsDecrypted = new StreamWriter(outputPath);

            fsDecrypted.Write(new StreamReader(cryptostream).ReadToEnd());
            fsDecrypted.Flush();
            fsDecrypted.Close();

            Console.WriteLine("file decrypted @ {0}", outputPath);
        }
        catch (Exception ex)
        {
            Console.WriteLine("catch in decryption: " + ex.Message + "\n\nclosing...");
        }
    }

我做错了什么?

PS。对密码学来说是全新的,如果它很简单,请原谅我......

1 个答案:

答案 0 :(得分:1)

请勿尝试自己实施加密,除非您100%确定自己知道自己在做什么。使用经过良好审核的高级(!)库。

您正在尝试使用DES。由于密钥长度不足,DES被破坏且不安全。不要使用它。

您正在使用密钥而不是随机值作为IV。根据加密提供程序的工作方式,这会引入一个小漏洞或使您的加密100%毫无价值,因为它会泄露您的密钥。

您没有使用任何填充。这将无法正确加密/解密不完全符合块大小的文件。

您没有显示获取密钥的方式。你有可能以不安全的方式这样做。特别是假设您使用字符串来存储它。

CodesInChaos的评论指出了很多重要的观点。什么打破你的文件可能是StreamReader,填充,以及缺少流刷新/关闭。但是,再次不要尝试编写加密代码 - 即使您使其工作, 也会不安全。