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

Posted

技术标签:

【中文标题】使用多个密钥进行加密/解密【英文标题】:encryption/decryption with multiple keys 【发布时间】:2010-10-10 11:27:47 【问题描述】:

是否可以对数据进行加密,以便可以使用多个不同的密钥对其进行解密?

例子:

我已使用密钥 1 加密数据,但我希望能够使用密钥 2、3 和 4 解密。

这可能吗?

【问题讨论】:

当前的答案似乎实际上多次加密了一个公共密钥,这增加了与每个添加的收件人成比例的标头长度。我敢打赌,有一种方法可以产生所需的效果,其中多个密钥可以以某种方式使用模逻辑解密同一条消息。当然,这个概念的一个副作用是许多密钥会解密,而不仅仅是你知道的那些,但这可能与许多输入可以产生相同哈希的方式无关,而不仅仅是你知道的输入。只要熵足够高。我想知道基于模的密钥方案是否会存在? 【参考方案1】:

GnuPG 在标准中进行多密钥加密。

以下命令将使用 Alice 的公钥和 Bob 的公钥加密 doc.txt。 Alice 可以使用她的私钥解密。 Bob 也可以使用他的私钥解密。

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

此功能在标题为“Encrypting and decrypting documents”的用户指南部分中有详细说明

【讨论】:

同上。知道如何做到这一点很酷,但我找不到 hide no man page。 @Mitch, I posted an answer 可能有我们的答案! (如果是/否,请测试并推荐 - 非常感谢!) @MarkusQ,请参阅上面我对 Mitch 的link。如果可以,请测试/谢谢! :-) 所以这会产生 1 个加密文件,可以使用任一私钥读取,而不是每个密钥 1 个文件? @user8675309,是的。数据由公共对称密钥加密。只有对称密钥被每个接收者的公钥加密。它不会为每个收件人重新加密整个数据。【参考方案2】:

是的,有可能

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

命令行

这里是如何通过gpg 命令行(如David Segonds' answer 中所述):

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

图形用户界面

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

机制

信息安全有个问题,GPG File size with multiple recipients?, that explain the encryption mechanism:

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

[...] 当加密给多个收件人时,这 标头被多次放置,提供唯一加密版本 每个收件人使用相同的对称密钥

【讨论】:

特别感谢最后两句话:他们现在把一切都说清楚了!【参考方案3】:

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

这样做的一个原因是,像 AES 这样的对称加密算法通常比像 RSA 这样的非对称加密算法快很多。因此,GnuPG 只需使用 RSA 加密约 256 位(会话密钥),并且可以使用 AES 使用该会话密钥加密数据(尽可能大!)。 Intel 机器甚至有一个内置指令AES-NI,用于在硬件中执行算法的一些步骤,这使得 GnuPG 在加密/解密数据方面更加敏捷。

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

另请参阅gpg man page 中的--show-session-key 参数,以便能够仅解密会话密钥,例如允许第三方解密已加密给您的文档,而无需将您的私钥传输给他们或明文数据。

【讨论】:

感谢您解释加密文档不是 n 倍大,其中 n 是签名者的数量。【参考方案4】:

是的,这是可能的。谷歌“多方加密”作为开始。

AFAIK,虽然没有将它们放入并使用它们的包。

-- MarkusQ

附:有关如何完成它的草图,请考虑这个。加密的消息包括:

有效载荷,使用一次性密匙加密 一次性密码本,使用 key1 加密 一次性密码本,使用 key2 加密 ... 一次性密码本,用 keyN 加密

持有密钥 i 的接收者只需用他们的密钥解密他们的 pad 副本,然后解密有效负载。

但是,这只是证明它可以完成并且会suck作为实际实现。如果可能的话,您应该避免滚动自己的加密。如果你不明白为什么,你应该绝对避免滚动你自己的加密。

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

如果我错了,而 Gnu 工具会这样做,请使用它们。但我似乎找不到任何有关如何操作的信息。

【讨论】:

这可能很糟糕的是,一旦你知道了一次性密码,你就有了一个已知的纯文本,以及其他密钥的加密值。使用此信息,您可以更轻松地找出其他键是什么。 谷歌搜索“多方加密”并没有出现太多。包含这种情况的“广播加密”可能会让您有更好的运气。 @Kibbee:密钥不是秘密的,它们是公开的。因此,更容易找出它们是什么并不重要。 (这些方案仅与只能用于加密而非解密的密钥一起使用。) 我很确定实际的实现不使用共享一次性便笺簿(它需要与纯文本和加密文本一样大,从而使消息大小加倍),但实际上使用共享的对称加密密钥(通常比消息小得多)。【参考方案5】:

多个(多于两个)密钥 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)

该算法可用于例如提高洋葱路由器的速度。

【讨论】:

以上是关于使用多个密钥进行加密/解密的主要内容,如果未能解决你的问题,请参考以下文章

RSA的公钥、私钥

多个收件人的 SMIME 解密

加密解密

怎么在ios进行rsa公钥加密,java做rsa私钥解密

非对称加密和对称加密

js中常见的数据加密与解密的方法