C#加密和解密文本文件

C#加密和解密文本文件,c#,cryptography,rijndaelmanaged,C#,Cryptography,Rijndaelmanaged,我正在尝试加密,然后在需要时解密一个文件,并读取该文件以供程序使用。还在学习密码学,我看了几个例子,并尝试了这个 我已经成功地对字符串进行了加密和解密,但遗憾的是,在本例中这并没有起作用 Cryptostream在加密时出现IV不匹配块大小错误。甚至不可能测试解密,但这很可能是关闭了 所以问题是:如何加密、解密和读取.txt文件? private void EncryptFile(string resultFile) { string password = @"

我正在尝试加密,然后在需要时解密一个文件,并读取该文件以供程序使用。还在学习密码学,我看了几个例子,并尝试了这个

我已经成功地对字符串进行了加密和解密,但遗憾的是,在本例中这并没有起作用

Cryptostream在加密时出现IV不匹配块大小错误。甚至不可能测试解密,但这很可能是关闭了

所以问题是:如何加密、解密和读取.txt文件?

private void EncryptFile(string resultFile)
    {
        string password = @"test"; 

        UnicodeEncoding UE = new UnicodeEncoding();
        byte[] key = UE.GetBytes(password);

        FileStream fsCrypt = File.Create(resultFile);

        RijndaelManaged rmCrypto = new RijndaelManaged();

        CryptoStream cs = new CryptoStream(fsCrypt, rmCrypto.CreateEncryptor(key, key),CryptoStreamMode.Write);

        StreamWriter sWriter = new StreamWriter(cs);

        sWriter.WriteLine(resultFile);

        sWriter.Close();
        cs.Close();
        fsCrypt.Close();
    }

    private void DecryptFile(string resultFile)
    {

        string password = @"test";

        UnicodeEncoding UE = new UnicodeEncoding();
        byte[] key = UE.GetBytes(password);

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

        RijndaelManaged rmCrypto = new RijndaelManaged();

        CryptoStream cs = new CryptoStream(fsCrypt, rmCrypto.CreateDecryptor(key, key), CryptoStreamMode.Read);

        StreamWriter sWriter = new StreamWriter(cs);

        sWriter.WriteLine(resultFile);

        sWriter.Close();
        cs.Close();
        fsCrypt.Close();
    }

我建议使用
AesManaged
而不是
RijndaelManaged
,这主要是因为前者遵循定义的标准

Aes/rijndael为密钥和初始化向量指定了大小。您不应该直接使用密码中的字节。正确的方法是通过see运行密码,以确保您拥有正确大小和高质量的密钥。或者使用正确大小的随机生成的二进制密钥

第二个问题是初始化向量,它也需要具有正确的大小,并且应该是随机的。但是IV不是秘密的,通常会附加到加密的消息中,因此使用密钥作为IV将不安全


最好的选择可能是使用加密类中的和。有关更多详细信息。

如果您的加密是在本地进行的(因此不会传输到其他计算机),您可以尝试.net的DPAPI:主要用于本地,但在传输时必须是安全的。我尝试了一些类似但简单得多的方法来锁定文件或是一些我忘记的方法。但我确实把它转移到另一台机器上打开了。IV需要16字节。尝试以下操作:byte[]key=UE.GetBytes(密码);字节[]iv=新字节[16];Array.Copy(key,iv,(key.Length>=16)?16:key.Length);然后使用:rmCrypto.CreateDecryptor(key,iv)我将测试它。谢谢。您在代码中的什么地方尝试加密文件?很遗憾,找不到任何AES示例来执行我想要的任何操作(加密、解密和读取加密的.txt文件)。一个问题是,可以对字符串进行加密,但不能将它们保存到文本文件中,因为它们是字节。如果将它们转换为字符串,则不同,解密将无法工作。我尝试加密txt文件的每一行,然后将其放入数组字符串中,以便在读取完txt文件后将其保存到txt文件中。如果要将加密数据存储为文本,请使用将字节数组转换为字符串,然后使用convert.FromBase64String将其转换回字节数组。