有没有办法判断通过GNU Privacy Guard加密的内容是对称的还是非对称的(没有解密或已经知道开始)?怎么样?
无论如何(对于那些想知道我在做什么的人),我使用Python 3.x编写了一个基于GUI的IDE,可以打开对称加密的文件(并保存它们)。它可以打开非对称加密文件(输入密码以使用密钥而不是密码来解密对称加密文件)。但是,它并不知道它们是非对称的,如果保存,它们会用对称加密的文件覆盖它们。能够非对称地保存它们会很好。我的编辑器使用Linux上的gpg
命令行程序(没有gpg
库或类似的东西)。
我可以在密码提示上设置一个非对称加密的复选框,但是我不想这样做,所以它必须是用户手动的东西。
对于我自己的个人文件,我可以为保存的文件添加某种标记以区分,但我希望它能够正确打开它们,即使它们没有在我的IDE中创建。
我知道有一个类似标题的问题,但身体中提出的问题根本不同。
答案 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解析器。