pdf格式总结

时间:2024.4.30

一、对象

1.概述

pdf包括八种类型:Boolean values, Integer and Real numbers, Strings, Names, Arrays, Dictionaries, Streams, and the null object.

2.类型说明

(1)整型实型可以带符号,实型不要用非小数点或指数方式。

(2)字符串可以使放在()中的字符,也可以是放在< >中的十六进制数。

(3)前面没有反斜杠的结束标记只被视为一个字节。

(4)常用的转义字符:(空格 (20h), 制表符B (09h), 回车 (0Dh), 换行 (0Ah), and 分页符 (0Ch))。

(5)名称类型中可以使用两位十六进制表示字符,在前面加上前缀#。

(6)通常名称类型是作为原子类型,但是当需要将其作为字符类型时则用UTF-8进行解码。

(7)流对象是间接对象,但流对象中的字典是直接对象。

(8)stream后面必须跟着一个回车加一个换行符或者仅仅是一个换行符,但不能只加一个回车。在流字节和endstream中应该有一个行结束标记,不能有空格,该标记不算在内容长度之内。

(9)stream中的流字典键值对

(10)指向未定义对象的引用不会被当成错误,会当成引用一个空对象。

二、过滤器

1.概述

Pdf是通过过滤器来将流中乱码进行解码。

例如,一个流字典中指明过滤器为ASCIIHexDecode,那么负责读流的应用程序就必须实现将hexadecimal-encoded数据进行解码。

一个流字典中的filter可以是一个数组,比如先后使用LZW和ASCII base-85编码的流在流字典中为2/Filter [/ASCII85Decode /LZWDecode]。(加密解密顺序相反)

有些filter中还包含参数来控制操作。

2.Crypt filter

该过滤器决定了解密的算法,在过滤器数组中该过滤器必须放在第一位。

其可选的参数:Type:作为解密参数字典的CryptFilterDecodeParms

                     Name:Crypt filter的名称。

具体在第四部分描述

三、文件结构

1.概述

除了签名字典中的内容外,非流对象的数据每行不得超过255个字符。

二、文件头

大部分PDF文件包含二进制数据,在文件头部后加上至少四个二进制字符,每个字符要大于在128。这是为了让程序分辨出文件中的数据时文本还是二进制。

三、交叉映射表

交叉映射表包含的信息可以允许随机访问文件中的间接对象。

表中的每一行都对应着一个间接对象,说明了每一个对象相对于文件体的偏离字节。

每次文档被增量式地修改时,会新增加一个映射表子部分。

每个映射表子部分包含两个部分,第一个部分是该子部分第一个对象的对象号码,第二个部分是该子部分的行数。

每个子部分的行包含20个字节。(包括结束标志)

行的格式如下:nnnnnnnnnn ggggg n eol

n表示该对象在使用,f表示该对象已经删除。

nnnnnnnnnn 表示该对象在解码后的流中的偏移。即从文件的开头到对象的开头的长度。

ggggg表示版本号

eol的值可为SP CR, SP LF, or CR LF 中的一种。

每个子部分的第一行必须为f且ggggg为65536。其他的初始化为0。当一个间接对象被删除时,添加一个表项到表尾并将其标志位设为F,并将gggg位加一,ggg位最大为65536.

四、文件尾

一般reader读文件都是从文件尾开始读的。

倒数第二行的数据代表从文件头到最后 一个xref关键字之间的偏移量。

文件尾包含一个尾部字典,字典中的键值有:

Size  integer交叉映射表中对象的行数

Prev  integer从文件开头到上一个子映射表的偏移量(只在多子映射表中出现)

Root  dictionary  catalog 字典对象编号

Encrypt  dictionary加密字典

Info   dictionary信息字典(记录创建者标题等信息)

ID

      array

如果有加密字典的话,该键值是一个二字节字符串的数列,代表文件的标识。该数列和其中的二字节字符串都是未加密的。

该键值是为了确保当前访问的是未解密的正确文件。其中的字符串是作为加密算法的输入。

五、文件的修改

