首先,我不是任何一个Unix专家,所以请原谅我的问题。
我要求列出给定目录中可能包含加密和未加密文件的未加密文件。
我无法通过文件扩展名可靠地识别这些文件,并希望SO社区中的某些人能够帮助我。
我可以跑:
file * | egrep -w 'text|XML'
但这只会识别文本或XML文件。如果我不能做得更好,我可以使用它,因为目前directry中唯一的其他文件是文本或XML文件,但我真的想要识别所有未加密的文件,无论它们是什么类型。
这可以在单行命令中使用吗?
编辑:加密文件通过openSSL加密
我用来取消加密文件的命令是:
openssl -d -aes128 -in <encrypted_filename> -out <unencrypted_filename>
答案 0 :(得分:1)
你的问题不是一件轻而易举的事。 solaris文件命令使用“magic” - / etc / magic。这是一组试图尝试确定文件的风格的规则。它并不完美。
如果您阅读了/ etc / magic文件,请注意最后一列是文件命令输出中的文件,当它识别文件中的某些结构时。
基本上,file命令查看文件的前几个字节,就像系统调用的exec()系列一样。因此,在文件的第一行中的#/ bin / sh,在行的第一个字符中,标识exec()exec()需要调用以“运行”文件的“命令解释器”。文件有相同的想法,并说“命令文本”“awk文本”等。
您的问题是您必须确定您将从文件输出的文件类型。您需要花时间深入研究未加密的文件,以查看您可以从文件中获得的“答案”。否则,您可以在整个目录树上运行文件,并整理出您认为正确答案的所有内容。
find /path/to/files -type f -exec file {} \; | nawk -F':' '!arr[$2]++' > outputfile
这会为您提供有关您认为的文件的明确答案列表。把你喜欢的那些放在一个文件中,称之为good.txt
find /path/to/files -type f -exec file {} \; > bigfile
nawk -F':' 'FILENAME=="good.txt" {arr$1]++}
FILENAME=="bigfile" {if($2 in arr) {print $1}} ' good.txt bigfile > nonencryptedfiles.txt
这不是100%保证。文件可以被欺骗。
答案 1 :(得分:1)
识别加密文件的方法取决于它们包含的随机性或entropy。加密的文件(或至少加密井的文件)在统计意义上应该是随机的。包含未加密信息的文件(文本,图形,二进制数据或机器代码)在统计上不是随机的。
计算随机性的标准方法是使用autocorrelation函数。您可能只需要对每个文件的前几百个字节进行自相关,因此该过程可以非常快。
这是一个黑客,但你可能能够利用压缩算法的一个属性:它们通过从数据中删除随机性来工作。加密文件无法压缩(或者再次压缩,至少不会压缩),因此您可能会尝试压缩每个文件的某些部分并比较压缩率。
SO还有其他几个关于寻找随机性或熵的问题,其中很多都有很好的建议,比如这个: How can I determine the statistical randomness of a binary string?
祝你好运!