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

时间:2016-02-05 19:51:54

标签: python-3.x encryption gnupg openpgp

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

由于您使用的是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

答案 1 :(得分:1)

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

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

会话密钥的每个加密副本形成一个OpenPGP数据包,包含带有标记1的数据包(公钥加密会话密钥包)或带有标记3的数据包(对称-Key加密会话密钥包)。可以使用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类,因此您既不必连接pgpdump也不必编写自己的OpenPGP解析器。