0

我在使用 CryptoStream 进行文件加密时遇到了麻烦。

代码:

public static void EncryptFile(string inputFile, string outputFile)
    {
        int num;
        string s = "PUPlr";
        byte[] bytes = new UnicodeEncoding().GetBytes(s);
        string path = outputFile;
        FileStream stream = new FileStream(path, FileMode.Create);
        RijndaelManaged managed = new RijndaelManaged();
        CryptoStream crpytStream = new CryptoStream(stream, managed.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write);
        FileStream stream2 = new FileStream(inputFile, FileMode.Open);
        while ((num = stream2.ReadByte()) != -1)
        {
            crpytStream.WriteByte((byte)num);
        }
        stream2.Close();
        crpytStream.Close();
        stream.Close();
    }

尝试“managed.BlockSize = 16;” 或“= 128;” 似乎不起作用,那么我该如何解决我的错误?

4

4 回答 4

4

像 Rijndael 这样的块密码需要长度等于块大小的密钥和 IV,通常为 256 位。

此外,每条消息的 IV 必须是唯一的,否则您的数据将不安全。

于 2012-04-25T19:47:36.093 回答
2

错误是:

managed.CreateEncryptor(bytes, bytes)

其中第一个(密钥)第二个参数bytes需要是 128 位(16 字节)、192 位(24 字节)或 256 位(32 字节) 。

笔记:

  • 对于AES互操作性,您应该使用Rijndael128BlockSize位(16 字节)。

  • UnicodeEncoding会(经常)给你弱密码。查看使用 PKCS#5 从密码创建强密钥(和 IV)。对于 .NET,请查看RFC2898DeriveBytes

  • 避免对密钥和 IV 使用相同的数据;

于 2012-04-25T19:52:52.113 回答
0

这一行在这里:

managed.CreateEncryptor(bytes, bytes)

不工作。第一个参数是key,第二个参数是初始化向量。如果您打算将字符串s用作“密码”或密钥,请尝试使用Rfc2898DeriveBytes从密码生成密钥。

于 2012-04-25T19:49:09.423 回答
0
public static void EncryptFile(string input, string output)
{
    string theKey = "urKey";
    byte[] salt = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c };
    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(theKey, salt);
    RijndaelManaged RMCrypto = new RijndaelManaged();
    using (var inputStream=new FileStream(input))
        using (var outputStream = new FileStream(output))
            using (CryptoStream cs = new CryptoStream(inputStream, RMCrypto.CreateEncryptor(pdb.GetBytes(32), pdb.GetBytes(16)), CryptoStreamMode.Read))
            {
                byte[] buffer = new byte[1024];
                int bytesRead = 0;
                do
                {
                    bytesRead = cs.Read(buffer, 0, buffer.Length);
                    outputStream.Write(buffer, 0, bytesRead);
                } while (bytesRead > 0);
            }
}
于 2012-04-25T20:47:49.770 回答