我注意到,当我使用GnuPG加密多个收件人的文件时,加密消息的大小似乎与收件人的数量不成正比。
例如,我测试的文件是纯文本中的836字节。
由于加密数据应该看起来是随机的,我认为这种差异并不是由于压缩造成的。不是所有的51个键都是相同的密钥大小/算法,但我不知道这怎么能解释如此惊人的平均文件大小。
如何才能为51人加密一个836字节的文件,这样他们就可以将我的文件解密回原来的大小,而无需为每个接收者追加至少836字节?
发布于 2014-12-05 22:33:17
因为每个收件人的整个邮件都不是单独加密的。
相反,随机选择一个对称加密密钥,使用该密钥对消息进行加密一次,然后为每个收件人单独加密加密密钥,使用该收件人的公钥,并将其附加到加密的消息中。
每个接收方首先使用其私钥解密对称加密,然后使用该密钥解密消息。
因为键通常比明文短得多,这就节省了很多空间。(它还让收件人知道他们都解密了同一条消息。如果邮件是为收件人单独加密的,则狡猾的发送者可以向每个收件人发送不同的消息,假装它们都是同一条消息的副本。)
使用您的数据,将第二个收件人添加527字节。第二个接收者可能有一个512字节的密钥,加上15个字节来识别接收者.连续的收件人将拥有不同的密钥长度和不同的标识数据,因此每个收件人的添加量都会有所不同。
发布于 2014-12-06 00:33:58
OpenPGP定义了一种混合加密系统,它结合了非对称(公钥)加密和对称加密的优点。非对称加密在密钥管理方面非常出色,但对大量数据的加密速度非常慢;另一方面,对称加密将需要与您希望单独通信的每个人交换密钥,但性能很好。
混合加密系统使用非对称加密来加密对称加密的随机密钥,而实际消息则是对称加密的。在OpenPGP中,这个键被称为会话密钥。
这还有另一个优点:如果要处理多个收件人,则不需要对消息进行多次加密。相反,所需要做的就是为每个人加密会话密钥。您可以通过对多个人加密后查看文件中包含的数据包来观察这一点(在这里,pgpdump
提供了比gpg --list-packets
更好的输出):
echo 'foo' | gpg --recipient a4ff2279 --recipient d745722b --encrypt | LANG=C 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(4093 bits) - ...
-> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
Old: Public-Key Encrypted Session Key Packet(tag 1)(268 bytes)
New version(3)
Key ID - 0xDAA855623A5E68F7
Pub alg - RSA Encrypt or Sign(pub 1)
RSA m^e mod n(2046 bits) - ...
-> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
New: Symmetrically Encrypted and MDC Packet(tag 18)(63 bytes)
Ver 1
Encrypted data [sym alg is specified in pub-key encrypted session key]
(plain text + MDC SHA1(20 bytes))
公钥加密的会话密钥包包含双倍,每次加密(子)密钥一次.不同的密钥大小可以解释不同的密钥大小(RSA 2048 k和RSA 4096 k用于子项)。数据隐藏在对称加密和MDC数据包中。
https://security.stackexchange.com/questions/74412
复制相似问题