我看到了很多关于这个主题的问题。在答案中,用户必须使用一些pdf库或内置支持来加载pdf,然后根据库函数,用户可以确定pdf是否加密。我想知道是否可能使用某些静态分析工具(例如YARA),只读取文件内容作为二进制/字符串数据而不是完整文件结构,就能检测PDF是否为加密文件?
PDF加密是在文件尾部字典中的Encrypt条目中指示的,详见Adobe PDF参考手册(v.1.7)中的第3.4.4节(表格3.13)。
因此,要检测PDF加密,需前往文件末尾并向上查找第一行仅包含单词“trailer”的内容,然后再向下查找包含“/Encrypt”字符串的内容。如果存在,则文件已加密,否则未加密。
现在,要检测PDF是否受到密码保护(即必须输入密码才能打开),则会更加困难。您基本上需要读取/Encrypt关键字之后的对象引用(例如“14 0 R”),跳转到文件开头并查找该对象(例如“14 0 obj <<”),并查找该字典中的/Filter、/R和/U键。
如果/Filter的值为/Standard,则可以使用算法3.6的导言(第127页)来确定用户密码是否为空字符串,从而是否禁止提示输入密码。
因此,如果/R值为2,则应查找/U值是否为特定字符串;如果/R值为3或4,则可以查找/U值是否为另一个特定字符串。如果它不是这些值中的任何一个,则需要用户密码才能打开文档,文档受到密码保护。
您可以按照PDF参考手册中的算法计算这些/U值,或者从现有的不需要密码即可打开的加密PDF文件中找到它们。
/Encrypt
,/U
,/ID
来判断PDF是否受密码保护呢?@PatrickGallot - Abhishek Kumar/Encrypt,/U,/ID
将满足我的要求@PatrickGallot - Abhishek Kumar