使用多个密钥进行加密/解密


Answers:


170

GnuPG以标准方式进行多密钥加密。

以下命令将doc.txt使用Alice的公共密钥和Bob的公共密钥进行加密。爱丽丝可以使用她的私钥解密。鲍勃还可以使用其私钥解密。

gpg --encrypt --recipient alice@example.com \
    --recipient bob@example.com doc.txt

用户指南的标题为“ 加密和解密文档 ”的部分详细介绍了此功能。


同上。知道该怎么做很酷,但是我找不到隐藏任何手册页。
MarkusQ

@米奇,我发布一个答案可以得到我们的答复!(如果愿意,请测试并推荐-非常感谢!)
pythonlarry 2013年

@MarkusQ,请参阅上方的我的Mitch 链接。测试/谢谢,如果可以!:-)
pythonlarry 2013年

因此,这导致可以使用任一私钥而不是每个密钥读取1个文件的加密文件?
user8675309 '17

7
@ user8675309,是的。数据由公共对称密钥加密。每个接收者的公共密钥仅加密对称密钥。它不会为每个收件人重新加密整个数据。
wisbucky

55

是的,有可能

是的,可以对多个收件人进行加密。当您认为自己可能希望能够阅读已发送给某人的内容并做到这一点时,这似乎合乎逻辑,因此需要在收件人列表中。

命令行

这是通过gpg命令行执行的方法(如David Segonds的答案中所述):

gpg --encrypt \
  --recipient alice@example.com \
  --recipient bob@example.com \
clear-message.txt

GUI客户端

您的GUI必须提供一种可以为多个人加密的方法

机制

有一个关于信息安全多个收件人的GPG文件大小的问题吗?,说明了加密机制

GPG使用对称密钥对文件加密一次,然后放置一个标头,用于标识目标密钥对和对称密钥的加密版本。

加密给多个接收者后,此标头会被放置多次,从而为每个接收者提供相同对称密钥唯一加密版本


4
特别感谢最后两句话:他们现在把一切都弄清楚了!
radistao '16

31

通常,GnuPG和PGP客户端通常使用称为“会话密钥”的对称密钥来加密实际数据。然后,使用每个“收件人密钥”(即您使用-r /-收件人指定的密钥)对会话密钥进行加密。有时将其称为混合密码。现在,我相信GnuPG默认情况下使用256位会话密钥和AES将明文数据加密为该AES-256会话密钥,并且您的接收者密钥是RSA / DSA / ECDSA / etc。在这种情况下为非对称密钥。

这样做的原因之一是,像AES这样的对称密码算法通常比像RSA这样的非对称密码算法要快得多。因此,GnuPG仅需使用RSA加密约256位(会话密钥),即可使用AES使用该会话密钥对数据加密(与您想要的一样大!)。英特尔机器甚至具有内置指令AES-NI,可以在硬件中执行算法的某些步骤,这使GnuPG在加密/解密数据时更加灵活。

这样做的另一个原因是,它允许将经过PGP加密的文档加密为多方,而不必将文档的大小加倍。请注意,当您为加密文档指定多个收件人时(例如gpg -ea -r Alice -r Bob -o ciphertext.asc)存储的加密文档(ciphertext.asc)的大小不是您刚刚将其加密为Alice的2倍。

另请参见gpg手册页中--show-session-key参数,以仅解密会话密钥,例如,允许第三方解密对您加密的文档,而不必将私钥或明文数据传输给他们。


1
感谢您对加密文档不大于n倍的解释,其中n是签名者的数量。
theartofbeing

4

是的,有可能。Google以“多方加密”为起点。

AFAIK,虽然没有drop'em并使用'em包。

-MarkusQ

PS有关如何完成的草图,请考虑一下。加密的消息包括:

  • 有效载荷,用一次性垫加密
  • 一个时间垫,使用key1加密
  • 一个时间垫,使用key2加密
  • ...
  • 一个时间垫,使用keyN加密

持有密钥的接收者i只是用密钥解密他们的便签本副本,然后解密有效载荷。

但是,这只是一个证明,表明它可以完成,并且会作为实际的实现而失败。如果有可能,应该避免进行自己的加密。如果你不明白为什么,那你绝对应该避免使用自己的加密方式。

-----编辑------------

如果我错了,并且Gnu工具可以这样做,请使用它们。但是我似乎找不到有关如何执行操作的任何信息。


1
可能令人讨厌的是,一旦您知道一个时间垫,便拥有了一个已知的纯文本以及其他密钥的加密值。使用此信息,您可以更轻松地找出其他键。
Kibbee

2
谷歌搜索“多方加密”并没有太多。使用“广播加密”(包括这种情况)也可能会更好。
staktrace

1
@Kibbee:密钥不是秘密,而是公开的。因此,更容易找出它们是什么都没关系。(这些方案仅与只能用于加密而非解密的密钥一起使用。)
David Schwartz,

5
我很确定实际的实现方式不会使用共享的一次性密码(它需要与纯文本和加密的文字一样大,从而使消息大小加倍),但实际上使用共享的对称加密密钥(通常比消息小得多)。
约阿希姆·绍尔

-16

多个(超过两个)密钥RSA 可能就是这样-好吧,我不是数学家,所以此算法不一定安全,我只想给出一个主意。

m = p * q * r; p,q,r是大质数

fi(m)=(p-1)(q-1)(r-1)

d ==(e1 * e2 * e3 * ... * ei)^(-1)(mod fi(m)); e1 ... ei是任意数,计算d来满足方程

y1 == x ^ e1(mod m)

y2 == y1 ^ e2(mod m)

y3 == y2 ^ e3(mod m)

...

x == yi ^ d(mod m)

例如,该算法可用于提高The Onion Router的速度。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.