代码之家  ›  专栏  ›  技术社区  ›  Stuart Whitehouse

解密加密PDF文档时如何在RC4和AES之间进行选择

pdf
  •  0
  • Stuart Whitehouse  · 技术社区  · 7 年前

    我正在编写代码来解析和分析PDF,目前正在处理文档中的加密。我无法从规范中理解如何在两种可能的加密方法之间进行选择。PDF规范的一些细节… 这个 V Encrypt Dictionary的字段支持以下值:

    1=“算法1:使用RC4或AES算法加密数据”in 7.6.2,“通用加密算法”,加密密钥长度为40位;见下文。

    2=(pdf 1.4)“算法1:数据加密 使用7.6.2“一般加密”中的“RC4或AES算法” 算法,“但允许加密密钥长度大于40 位。

    Length 字段定义为:

    PDF文件:

    一种称为RC4的专有加密算法。[…]

    AES(高级加密标准) 算法(从PDF 1.6开始)。……加密后的数据长度被四舍五入为倍数 块大小,固定为16字节…

    我有一个v=2,length=128的示例文档,它是pdf 1.6。我假设在PDF 1.6以后的文档中使用了AES,但是用AES解密失败(不只是因为流的长度不是128位的倍数)。用RC4解密成功。

    我的问题是,我的代码如何知道在处理文档开始时初始化RC4解密?我在加密字典中没有看到指定使用哪种方法的任何内容。

    1 回复  |  直到 7 年前
        1
  •  2
  •   dwarring    7 年前

    我认为这里的规格有点混乱

    2=(pdf 1.4)“算法1:使用RC4或AES加密数据 算法”在7.6.2,“一般加密算法”,

    是一个 参考 文档中描述RC4和AES加密的部分,但是 /V 4 需要实际启用AES加密。

    4=(PDF 1.5)安全处理程序使用由CF、STMF和STRF条目指定的规则定义文档中加密和解密的使用。

    所以 V 4 或更高,是一个先决条件,从那里你需要进一步咨询 /CF /StmF ,和 /StrF 条目。

    一个基本的加密字典 AES 加密,可能看起来像:

    /Encrypt <<
      /V 4
      /R 4
      /StmF /StdCF
      /StrF /StdCF
      /CF <<
        /StdCF <<
          /CFM /AESV2
        >>
      >>
      % + other entries /O /U Length etc
    >>