【问题标题】:How do I tell if OpenPGP encryption is symmetric or asymmetric?如何判断 OpenPGP 加密是对称的还是非对称的?
【发布时间】:2016-02-05 19:51:54
【问题描述】:

有没有办法判断通过 GNU Privacy Guard 加密的内容是对称的还是非对称的(无需解密或已经知道如何开始)?怎么样?

无论如何(对于那些想知道我在做什么的人),我使用 Python 3.x 编写了一个基于 GUI 的 IDE,它可以打开对称加密的文件(也可以保存它们)。它可以打开非对称加密文件(输入密码以使用您的密钥而不是密码来解密对称加密的文件)。但是,它不知道它们是非对称的,如果保存,它将用对称加密的文件覆盖它们。能够不对称地保存它们也很好。我的编辑器在 Linux 上使用gpg 命令行程序(没有gpg 库或类似的东西)。

我可以在非对称加密的密码提示上设置一个复选框,但我不想这样做,所以它必须是用户手动操作。

对于我自己的个人文件,我可以在保存的文件中添加某种标记来区分,但我希望它能够正确打开它们,即使它们不是在我的 IDE 中创建的。

我知道有一个标题类似的问题,但正文中提出的问题根本不同。

【问题讨论】:

    标签: python-3.x encryption gnupg openpgp


    【解决方案1】:

    OpenPGP 是一种混合密码系统,这意味着消息(或文件)始终使用所谓的会话密钥进行对称加密。会话密钥再次使用非对称加密(使用公钥)或对称加密(使用字符串到密钥函数)进行加密。

    这有技术原因(非对称加密对于大量数据非常很慢),但也有实际原因:通过多次加密小会话密钥(每个接收者一次),您还可以有多个具有不同密钥的收件人,甚至在单个 OpenPGP 消息中混合使用非对称(公钥)和对称(基于密码)加密。

    每个会话密钥的加密副本形成一个 OpenPGP 数据包,一个带有标签 1 的数据包(Public-Key Encrypted Session Key Packet)或一个带有标签 3 的数据包(Symmetric -Key 加密会话密钥包)。 OpenPGP 消息中的那些数据包可以使用pgpdump 轻松分解。一个使用 GnuPG 创建 OpenPGP 消息的示例,该消息既为我自己的密钥加密,又为密码短语foo 对称加密:

    $ echo foo | gpg --recipient a4ff2279 --symmetric --passphrase foo --encrypt | pgpdump
    Old: Public-Key Encrypted Session Key Packet(tag 1)(524 bytes)
        New version(3)
        Key ID - 0xCC73B287A4388025
        Pub alg - RSA Encrypt or Sign(pub 1)
        RSA m^e mod n(4096 bits) - ...
            -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
    Old: Symmetric-Key Encrypted Session Key Packet(tag 3)(46 bytes)
        New version(4)
        Sym alg - AES with 128-bit key(sym 7)
        Iterated and salted string-to-key(s2k 3):
            Hash alg - SHA512(hash 10)
            Salt - 0c a6 e6 1d d2 f4 9a 50 
            Count - 102400(coded count 105)
        Encrypted session key
            -> sym alg(1 bytes) + session key
    New: Symmetrically Encrypted and MDC Packet(tag 18)(63 bytes)
        Ver 1
        Encrypted data [sym alg is specified in sym-key encrypted session key]
            (plain text + MDC SHA1(20 bytes))
    

    前两个数据包中的每一个都形成了一个密钥,用于打开对称加密和 MDC 数据包中的加密字符串

    这也已经解释了如何分析消息是如何加密的:查看数据包,寻找标签 1 或 3 数据包,指示非对称或对称加密(并注意两者都可能存在)。看来你很幸运,Python GnuPG 模块已经自带了ListPackets 类,所以你既不需要接口pgpdump,也不需要编写自己的OpenPGP 解析器。

    【讨论】:

    • 感谢您提供详细信息。 GNU Privacy Guard 命令行工具是否有任何查询功能/工具可能会偶然产生一些结果?我没有使用 Python GnuPG 模块。
    • 您可以在--batch 模式下选择--list-packets,它不会要求提供凭据,但会打印一个类似于pgpdump 的列表。您确定使用框架而不是手动解析 GnuPG 的输出不是一个更好的主意吗?编写合理的解析器是一项乏味且容易出错的任务。
    • 通常,--with-colons 返回一个更容易解析的输出。很遗憾,--list-packets 没有,这将使分析 OpenPGP 消息变得更加容易。
    • 我在使用框架时遇到的唯一两个问题是: 1. 文档(我之前尝试过使用库来解决问题,但这太难了。) 2. 许可。如果我使用这些库,我将不得不使用 GNU 许可证(这并不是世界末日,但我有自己的免费许可证)。在大多数方面,我对解析相当满意。命令行工具的文档和使用要多得多。哦,还有第三个原因(如果我让它跨平台,我不希望 Windows 用户必须有一个编译器来安装库。)
    • --list-packets 没有直接说出“对称”和“不对称”这两个词,但我看到了很多我可以处理的差异。谢谢!但是,如果有的话,我必须研究系统之间的可变性。
    【解决方案2】:

    由于您使用的是 linux 命令,我认为您可以尝试使用“文件”实用程序来检查标头并判断加密是对称的还是非对称的。

    输出将是这样的(在 Ubuntu 14.04 中测试):

    Command: file symm_encrypted.txt.gpg
    Output: GPG symmetrically encrypted data (CAST5 cipher)
    
    Command: file asymm_encrypted.txt.gpg
    Output: GPG encrypted data
    

    【讨论】:

    • file 不包含完整的 OpenPGP 解析器,对我来说,二进制编码的对称加密失败了,通常是两者的组合。
    • @JensErat 哦,看来我忘了提一些非常重要的事情。我拥有的加密文件是装甲的(尽管我也希望能够处理不是的文件)。 @semperfids,我收到以下有关对称和非对称加密的消息:myFile.asc: PGP message 我想知道它是否与它的装甲有关,或者是否与其他加密设置有关(我没有使用默认设置)压缩方法和类似的东西)。
    • 是的,它是制造信息的装甲,所以它没有显示它是否是对称的(但它不会说它是否出于某种原因不对称;虽然有一点足以区分两者之间,只有一个存在)。我试过有无装甲。它可以在没有为对称加密保护的情况下工作;对于不对称,它说myFile.gpg: GPG encrypted data。所以,我可以对它进行亲爱的检查并检查它。这至少应该适用于 Linux(不过,总有一天我需要制定一个长期的跨平台解决方案。)
    猜你喜欢
    • 2011-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2019-07-29
    • 2015-10-11
    • 2011-04-05
    相关资源
    最近更新 更多