文件的修改是采用增量的方式,对文件所作的改变添加到文件末尾。新添加的文件尾部必须包含原来文件尾的所有属性,不管这些属性是否被修改。(原来没有prev新的要添加。)

六、对象流

对象流是一个流对象,它包含了一系列可能被存储的间接对象。

对象流中不包括的对象有:

流对象,版本不为0的对象,加密字典

对象流中的键值对:

Type  name这里为ObjStm

N     integer所存储的间接对象的数目

First integer第一个压缩文件在解密的流中的字符偏移量

Extends

  stream

对另一个对象流的引用,作为当前对象流的扩展。流和扩展构成了一个有向无环图。

对象流中对象的数目有一定的限制,所以要采用扩展机制。

对象流的流数据应包括以下几项:

。N对用空格分开的整数,前一个整数表示所压缩对象的编号,后一个则是解密后的偏移量。

。对象流字典的第一个键值为其所包含的第一个对象的偏移量。

。顺序存储的N个对象,只存储对象内容,关键字obj,endobj不被存储。

七、交叉映射流

交叉映射流相当于交叉映射表及其对应的尾部.

加了映射流后startxref后面的内容则是映射流对象的偏移量,此时trailer和xref就不用了.

交叉映射流字典中的所有键值对:

Type 为xref

Size 相当于trailer中的size值

Index 包含两个整数的数列,第一个整数为该流所代表的映射表的第一个对象号,第二个整数为该流所代表的映射表的映射对象数目.

Prev 从文件头到上一个映射流对象的偏移,这个值只在映射流对象超过一个时有用.

W    一个整数数列,数列中的每一个值为映射流中每个字段的长度,一般包含3个整数.长度为0说明该字段不会出现,

交叉映射流字典中的所有键值对(除了对其他交叉映射流对象的引用)的值必须是直接对象,如果对象是数列,数列中的每个元素也是直接对象.交叉映射流及其字典不应被加密,所以其filter的之中不能出现crypt.

交叉映射流中所包含的每行数据都有一个以上的字段,第一个字段代表该行的类型,

类型0:未使用的对象链表              下一个对象的编号         该对象的版本号

类型1:正使用但未压缩的对象链表      对象的偏移量             版本号

类型2:被压缩的对象链表      该对象所在的压缩后的对象流的编号 该对象在压缩的流中的索引

3 加密

一、概述

不能加密的内容:文件尾中的ID,加密字典中的字符串,已经被加密过的流

与加密相关的信息应该保存在加密字典中,加密字典是文件尾中的Encrypt键值。如果没有该健那么reader就会当成没有加密。

加密字典中的键值对:

加密字典中的内容不应被加密,安全句柄会自动对加密字典中需要保护的数据进行加密。

2.通用加密算法

RC4算法:对称密钥,不改变文件长度

AES算法:对称分组密钥,每组的长度为16字节,加密的数据必须是组的整数倍。不足位通过PKCS #5机制补齐。

PDF标准加密方法使用MD5方法来生成密钥。

RC4或AES算法的步骤:

a)  获得待加密的流或字符串的对象编号和版本号。

b)  对所有没有指定加密过滤器的字符串和流,将对象编号和版本号看做二进制整数。把编号的低位三字节和版本的低位两字节添加到密钥的开头。使n字节的加密密钥长度为n+5如果使用AES算法,再在密钥开头添加sAIT。

c)  初始化MD5哈希函数,把上一步的结果作为输入

d)  从函数生成的16位字节提取前n+5个字节作为对称密钥。AES算法采用CBC分组机制,需要一个初始化向量。每组16个字节,初始向量是一个随机的16位字节保存在每个加密后的流或字符串的开头。

加密是在所有编码过后进行,解密是在所有解码之前进行。加密后或解密后的对象长度都必须在长度键值中给出。

3.标准安全句柄

标准安全句柄为文件指定两个密码:所有者密码和用户密码。如果密码和访问限制被指定后,文件就被加密,验证密码的许可和信息都被保存在加密字典中。在只有附件被加密的文件中使用的密码就是所有者密码和用户密码。

