【发布时间】:2011-01-24 06:39:29
【问题描述】:
我在 C# 中使用“RijndaelManaged”和“CryptoStream”类来加密文件。在加密文件之前,我想检查文件是否已经加密。
我尝试使用File.GetAttributes() 方法来检查加密,但它不起作用。
我需要一些关于如何检查文件是否已加密的提示。
【问题讨论】:
标签: c# encryption aes
我在 C# 中使用“RijndaelManaged”和“CryptoStream”类来加密文件。在加密文件之前,我想检查文件是否已经加密。
我尝试使用File.GetAttributes() 方法来检查加密,但它不起作用。
我需要一些关于如何检查文件是否已加密的提示。
【问题讨论】:
标签: c# encryption aes
如果没有任何类型的自定义标头,唯一确定文件已加密的方法是尝试对其进行解密。
如果您尝试压缩文件并且文件变小,那么它极不可能被加密。如果字节值分布不均匀(包括纯文本!),则不太可能被加密。
这些启发式方法取决于加密的正确执行。如果一次将 AES 应用于一个文件块,则结果中可能会出现模式,但由于您使用的是 CryptoStream,这应该不是问题。
如果您自己的代码将始终用于加密和解密文件,那么您应该考虑添加一个自定义标头,表明它是一个加密文件。
【讨论】:
假设我有一个包含密文 X 的文件 F,它是用密钥 Z 加密明文 Y。
我希望确保明文 Y 只能由同时拥有密钥 Z 和密钥 Q 的人来确定。(我可以想到许多我可能希望这样做的原因。)
因此我希望使用密钥 Q 加密已经加密的文件。
您是在告诉我您的系统希望检测到 F 已经加密,然后拒绝使用密钥 Q 对其进行加密?
这似乎是个坏主意。我可能想要用密钥 Q 加密文件,不管它是否已经用密钥 Z 加密。
【讨论】:
您必须检查文件并查找如果文件被加密则不会存在的结构或字节字符串。您需要对正在处理的每种类型的文件进行单独测试。
【讨论】:
如果文件被加密,它将显示为随机字节流。你可以:
尝试打开文件和/或确认它是预期的格式(JPG、ZIP 等)。如果文件与已知格式匹配,那么您就知道它已被解密。
如果您有密钥,请尝试解密文件,然后重复上一步。如果它现在与已知格式匹配,那么您就知道它是(曾经?)加密的。
【讨论】:
设置你的加密方法bool类型,如果文件可以解密,则该方法返回true表示文件已加密,否则该方法抛出异常并返回false表示文件不能解密,或者说文件没有加密。
【讨论】:
我建议在加密过程中重命名加密文件,当你想解密它时可以检查它。
【讨论】: