不久前,我开始编写自己的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将ANYTHING写入文件?我使用PBKDF2从密码生成加密密钥。
答案 0 :(得分:0)
我通过使用MemoryStream而不是FileStream找到了解决方案。这确保了当cryptostream抛出异常时它还没有向文件流写入任何内容。密文将位于内存流中,如果解密顺利,可以写入文件。