- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在非对称密码系统的标准使用中,加密是用公钥完成的,而用私钥解密的。
与此相反,将“使用私钥加密”称为“签名”。
尽管有术语和缺乏直接工具的标准工具,但允许实现使用私钥进行加密的加密系统。
谁能清楚解释为什么这种解决方案容易受到攻击?
用户案例:
考虑到爱丽丝想以非传统方式向鲍勃发送一些东西:
爱丽丝(Alice)和鲍勃(Bob)曾经见面,爱丽丝(Alice)给了鲍勃(Bob)一个从她创建的私钥生成的“公钥”,但她警告鲍勃(Bob)保持秘密。并且她对私有密钥保密,并且从未将公开密钥提供给其他任何人。
鲍勃能否确定他从爱丽丝那里收到的消息(前提是这些消息已用爱丽丝私有密钥加密)只能由他读取(前提是他确实对爱丽丝的公共密钥副本保密)?
以及如何将这种加密方式与传统方式进行比较,在我们的案例中,这种方式是鲍勃向爱丽丝发送消息(由爱丽丝的公钥加密)吗?
问题是什么
非对称密钥分别命名为“私有”和“公共”的事实无助于理解我的问题。密钥具有基础属性,是我广播赋予其“公共”属性的“公共密钥”。在回答之前,请先明确区分:我不是在考虑这些密钥的“公共”和“私有”属性,而是“私有密钥”加密与“公共密钥”加密的牢固性。
我不能使用其他术语,即使在这种特殊情况下也会引起误解。
我知道这种情况是非传统的,并且可能导致多种不一致,或者不是非对称加密系统的重点,因为鲍勃和爱丽丝在这里共享某种共同的秘密,这不是非对称加密的重点。
我看到了几个Stackoverflow答案,这些答案表明“私钥”和“公钥”是可交换的(请在下面的答案中阅读)。对于RSA而言,这不是正确的,因为从秘密密钥生成公钥很简单,并且保证在其他方面在计算上不可行。对于非信奉者,使用RSA在openssl中生成密钥的过程是:
生成一个秘密密钥
从秘密密钥中提取公共密钥。
如果“私钥”和“公钥”之间有如此大的差异,那么“私钥”加密与传统的“公钥”加密之间是否存在坚固性差异?
短答案来自长选择答案
对“私钥”到底是什么的误解并没有帮助我。
“私钥”有两种不同的定义。 “实用私钥”和“理论私钥”。
RSA理论的理论私钥与公钥具有数学对称性:
你不能互相推论
无论哪种方式,加密都同样可靠
出于效率方面的考虑,RSA工具中的实用私钥(例如openssl)包含其他信息,并且通常一部分公钥甚至是按惯例设置的。这些假设打破了对称性:
从“实用私钥”中获取公钥是微不足道的
但是加密仍然保持稳定
有关更多详细信息,请参见所选答案!如果仍有误解,请发表评论...
编辑笔记:
非对称加密系统密钥对经常被广告为可交换的(即使在当前的stackoverflow答案中也是如此),我试图反思这一事实,因为它可能是危险的误解,因为在现实生活工具中并非如此。
添加了用户案例,希望这可以澄清我的问题
添加了最终的“简短答案”
最佳答案
在非对称密码系统的标准使用中,加密是用公钥完成的,而用私钥解密的。
这取决于谁在做什么。假设爱丽丝想向鲍勃发送一条消息,只有鲍勃可以解码。爱丽丝使用鲍勃的公钥(在“公钥”的标准定义下,即除其所有者以外的其他人所知道的公钥)对消息进行加密。现在,只有知道Bob的私钥的人(大概唯一知道Bob的私钥的人实际上是Bob)才可以解密Alice发送给Bob的消息。
如果Alice希望Bob知道只有她自己可以发送消息,则可以假设Bob在使用Bob的公共密钥加密消息之前或之后知道她的公共密钥,并可以使用自己的私钥对消息进行加密。假设她用她的私钥加密消息,然后用Bob的公钥加密结果。要阅读该消息,Bob必须使用其(Bob的)私钥解密该消息,然后使用Alice的公钥再次解密结果。如果他阅读的内容现在是明智的文本,那么他知道有人同时知道Alice的私钥(大概是Alice)和他的公钥(可能是任何人)发送了该消息。
在实践中,非对称算法的计算成本很高,因此您真正要做的是选择适当长度的随机会话密钥和商定的标准对称加密算法(例如AES)。然后,使用(相对较快的)对称算法对主要消息进行加密,并将其作为消息的一部分发送。消息的另一部分是加密的(或双重加密的)随机会话密钥。鲍勃可以解密消息的会话密钥部分以获得会话密钥。然后,他将其用于解密邮件的主要部分。
请注意,如果要将消息发送给许多人,则可以对消息进行适当的加密,然后使用接收者的公共密钥为每个接收者加密一次会话密钥。每个接收者只能使用属于他们的密钥来解密会话密钥信息,但实际上所有人都可以解密它。如果邮件是大量邮件(例如2 MB PDF),则与使用每个收件人的公钥分别加密邮件相比,这要经济得多。
与此相反,将“使用私钥加密”称为“签名”。
没有;签名是一个单独的操作。如果您阅读Schneier的“ Practical Cryptography”,您会发现作者建议使用一对公共/专用密钥进行加密,而使用第二对进行签名。例如,签名使用签名密钥中的私钥对原始消息的固定长度的哈希进行加密。任何知道签名密钥的公共密钥部分的人都可以解密签名以获得原始消息的哈希值。大概,同一收件人也可以解密消息(使用签名密钥对的公共密钥),然后可以检查接收到的消息的哈希值是否与从签名派生的哈希值匹配。任何不匹配都表明存在问题,应该丢弃该消息。
有多种方法可以执行这些操作-取决于安全性要求。
但基本要点是,一个人知道非对称密钥的私钥,并且可能有很多人知道非对称密钥的公共部分(这是绝对安全的)。发送者可以使用接收者的公共密钥对数据进行加密;发送者也可以使用自己的私钥对其进行加密。收件人可以使用自己的私钥,并在必要时使用发件人的公钥对接收到的消息进行解密。
IMNSHO,这个问题,即使在大约2009-09-05T13:00-07:00进行了修订,也并不完全一致。
您应该阅读“实用密码学”中的第13章“ RSA”(可能也是在阅读了前面的几章之后,最著名的是第3.3节“公钥加密”)。
加密和解密符号
让我们为讨论正统公钥密码学定义一些表示法。让我们从基本对称加密开始:
C = E(K,m)是加密算法E使用(纯文本)消息m上的密钥K生成的加密消息(密文C)。
P = D(K,C)是解密算法D使用(加密的)消息c上的密钥K发现的纯文本消息(纯文本,P)。
要成为一个工作系统,m = P,所以D(K,E(K,m))= m。
到目前为止,该符号适用于对称加密,因为在加密和解密中都使用相同的值K。任何知道K(以及算法,但Kerckhoff的“秘密在于密钥”原理)的人都可以假定攻击者知道算法-任何相反的假设都是加密的“蛇油”。
在非对称加密系统中,Ea和Da是算法A的加密和解密方法。非对称密码的关键区别在于,Ea使用的密钥Kencrypt与Da使用的密钥Kdecrypt不同。此外,从实际出发,即使您知道Kencrypt,反之亦然,推断Kdecrypt必须在计算上不可行。
通过非对称加密,Alice创建了一对密钥(Salice,Palice)。通常,Salice是秘密密钥,Palice是公共密钥。请注意,Alice知道两个键。重要的是:
Salice和Palice不同。
爱丽丝(Alice)不会让其他人知道其中一个键(Salice);至关重要的是,其他任何人都不知道此信息。
Alice可以让其他人知道其他密钥(Palice),而不会影响系统的安全性。
同样,Bob将创建一对密钥(Sbob,Pbob)。注意:
鲍勃知道钥匙Sbob,Pbob和Palice。
爱丽丝知道钥匙Salice,Palice和Pbob。
爱丽丝向鲍勃发送消息
现在,当爱丽丝想向鲍勃发送消息“ Malice-bob”以便鲍勃可以读取它(但没有人可以读)时,她必须使用鲍勃的密钥Pbob对其进行加密。因此,她创建了一条消息:
Calice-bob = Ea(Pbob,Malice-bob)
鲍勃(从外部证据)知道该消息已使用Pbob加密,因此他知道必须使用Sbob对其进行解密:
Malice-bob = Da(Sbob,Calice-bob)
但是,在这一点上,他只知道该消息来自某个知道他的Pbob密钥的人。除了外部证据外,他不知道它来自爱丽丝。
如果Bob和Alice同意必须对他们的消息进行加密,以使他们双方都确信收到的消息来自另一消息,那么双方都必须确信,除了Alice之外没有其他人知道Salice,并且除了Bob以外没有其他人知道Sbob。 。他们还必须确信Bob知道Palice,而Bob必须确信Palice确实属于爱丽丝,并且Pbob确实是Alice所知,而Alice必须确信Pbob确实确实属于Bob。建立这些信任关系与PKI(公钥基础结构)有关。
假定满足这些条件,那么Alice可以将其消息发送给Bob,以使Bob确信只有Alice可以发送该消息。如前所述,该机制是双重加密:
C1alice-bob = Ea(Salice,Malice-bob)
C2alice-bob = Ea(Pbob,C1alice-bob)
爱丽丝将C2alice-bob发送给鲍勃(连同一些签名或MAC以确认它在传输中没有损坏),然后鲍勃计算:
D1alice-bob = Da(Sbob,C2alice-bob)
D2alice-bob = Da(Palice,D1alice-bob)
如果一切都按计划进行,则D2alice-bob = Malice-bob。
RSA密钥对的机制
RSA加密算法基于以下事实:如果您有两个公开的数字(它们是一个公钥的两个部分),即指数e和模数n,然后给出消息m,则很容易计算c = me国防部但是,仅给出c(以及e和n)来推导m是计算上不可行的。但是,如果您知道另一个指数d,则可以神奇地计算出r = cd mod n,如果适当地计算了e,d和n,则可以得出r = m。在不知道其他信息的情况下从e和n计算d是不可行的。
在RSA加密方案下,您首先使用两个(大)随机确定的质数p和q进行运算,它们的乘积为n。 RSA算法基于以下事实:很难分解n(仅给定n来确定p和q);如果有人发现分解大数的简便方法,那么RSA算法将立即失效。
一旦有了n,就需要确定指数e和d,使得:
ed = 1 mod t,其中t = LCM(p-1,q-1),LCM是最小公倍数。
您可以选择两个值之一作为一个小的奇数-例如,Schneier和Ferguson建议e = 3。然后,您可以使用书本约6页中涵盖的一些计算来计算d。通常,d将是一个相当大的数字。然后,您可以将对(e,n)发布为复合公钥,而将值(p,q,t,d)保留为私钥。给定e和n,在没有先分解n的情况下推导d在计算上是不可行的。 “实用密码学”建议使用从相同的值n派生的两个不同的对(e1,d1)和(e2,d2),其中使用e1加密消息,使用e2进行数字签名。他们甚至建议使用值3和5。
OpenSSL和密钥生成
我相信您对OpenSSL如何生成RSA密钥的描述感到困惑。
生成过程首先必须生成上述符号中的大随机质数p和q。有一些随机方法可以确定一个给定的大数是否(可能)是素数。计算两个这样的质数需要一点时间。两者合计,首先用于计算n,然后用于计算d(假设e由某种约定建立)。您在OpenSSL中看到的两个阶段是确定n,然后确定d。
用户案例剖析
问题说:
考虑到爱丽丝想以非传统方式向鲍勃发送一些东西:
爱丽丝(Alice)和鲍勃(Bob)曾经见面,爱丽丝(Alice)给了鲍勃(Bob)一个从她创建的私钥生成的“公钥”,但她警告鲍勃(Bob)保持秘密。并且她对私有密钥保密,并且从未将公开密钥提供给其他任何人。
到目前为止,一切都很好。 “公钥”不是很公开,但这没有害处。
鲍勃能否确定他从爱丽丝那里收到的消息(前提是这些消息已用爱丽丝私有密钥加密)只能由他读取(前提是他确实对爱丽丝的公共密钥副本保密)?
如果加密技术有用,则可以;否则,可以。因为只有Alice和Bob知道与她的私钥一起使用的公共密钥,所以只有Alice和Bob可以阅读Alice用其私钥加密的消息。
以及如何将这种加密方式与传统方式进行比较,在我们的案例中,这种方式是鲍勃向爱丽丝发送消息(由爱丽丝的公钥加密)吗?
困惑:本节首先讨论爱丽丝向鲍勃发送消息;现在您已切换到Bob向Alice发送消息。
当鲍勃和爱丽丝见面时,爱丽丝给了鲍勃她的Palice公钥。大概,鲍勃还给了爱丽丝他的Pbob公钥。而且两个公钥的公共流通都非常有限-很好,但对系统的安全性并不关键。
现在,当Bob想要向Alice发送消息时,他可以使用她的Palice公共密钥对其进行加密,而Alice(并且只有Alice)可以使用她的Salice秘密密钥解密该消息。另外,Bob可以用他的Sbob密钥加密消息,而Alice可以用Bob的Pbob公钥解密消息。两组加密和解密均适用。
问题是什么
非对称密钥分别命名为“私有”和“公共”的事实无助于理解我的问题。密钥具有基础属性,是我广播赋予其“公共”属性的“公共密钥”。在回答之前,请先明确区分:我不是在考虑这些密钥的“公共”和“私有”属性,而是“私有密钥”加密与“公共密钥”加密的牢固性。
用正确的私钥加密并用正确的公钥解密同样可靠,就像用正确的公钥加密并用正确的私钥解密一样。区别在于谁可以执行哪个操作。如果您清楚地了解谁在进行加密,谁在进行解密以及谁知道哪些密钥,那么这些方法的保密性就变得很清楚。
我不能使用其他术语,即使在这种特殊情况下也会引起误解。
嗯,在您的情况下,“公钥”并不是广为人知,但这就是所有与众不同的地方。
我知道这种情况是非传统的,并且可能导致多种不一致,或者不是非对称加密系统的重点,因为鲍勃和爱丽丝在这里共享某种共同的秘密,这不是非对称加密的重点。
非对称加密方案的全部要点是,攻击者(通常称为Eve,窃听者)是否知道公钥并不重要。只要私钥由Alice和Bob保持私密,就可以安全地发送消息。但是,您必须了解,如果Alice向Bob发送了仅由Alice的私钥加密的消息,那么知道Alice的公钥的任何人(例如Eve)都可以阅读该消息。除非Eve知道秘密密钥,否则Eve不能创建假冒来自Alice的假消息-如果Eve发现Alice的秘密密钥,Eve可以在任何喜欢的时间假装自己是Alice。但是她可以读。如果Alice向Bob发送了仅由Bob的公共密钥加密的消息,则只有Bob可以读取消息(使用他的私钥),但是Bob无法知道消息是否实际上来自Alice或Eve是否假装发送给是爱丽丝。因此,您必须努力确保Bob知道只有Alice可以发送消息,而Alice知道只有Bob可以阅读消息。
关于signing - 为什么我们不应该在非对称密码系统中用私钥加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1372307/
我提出这个问题是因为我没有找到关于这 3 个 gpg 选项之间差异的明确解释: gpg --sign file # produces file.gpg gpg --clear-sign
以下网页介绍了将 Google 登录集成到网络应用程序中的简单工作流程: https://developers.google.com/identity/sign-in/web/sign-in 实现代码
Microsoft 最近向 Azure AD B2C 添加了新的“注册或登录”策略。 https://azure.microsoft.com/en-us/documentation/articles/
鉴于此 xml: 如何选择包含 version="@2.15"的元素?我无法弄清楚如何将 @-sign 放入 XPath。 提前致谢, 埃里克 最佳答案 此 XPath 选择所
我正在为我的网站进行 Slack 集成,包括允许用户使用“使用 Slack 登录”按钮登录。理想情况下,我希望它只要求用户授予 identity.*权限一次,然后下次当他们单击“使用 Slack 登录
在将我的第二个应用程序项目上传到 PlayStore 时,在为新版本上传 .aab 文件时出现以下错误: "Your Android App Bundle is signed with the wro
As Math.sign() 接受数字参数或数字作为字符串,如 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Gl
我已经在我的网站上实现了 Sign In with Apple。但问题是它只适用于我开发者的 Apple ID。 我尝试在同一环境中使用我的个人 Apple ID,并且登录过程也运行良好。 但是,当真
Signed Short (Signed Int16) 乘法解释? short ss = -32768; // 0x8000 SHRT_MIN ss *= (short) -1; printf ("%
class Book attr_accessor :author attr_reader :title attr_reader :comments def initialize(aut
将我面向公众的应用程序部署到 Azure。旨在将身份验证委托(delegate)给 Microsoft、Google、Facebook、Apple 等。因此,一旦用户通过其声称的身份验证并且该提供商返
好吧,我对使用 API 的理解有限 我试图掌握 Adobe Sign API 并遇到了死胡同,在测试页面上我输入了这个并且它有效 但我不知道如何在 C# 中做到这一点 我尝试了以下方法,但知道它缺
上下文 我使用 booth Cognito 用户池和 Cognito 身份池来登录用户。 我想完成一个简单的任务,让用户在 iOS 应用程序(Swift 应用程序)上登录。 我的应用程序基于自定义版本
这可能是一个非常简单的答案,但我无法在任何地方找到它。可能是我以某种方式错过了一个非常基本的 CSS 规则。 这是我的 Sass 代码: h3 { font-size: 20px; m
我见过很多将 hex 转换为 int 的问题,但这些都是 unsigned-> unsigned 的变体。如何将带符号的十六进制转换为 Int? 例如。 somefunc('0xfffff830')
我对 C# 中的准备语句有疑问: OdbcCommand cmd = sql.CreateCommand(); cmd.CommandText = "SELECT UNIQUE_ID FROM use
我想知道是否有办法在我发送授权请求之前如果用户是第一次在 Apple 注册我的应用程序,或者他/她是否已经注册,只需登录即可。 基本上我的应用程序中有一个注册屏幕,用户可以在其中创建两种类型的用户和一
我是 Rails 的新手,我正在使用“设计”gem 进行身份验证。 首先,我通过默认注册页面(例如/users/sign_up)添加一个新用户 然后,我按照从 Devise before filter
当我使用 web3.eth.sign() 方法和 web3.eth.accounts.sign() 方法对字符串进行签名时。两个签名的结果值不同。我不知道为什么这两个结果不同。 我正在使用最新的 we
我正在使用受信任的 CA 颁发的证书签署 EXE 程序。 我正在使用 Windows SDK v6.0a 中的 signtool.exe。 该证书位于计算机商店中,位于“个人”文件夹中。 我的命令行是
我是一名优秀的程序员,十分优秀!