输入密码——》打开reader——》解密——》显示

对文档的访问许可以flag的形式来设置,其所对应的操作由安全句柄的修订号来决定(保存在加密字典中),如果修订号大于等于2,那么可以控制的授权访问有:

修改内容,复制或者提取文本图像,打印

如果大于等于3,还有更多的授权:

填表或对文档签名,插入旋转删除页面,添加注释或者书签,高质量打印,将对文本和图像的提取分开控制

如果为4那么就支持加密过滤器,过滤器名称为StdCF,其包含的键值对有:CFM,值为V2或AESV2;AuthEvent,值为DocOpen。当所有内容被加密时公钥安全句柄将使用DefaultCryptFilter作为加密过滤器。而仅当附件被加密时将使用DefEmbeddedFile作为加密过滤器。

标准的安全句柄的加密字典中额外的键值对:

键P是一个32位整数,作为标志位,其有用的位数有3,4,5,6,9,10,11,12,用途如下

加密句柄的一个函数用来生成一个加密解密时的密钥,给出一个密码字符串就能生成一个密钥,算法如下:

a)  补齐或者截断字符串使其为32位

b)  把上一步中的字符串作为输入来初始化MD5哈希函数

c)  将加密字典中O的值传入哈希函数

d)  把键P的值转化为32位无符号整数传入哈希函数,P的低16位字节在前。

e)  把文件尾字典中的ID数列的第一项元素传入哈希函数。

f)   (安全句柄修订4版以上)如果文件元数据没有被加密,传0XFFFFFFFF四个字节到哈希函数。

g)  完成哈希函数。

h)  (安全句柄修订3版以上)n为加密密钥的长度,取出前面一个哈希函数输出的前n个字节作为一个新的哈希函数的输入。重复此步骤50次。

i)   取最后一个哈希函数输出的前n位为加密密钥。版本2时n为5,3以上取决于加密字典中的length键值

计算加密字典的O键(所有者密码)算法:

a)  像上一个算法一样补齐或者截断所有者密码,若为空则使用用户密码。

b)  把上一步中的字符串作为输入来初始化MD5哈希函数

c)  (安全句柄修订3版以上)取出前面一个哈希函数输出作为一个新的哈希函数的输入。重复此步骤50次。

d)  将最终函数得到的结果作为RC4算法的加密密钥。

e)  补齐或者截断用户密码

f)   用RC4算法和d得到的密钥将e的结果进行加密

g)  (安全句柄修订3版以上)重复19次:调用前一个RC4函数得到的输出作为一个新的RC4函数的输入,第n次用的密钥通过将d步骤获得的密钥的每一字节与n的单字节值的异或得到。

h)  将最后一个RC4函数的输出作为O的值。

计算加密字典的U键(用户密码)算法(修订版2):

a)        和计算加密密钥的算法相同,基于用户密码字符串得出加密密钥

b)       将计算加密密钥的算法(a)中的字符串进行32字节补齐,利用上一步得到的密钥通过RC4函数进行加密

c)        上一步所得的结果作为U值存储到加密字典中

计算加密字典的U键(用户密码)算法(修订版3以上):

a)       和计算加密密钥的算法相同,基于用户密码字符串得出加密密钥

b)      将计算加密密钥的算法(a)中的字符串进行32字节补齐,将其作为哈希函数的输入

c)       把文件尾部的ID数列中的第一个元素传入哈希函数中,完成哈希函数

d)      用a所得的密钥对c所得的16字节结果进行加密,用RC4算法。

e)       重复19次:调用前一个RC4函数得到的输出作为一个新的RC4函数的输入,第n次用的密钥通过将d步骤获得的密钥的每一字节与n的单字节值的异或得到。

f)       将得到的16字节数据添加任意16字节数据作为U值

验证用户密码的算法:

a)       执行修订版2的计算加密字典U值的前两步或者修订版3的加密字典U值,使用待验证的用户密码。

b)      如果a所得到值与加密字典的U值相等(版本为3以上时比较前16字节数据),则密码正确。此时相应步骤的加密密钥即为解密密钥。

