【发布时间】:2021-07-25 08:12:09
【问题描述】:
我正在尝试在 C# ASP NET 5.0 中加密/解密文件,当然我可以让它适用于 .txt 文件和常规字符串。但是,如果我尝试加密 PDF 文件然后解密它,它已损坏并且我无法打开它。我现在只是在使用 EBC,我知道它不安全,但我只是想在添加其他选项之前对其进行测试。
public static void encrypt(string fileLocation, string encryptedFileLocation, string key)
{
FileStream fp = new FileStream(fileLocation, FileMode.Open, FileAccess.Read);
FileStream encryptedFile = new FileStream(encryptedFileLocation, FileMode.Create);
using (Aes aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(key);
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
ICryptoTransform encryptor = aes.CreateEncryptor(Encoding.UTF8.GetBytes("asdfasdfasdfasdf"), Encoding.UTF8.GetBytes("fdsafdsafdsafdsa"));
CryptoStream cryptoStream = new CryptoStream(encryptedFile, encryptor, CryptoStreamMode.Write);
byte[] buffer = new byte[1024];
int read;
try
{
while((read = fp.Read(buffer, 0, buffer.Length)) > 0)
{
cryptoStream.Write(buffer, 0, read);
cryptoStream.FlushFinalBlock();
}
}
catch(Exception e)
{
}
finally
{
fp.Close();
encryptedFile.Close();
}
}
}
public static void decrypt(string cypherFileLocation, string decryptedFileLocation, string key)
{
FileStream fp = new FileStream(cypherFileLocation, FileMode.Open, FileAccess.Read);
FileStream decryptedFile = new FileStream(decryptedFileLocation, FileMode.Create);
using (Aes aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(key);
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
ICryptoTransform decryptor = aes.CreateDecryptor(Encoding.UTF8.GetBytes("asdfasdfasdfasdf"), Encoding.UTF8.GetBytes("fdsafdsafdsafdsa"));
CryptoStream cryptoStream = new CryptoStream(fp, decryptor, CryptoStreamMode.Read);
try
{
byte[] buffer = new byte[1024];
int read;
while((read = cryptoStream.Read(buffer, 0, buffer.Length)) > 0)
{
decryptedFile.Write(buffer, 0, read);
decryptedFile.Flush();
}
}
catch(Exception e)
{
}
finally
{
fp.Close();
decryptedFile.Close();
}
}
}
【问题讨论】:
-
您确定您的加密有效吗?您正在抑制任何异常,因此如果出现错误,您将永远不会知道。
-
我最终得到了两个附加文件,一个是加密的,一个是解密的。当我使用 txt 文件时,我可以打开它们,解密后的文本与纯文本文件相同。就在我对 PDF 或其他文件执行此操作时,它会打开阅读器,但随后会说出现错误并且无法打开 PDF。
-
已解决:当涉及到较大的文件时,try 块会抑制错误。文本文件很短,因此它只执行了一次 FlushFinalBlock(),但对于较大的文件,它会执行多次,这是一个错误。谢谢 :) 我有时很笨
标签: c# asp.net encryption aes