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