如何判断 OpenPGP 加密是对称的还是非对称的?

How do I tell if OpenPGP encryption is symmetric or asymmetric?

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

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

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

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

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

由于您正在使用 linux 命令,我认为您可以尝试使用 "file" 实用程序来检查 header 并判断加密是对称的还是非对称的。

输出将是这样的(在 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

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

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

会话密钥的每个加密副本都形成一个 OpenPGP 数据包,可以是带有标记 1 的数据包(Public-Key 加密会话密钥数据包)或带有标签 3 的数据包(对称密钥加密会话密钥数据包)。使用 pgpdump 可以轻松分解 OpenPGP 消息中的那些数据包。使用 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 class,所以你既不需要接口 pgpdump 也不需要编写自己的 OpenPGP 解析器。