验证所有者密码的算法:

a)       执行计算加密字典O值的a到d步计算出加密密钥,使用待验证的所有者密码。

b)      (修订版2)采用RC4算法,上一步得到的密钥,对加密字典中的O进行解密

(修订版3以上)执行如下步骤20次:用RC4算法对加密字典的O值(第一次迭代)或者是上一次迭代的结果进行解密。每次的密钥不同,将a中密钥的每一个字节和迭代号的单字节进行异或后得到(从19到0)

c)       上一步得出的结果是用户密码,再执行验证用户密码的算法,如果正确,则说明所有者密码正确。

4.公钥安全句柄

公钥安全句柄可能会指定一个或多个受理人列表,每个列表都有其独特的访问授权许可,不同于输入密码,只有指定的受理人才打开加密文件的内容。公钥安全句柄采用(PKCS#7) 二进制编码语法对受理人列表,解密密钥,访问授权信息进行编码。

当加密文档时,每个受理人的X。509公钥证书都是可用的。当解密文档时,reader将会扫描受理人列表查询哪些内容是被加密的,并尝试寻找一个匹配的属于用户的证书。一旦匹配,用户就可以通过形如密码的验证方式来获得私钥从而对文件进行解密。

公钥加密字典中subfilter允许的值有:adbe.pkcs7.s3, adbe.pkcs7.s4,当不用filter的时候就用这些,用filter的时候就用adbe.pkcs7.s5,且CF,StmF,StrF也会出现。除了加密字典的常用键值对,公钥加密字典还有:

P是32位整数,被用到的有2,3,4,5,6,9,10,11,12位,除第二位其它位和安全句柄相同

公钥加密算法图:

PKCS#7对象中的包络数据包含了用于解密的密钥材料。包络数据将会用明文密钥加密,明文密钥被每个受理人用其公钥进行加密后存储在对象的Encrypted Key字段中。

当解密时,Encrypted Key通过受访者的私钥解密得到明文密钥,从而对包络数据进行解密,产生一个字节数组,包含以下内容:

由加密文档的安全句柄生成的一个20字节的随机数种子,用于RC4和AES算法的加密密钥。

4个字节长度的许可信息。

subfilter为adbe.pkcs7.s3,相关的许可只能为标准安全句柄版本2中指定的许可

subfilter为adbe.pkcs7.s4,相关的许可可以为标准安全句柄版本3中指定的许可

subfilter为adbe.pkcs7.s5,当StmF或StrF引用加密过滤器时,相关的许可同adbe.pkcs7.s4,当流对象的解密参数字典引用加密过滤器时,4字节长度的许可信息不要。

用于加密包络数据的算法有:256位密钥的RC4算法,128位密钥的DES、3阶DES、RC2算法,128、256、192位的CBC模式下的AES算法。

RC4或AES所需的加密密钥是通过SHA-1信息摘要操作摘录出如下数据:(按顺序)

20字节长的种子,PKCS#7对象中受理人列表中的每一项(按顺序),

如果该密钥是为了进行文档级的加密且文件元数据被作为明文,那么摘录数据尾部还要加上OXFF的四个字节数据。

设n为该密钥的位长,那么上面摘要数据的前n/8个字节作为加密密钥。

5.加密过滤器

加密过滤器包含下列结构:

包含CF,StmF和StrF,V值为4的加密字典

CF中的每个加密过滤器都是一个加密过滤器字典

一个流过滤器类型,加密过滤器可以被指定代替任何流中原有的过滤器。Reader将提供标准的标识过滤器来传递未经改变的数据,从而使得诸如元数据等特定的流在另一个文件中不会被加密。流过滤器中的DecodeParam键值为一个加密过滤器加密参数字典,其中的Name键值指定了特定的加密过滤器(没有就用Identity)。不同的流可以指定不同的加密过滤器。

在流被访问前必须获得解密该流的授权,此时加密字典中AuthEvent的键值为DocOpen。如果获取授权失败,则reader或安全句柄就会将访问流看成是错误。AuthEvent的键值也可以为EFOpen,这表示存在一个加密的嵌入文件,其加密过滤器用与初始加密字符串和流的过滤器不同。

加密过滤器字典点的常用键:

安全句柄可以向加密过滤器字典添加自己的私有数据。

公钥安全句柄添加的额外键值对:

更多相关推荐:
微电影、影视作品、DV个人总结范文格式

微电影拍摄总结本片根据真实故事改编,据不完全统计许多走向犯罪道路以及自杀的青少年中,近半数存在父母关系不和的家庭问题,家庭之爱缺失成为孩子过早进入社会,受到不良环境影响的重要原因。本片选材比较好,主题发人深省,…

工作总结写作格式

工作总结格式一般分为:标题、主送机关、正文、署名四部分。(1)标题。一般是根据工作总结的中心内容、目的要求、总结方向来定。同一事物因工作总结的方向——侧重点不同其标题也就不同。工作总结标题有单标题,也有双标题。…

工作总结格式及范文(免费)

昌隆房产第1页个人工作总结通常个人工作总结主要是对已做过的工作进行回顾分析并提到理论的高度肯定已取得的成绩指出应汲取的教训以便今后做得更好些个人工作总结一般的格式为标题前言主体结尾四部分标题即个人总结的名称有时...

个人年终工作总结格式及范文

个人工作总结:通常个人工作总结主要是对已做过的工作进行回顾、分析,并提到理论的高度,肯定已取得的成绩,指出应汲取的教训,以便今后做得更好些。一、个人年终工作总结格式第一:总结一般的格式为标题、前言、主体、结尾四…

报告的格式范文

报告的格式范文公文写作报告格式范文报告是向上级机关汇报工作反映情况提出意见或者建议答复上级机关的询问时使用的公文一报告的使用范围报告使用范围很广按照上级部署或工作计划每完成一项任务一般都要向上级写报告反映工作中...

个人工作总结格式及范文

个人工作总结工作总结的结构形式及其内容(应付公司的那种总结,如果没有要求,一千来个字就差不多了。给自己存档看的总结,字数越多越好,时间容易淡化细节记忆!)一、标题:1)发文单位名称+时间+文种如《铜仁地区烟草专…

