如何使用AES(Rijndael)检查文件是否加密

我在C#中使用’RijndaelManaged’和’CryptoStream’类来加密文件。 在加密文件之前,我想检查文件是否已加密。

我尝试使用File.GetAttributes()方法来检查加密,但它无法正常工作。

我需要一些提示,我可以检查文件是否已加密。

没有任何类型的自定义标头,绝对确保文件加密的唯一方法是尝试解密它。

如果您尝试压缩文件并且文件变小,则极不可能加密。 如果字节值的分布不均匀(包括纯文本!),则不太可能加密。

这些启发式方法取决于加密的正确执行。 如果AES一次应用于一个文件块,那么可以在结果中出现模式,但由于您使用的是CryptoStream,因此这不应该是一个问题。

如果您自己的代码将始终用于加密和解密文件,那么您应该考虑添加一个自定义标头,指示它是加密文件。

假设我有一个包含密文X的文件F,它是带有密钥Z的明文Y的加密。

我希望确保明文Y只能由拥有密钥Z和密钥Q的人来确定。(我可以想出为什么我可能希望这样做的一些原因。)

因此,我希望用密钥Q加密已经加密的文件。

您告诉我您的系统希望检测到F已经加密,然后拒绝使用密钥Q对其进行加密?

这似乎是一个坏主意。 我可能用密钥Q加密文件,而不管它是否已经用密钥Z加密。

您必须检查文件并查找结构,或者在文件加密时不存在的字节字符串。 您需要为要处理的每种类型的文件单独进行测试。

如果文件已加密,则它将显示为随机字节流。 您可以:

  • 尝试打开文件和/或确认它是预期的格式(JPG,ZIP,等等)。 如果文件与已知格式匹配,那么您就知道它已被解密。

  • 如果您有密钥,则尝试解密文件,然后重复上一步。 如果它现在匹配已知格式,那么您知道它是(是?)加密的。

设置你的加密方法bool类型,如果文件可以解密,那么方法返回true表示文件被加密,否则方法抛出exception并返回false表示文件无法解密,或者说文件没有加密。