我可以想象在RSA中实现的类似功能,向所有人发送公钥,同时为每个其他成员同时加密和解密消息。例如,一个聊天室中有3个人。个人A发送“ Hello guys”两个独特的密文消息,个人B和个人C接收并使用它们自己的私钥分别对其进行解密。这行得通,但似乎效率低下,而且有些偶然。
是否存在一种普遍接受的算法,该算法允许多方同时使用公钥加密?
(再次,这不会应用于任何生产级别的系统。这只是出于我自己的学术好奇心。)
#1 楼
“组加密”通常不是您所追求的。组加密算法努力实现以下目标:给定消息是加密的,并且只有在足够多的组成员协作时才可以解密。这不是您想要的;您想要的是一个系统,可以对给定的消息进行一次加密,并且收件人组的每个成员都可以独立于所有其他消息进行解密。所需的技术术语是广播加密。在蓝光光盘上完成的一个特定且颇具挑战性的案例称为AACS。即:
每个蓝光读取设备都有自己的私钥。
光盘内容只能由允许的设备(这是“收件人组”)读取。数以十亿计。
在光盘中包含特定于每个目标设备的数据是不切实际的(每个人使用相同的光盘,并且目标设备太多)。
通信仅是单向的(设备是脱机,因此光盘内容必须足够。)
媒体制作商希望保留某些“撤销功能”,以便新光盘的内容不能被某些已知的“破解”设备读取,而仍可以被其他设备读取。 (这是关键点)无法以任何方式(因为它们没有网络功能)进行“更新”。
对于小组(作为聊天服务器,只有几十个收件人),问题很容易:
每个组成员都有一个公钥/私钥对。
通过发送t来使所有成员都知道一个对称的组密钥K。 o每个成员都用他的公共密钥加密K。
要添加一个小组成员,只需向他发送用他的公共密钥加密的K。
要删除一个小组成员,因为不能强制健忘,所以创建一个新的组密钥K'并将其发送给所有其余成员。
该系统中最大的开销是组密钥更新,这仅在必须删除成员时才需要,并且开销与组的大小成比例(具有2048位密钥的RSA加密值是256字节,即只要组不超过几百人,就可以忍受。)
评论
$ \ begingroup $
好的答案。我认为可以通过对这种过程合理地处理密钥刷新的频率进行评论,来改进最后一段,因为密钥交换成本肯定是人数和费用的函数吗?如果密钥更新频率不高,我可以忍受得很糟糕,但是如果人们每隔几分钟就要离开,我就不想发送数百次密钥加密吗?
$ \ endgroup $
–密码学家
2013年12月18日16:00
$ \ begingroup $
好吧,如果有人退出了,则无需更新组密钥。仅当您希望以前的组成员变得无法阅读后续消息时才需要更新组密钥-即当某人决定入睡时并不需要这样做;当您要逐出小组成员时,您可以更新密钥。这应该与禁止/踢参与者一样频繁(即非常罕见)。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
13年12月18日在16:03
$ \ begingroup $
好点了(很高兴您能理解我的言论!){与往常一样,我的+ 1 /感谢答案,此消息将在短短几分钟内自动销毁,以使评论保持整洁}
$ \ endgroup $
–密码学家
13年12月18日在16:04
$ \ begingroup $
@Thomas-如果您将聊天消息(有界TTL)更改为存储中的文档(无界TTL),那么离开该小组的成员可能会造成极大的痛苦。在这种情况下,工作似乎将受到存储中文档的约束,而不是该组中的成员。
$ \ endgroup $
–user10496
2015年4月23日在23:51
$ \ begingroup $
@ThomasPornin,我不确定我的问题和这里的问题是否完全相同(我觉得我的问题比这个问题要简单一些)。您能否看一下security.stackexchange.com/questions/194555/…,看看是否存在更简单的解决方案(或者本质上解决方案是相同的)?
$ \ endgroup $
–chen
18-09-27在4:46
评论
我使用了一个加密的IRC系统,用于频道聊天,它会根据频道密码生成一个密钥,因此使用了预共享的密钥方案。加密频道的邀请是通过受DH保护的用户到用户频道完成的,并包含密码。它很简单,并将问题分解为密钥分发之一我想我明白你的意思。一个幼稚的解决方案是为组中的每个人提供公共/专用密钥对,并使用该密钥对来解密组中的消息/从组中解密消息,以及他们的个人签名。问题是每次成员退出(或被踢出)组时(我实际上正在从事类似工作)都需要重新计算密钥。
“是否存在一种普遍接受的算法,该算法允许多方同时使用公钥加密?” -是的,但这取决于应用程序。聊天应用程序与云存储应用程序具有不同的要求。对于聊天应用程序,消息具有有限的TTL。对于云存储应用程序,文件具有无限制的TTL。很少的观察会产生大问题,因为吊销/重新设置键可能会成为一个痛点。