工作总结要求格式及范文

工作总结要求格式及范文工作总结的格式是什么样的应该怎么写工作总结的格式和我国通用的公文格式一样目前我国通用的公文载体书写装订要求的格式一般为公文纸一般采用国内通用的16开型推荐采用国际标准A4型供张贴的公文用纸...

寒假社会实践报告格式及范文

寒假社会实践报告格式及范文系部名称专业年级班级姓名学号实践单位XXXX有限公司实践时间20xx年月日至20xx年月日共天实践报告正文一实践目的介绍实践的目的意义实践单位或部门的概况及发展情况实践要求等内容这部分...

工作总结格式及范文(免费)

昌隆房产第1页个人工作总结通常个人工作总结主要是对已做过的工作进行回顾分析并提到理论的高度肯定已取得的成绩指出应汲取的教训以便今后做得更好些个人工作总结一般的格式为标题前言主体结尾四部分标题即个人总结的名称有时...

英语应用文写作格式总结[1]

英语应用文写作格式总结常见的应用文格式1备忘录memo2邀请函invitation3求职信ajobapplicationletter4感谢信5通知notice6请假条aleaveofabsence7Email备...

20xx年终总结格式与范文.doc

个人年终总结格式与范文我们常常写的个人工作总结主要是对已做过的工作进行回顾分析肯定已取得的成绩指出应汲取的教训以便今后做得更好些工作总结的种类很多如思想总结学习总结生产总结工作总结个人总结集体总结阶段总结季度总...

调查报告格式及余依优秀范文

调查报告格式及余依优秀范文调查报告格式及范文一全面探索中国统计调查网络建设对于国家调查机构顺利开展抽样调查工作具有十分重要的现实意义和可持续发展的战略意义本文拟通过对陕西调查队系统调查网络建设的探索共同探寻国家...

总结范文格式(41篇)