可以使用GPG生成RSA密钥对(用于加密和签名-您不应该使用两者使用相同的键)。
这背后的原因是什么?
也许我对公钥加密的理解存在缺陷,但是我认为操作与此类似:
当Bob想要加密发给Alice的消息时,他使用Alice的公钥进行加密。然后,爱丽丝使用她的私钥对消息解密。
当爱丽丝想要对Bob进行数字签名时,她使用她的私钥对其进行签名。然后,Bob使用Alice的公钥来验证签名。
为什么使用不同的密钥进行加密和签名很重要?这是否还意味着您需要向要与之通信的每个人分发两个公钥?我想这很容易导致一些混淆和按键误用。
#1 楼
多数情况下,对于签名和加密密钥的使用,管理方法和时限有所不同。对于不可抵赖性,您永远不希望别人控制您的签名密钥,因为它们可能会冒充您。但是您的工作场所可能希望保存您的加密密钥,以便其他需要访问的人可以获取您已加密的信息。
您还可能希望签名密钥在很长一段时间内有效,因此人们世界各地的人都可以检查过去的签名,但是使用加密密钥,您通常希望更早地将其滚动,并能够撤销旧的签名而没有太多麻烦。
#2 楼
对签名和加密使用相同的密钥对可能是不安全的。这样做可能会发起攻击,具体取决于您使用的特定公钥方案。这种使用不是系统设计的目的,因此,以非设计方式使用系统“会导致保修”。不要这样做。在找麻烦。
评论
你能提供一些细节吗?什么样的攻击破坏了这种用法? (尽管我同意,无论该系统不是针对这种用法而设计的...)
–AVID♦
2011年3月9日在9:20
当然。在设计较差的系统中,如果您可以要求解密所需的任何密文C并获取对应的Decrypt(C),则可以通过让C = Hash(M)和C来伪造消息M上的签名。然后要求Decrypt(C)。现代系统并不容易受到这种特定攻击,但是很难知道在任何特定系统上是否可能存在这种攻击的更高级版本。如果您将密钥重新用于加密和签名,则通常会使所有安全性证明或已完成的其他审查无效。
– D.W.
2011-3-11在6:39
我懂了。很有道理,谢谢!但据我了解,目前尚无已知的实际攻击方法? (除了不良做法,更重要的是缺乏保证)
–AVID♦
2011年3月11日在7:46
可能会有实际的攻击,具体取决于在哪里使用(其他)密钥。正如DW所说的,您需要做的就是能够为您解密所有C语言-例如,在使用随机随机数的身份验证握手中,这可能是可能的。尽管可能可以根据身份验证协议进行设计,但是通过首先避免将密钥用于多个目的来简单地使其成为不可能,这将更容易,更安全。
– frankodwyer
2011年4月19日在12:46
我同意这是一个坏主意。不过,如果我没有记错的话,S / MIME似乎同时提供了一个密钥/证书对(加密和签名)。
–lxgr
13年7月19日在13:00
#3 楼
由于某些原因,我们不应该使用相同的密钥进行加密和签名。我们需要备份用于加密数据的秘密密钥。稍后,我们想解密一些旧的加密消息,但是我们不需要备份密钥进行签名。如果攻击者找到了密钥,我们可以告诉我们的CA撤销它,并获得新的秘密密钥进行签名,而无需备份。
更重要的是:如果我们使用相同的密钥进行加密和签名,则攻击者可以使用它来解密我们的加密消息。他/她将执行以下操作:
攻击者必须选择一个随机数
r
,其中r
必须具有GDC(N, r) = 1
,且
N
是使用的数字用于创建私钥和公钥(N = pq
)然后,攻击者选择新消息(
m′
)并将其发送给发件人以进行签名:。
m′ = m^e.r^e
… (这里
(e,n)
是公钥)发件人签名
m′
时,我们得到。现在,攻击者只需要将其“划分”即可。通过
m′^d ≡ (m^e.r^e)^d ≡ m.r (mod N)
获得r
(秘密消息)。评论
这似乎是针对RSA的,而不是适用于所有非对称密码。
– yfeldblum
2011年1月23日,下午3:15
另外,为什么攻击者可以访问N等?
–AVID♦
2011-3-9在9:22
@Avid Attacker默认情况下可以访问N,因为当您要发布公共密钥时,必须发布(N,e)。
– Am1rr3zA
2011年3月9日在10:48
“当发件人签名为m'时,我们得到m'^ d”为什么?要使用RSA进行签名,您不能简单地对其应用私钥操作。您对其进行哈希处理,然后应用填充。因此,您的攻击无效。 (有例外,使用密钥进行盲签名和加密会对该攻击开放,但是盲签名是一种特殊的应用,而不是常规签名)。
– CodesInChaos
2012年5月13日在21:51
@CodesInChaos过度简化了使用相同密钥进行签名和加密的风险描述。但是在安全领域,应该认真考虑为什么会出现问题的简化示例。另一方面,在某些东西被认为是安全的之前,您需要严格的证明。如果您只是挥舞着赞成和反对某种做法的安全性的论点,则需要谨慎行事。
–卡巴斯德
2014年8月30日在18:13
#4 楼
使用单独的密钥进行签名和加密的原因:在组织中很有用,需要备份或保留加密密钥,以便一旦员工/用户对数据进行解密组织的
不再可用。与加密密钥不同,
签名密钥绝不能由雇员/用户之外的任何人使用,并且也不必且不必保留在托管中。
允许具有不同的到期时间签署加密
密钥。
鉴于加密和签署的基础数学是相同的,只有在攻击者可以说服/欺骗密钥
持有者进行签署的情况下,这是相反的使用相同密钥的未经格式化的加密邮件
,然后攻击者将获得原始消息。
参考文献
https://www.entrust.com/ what-is-pki /
https://www.gnupg.org/gph/en/manual/c235.html
http://www.di-mgt.com.au/rsa_alg.html
评论
请提供3个链接/来源...
– alfonx
15年11月11日在21:10
@alfonx我可能已经忘记了从这些点中获得的原始链接,但是我已经按顺序编辑了参考文献。希望对您有所帮助。不确定是否所有这些都是最可靠的参考,但是如果您使用过PKI,那么这些要点是有意义的。
– moo
2015年12月7日在20:59
@moo point 3仅表示非对称RSA密钥概念。但是,这种攻击在现实世界的文档签名实践中并不存在(例如正在考虑此问题的PGP)。这是因为PGP仅对原始消息的消息摘要(也称为安全哈希)进行签名,而不是对整个消息应用私钥。
–约翰尼·王(Johnny Wong)
17年7月21日在23:45
@JohnnyWong同意使用此概念进行现实世界的攻击将取决于实现。 OP确实以GPG / PGP为例,但是在我看来OP希望对此作法有更一般的推理。鉴于实现的更改经常发生,我认为这一点对于处理PKI的任何人都非常重要,因此我选择不删除第3点。也许我可以对此进行注释,但是我认为我们的评论现在可以达到目的。 。谢谢。
– moo
17年7月27日在18:56
#5 楼
对我来说,主要原因是与密钥管理有关,而不是与密码安全本身有关。对于非对称加密,尤其是您希望公钥有效的时期可能在很大程度上取决于该密钥的预期用途。例如,考虑一个组件必须在其中向其他组件进行身份验证的系统。紧接着,该组件还必须定期在某些数据上创建签名。从理论上讲,单个私钥可同时用于这两个目的。但是,假设出于安全原因,PKI证书颁发机构希望将基于单个证书的成功身份验证的期限限制为两年。同时,数据保留法律可能要求将数据保存五年,并且在整个期间内必须对数据签名进行验证。解决此问题的唯一(合理)方法是为组件提供两个私钥:一个用于身份验证,另一个用于签名。第一个密钥的证书将在两年后过期,而签名证书的身份将在五年后过期。
类似的推理也可以应用于对称密码学:如果出于不同的目的使用不同的密钥,则可以根据单一目的的要求,决定所有密钥管理问题(例如主密钥翻转的频率,备份密钥的时间等)。如果您将一个(主)密钥用于多个目的,则可能会导致需求冲突。
#6 楼
RSA加密基于活板门功能,即一对功能。我将它们称为D
和E
。这些功能的设计应确保D(E(x)) = x
和E(D(x)) = x
(适用于任何x
)。换句话说,D
和E
是逆。使其成为活板门函数的原因是,如果您具有公共密钥,则只能计算E
(实际上是)。如果有私钥,则可以同时计算D
和E
。从该描述中可以很明显地看出加密的工作方式。如果Bob想要向Alice发送加密消息,他将计算
ciphertext := E(plaintext)
。然后,鲍勃将ciphertext
发送给爱丽丝。爱丽丝计算D(ciphertext)
,即D(E(plaintext))
,即plaintext
。现在,让我们谈谈签名的工作原理。如果爱丽丝想签署message
,则她计算signature := D(message)
。然后,她将message
和signature
都发送给Bob。然后,Bob计算validation := E(signature)
。由于signature
是D(message)
,所以validation = E(D(message)) = message
。换句话说:对消息签名,就像在解密消息一样,这就是您的签名。为了验证您的签名,人们可以对签名进行加密,并确保他们能收到您的原始消息。我再说一遍:签名与解密相同。
这是分离签名和加密密钥的基本问题。如果有人可以让您签名,那么他们只是让您解密。
假设您正在经营一家公证公司。如果有人给您10美元和一条消息(例如,歌曲歌词),则您将对该消息签名并将其发送回给您。如果以后有人复制您的歌曲歌词,则可以提供受信任的公证公司的签名,以证明您写了这些歌曲歌词。
现在,假设夏娃截取了一封加密的邮件给您的公证公司。她如何颠覆加密?她会向您发送同样的消息以进行公证!现在,您运行签名操作(记住,该操作与解密操作相同),然后将结果发送回给她。现在,她具有解密的消息。
实际上,协议中的步骤使这种攻击更加困难。例如,PGP(我指的是协议; gpg是此处最常见的实现)不会对原始消息进行签名;它签名消息的哈希。但是在简单情况下,安全证明是最好的。您不希望有关RSA安全性的证明依赖于散列函数。 (例如,很长一段时间以来,许多人都将MD5用作首选哈希,但是今天MD5被认为已经很破损。)RSA的安全性完全取决于您不会使用用于加密的密钥对任意消息进行签名的想法。保持这一要求是确保PGP安全的最佳方法。 (我记得,这是布鲁斯·谢耶尔(Bruce Scheier)的书《应用密码学》中关于不对称加密的最常见的警告。)现在,让我们谈谈您问的另一个问题:“这是否还意味着您需要将两个公用密钥分发给您希望与之通信的每个人?“
“密钥”对用户而言意味着一件事,对于加密实现而言则意味着不同。您可能只需要传达一个用户级别的“密钥”,尽管其中可能包含许多RSA公共密钥。
PGP具有子项的概念。我的主密钥是仅签名密钥。我有一个单独的加密子项。该子项由我的主密钥签名。如果从密钥服务器导入我的PGP密钥,或者从我的网站下载它,那么您将获得我的主密钥和所有子密钥。即使您可能只签名了我的主密钥,我的主密钥也签名了我的加密子密钥,因此您知道它也属于我。这意味着,通过下载我的PGP密钥(包含许多RSA公共密钥),您现在拥有了验证我的签名和加密发送给我的消息所需的一切。
使用子密钥,密钥管理更加有效从加密的角度来看复杂(需要执行额外的密钥验证步骤),但从实际的角度来看则不是(我的PGP密钥包括我的主密钥以及我的所有子密钥)。额外的复杂性隐藏在实现中,并且不会暴露给用户。
评论
是的,这是一个很好的理由。另一个原因是,为两个目的重复使用相同的密钥对可能不安全。
– D.W.
2011年3月9日5:37
“但是您的工作场所可能希望托管您的加密密钥,以便其他需要访问的人可以获得您已加密的信息。” -这可能与对称密钥有关,但与PKI无关。
–user93353
2014年2月17日在9:40
@ user93353如果仅将公共密钥用于加密,那么您反对在工作场所中使用它会受到什么反对?
–nealmcb
14年2月27日,0:24
@ user93353如果您的工作场所使用签名密钥,那么他们可以冒充您,代表您签名声明,使您陷入困境等。我从未听说过这样的好用例。因此,您的签名密钥对应该是您自己的。如果需要托管加密密钥对(例如,提供对您创建但由工作场所拥有的数据的访问),则它应该是单独的密钥对。
–nealmcb
14年2月28日在16:22
@ user93353工作场所经常托管您的私有加密密钥。这样,当他们解雇您时,您会被公共汽车撞到,或者您潜逃到老板的女儿中,他们仍然可以访问您的文件。任何允许使用不在托管中的密钥来加密工作产品的雇主都在麻烦。
– erickson
2014年10月3日在16:21