【发布时间】:2018-05-16 11:42:57
【问题描述】:
不久前,我开始编写自己的 AES 应用程序以了解有关加密的更多信息。我设法让整个应用程序正常工作,除了我仍在努力解决的一件事情。
是这样的场景: 当用户想要解密文件时,用户必须输入密码才能解密文件。但是,当用户输入错误的密码时,解密应该会失败。我知道当 CryptoStream 抛出 CryptoGraphicException 时,这意味着出现了问题,在这种情况下是使用错误的密码进行解密。我会给出这样的消息:“填充无效,无法删除”。
问题在于,当用户使用错误密码解密时,它仍然会写入一个包含解密内容的新文件。我真的想防止这种情况发生,因为它显然会改变加密文件的内容,使其无法再次解密。
我的解密代码如下:
using (AesManaged aesManaged = new AesManaged())
{
//Console.WriteLine("Decrypting file using " + aesManaged.Mode + ", block size " + aesManaged.BlockSize + " and padding mode " + aesManaged.Padding + "...");
byte[] salt = GetSaltFromCiphertext(cipherText);
byte[] initializationVector = GetInitializationVectorFromCiphertext(cipherText);
byte[] fileContentToDecrypt = GetContentFromCiphertext(cipherText);
//Initialize the AES instance with the key and the initialization vector
aesManaged.Key = GenerateKey(password, salt);
aesManaged.IV = initializationVector;
using (FileStream fileStream = new FileStream("../../Files/" + fileNameAndExtension, FileMode.Create))
{
using (CryptoStream cryptoStream = new CryptoStream(fileStream, aesManaged.CreateDecryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(fileContentToDecrypt, 0, fileContentToDecrypt.Length);
}
}
}
当用户使用错误密码解密时,如何防止 CryptoStream 或 FileStream 向文件写入任何内容?我使用 PBKDF2 从密码生成加密密钥。
【问题讨论】:
-
写入临时文件?写入内存流?
-
我想用解密的文件覆盖加密文件。即使密码错误,它仍然会这样做。
-
加密流在写入时加密,在读取时解密...
-
这里的加密流解密它。你可以看到我通过了 aesManager.CreateDecryptor().
-
不解密到FileStream,先解密到MemoryStream,解密成功后才写入文件。
标签: c# file encryption aes