在非对称密码系统的标准使用中,使用公钥进行加密,使用私钥进行解密。
这取决于谁在做什么。假设 Alice 想向 Bob 发送一条只有 Bob 可以解码的消息。Alice 使用 Bob 的公钥加密消息(在“公钥”的标准定义下,即除了其所有者之外的其他人都知道的密钥)。现在只有知道 Bob 的私钥的人(想必唯一知道 Bob 的私钥的人其实就是 Bob)才能解密 Alice 给 Bob 的消息。
如果 Alice 想让 Bob 知道只有她可以发送它,那么她可以用她自己的私钥加密该消息,假设 Bob 在用 Bob 的公钥加密消息之前或之后知道她的公钥。假设她用她的私钥加密消息,然后用 Bob 的公钥加密结果。为了阅读消息,Bob 必须用他(Bob 的)私钥解密消息,然后用 Alice 的公钥再次解密结果。如果他现在阅读的是合理的文本,他就知道知道 Alice 的私钥(可能是 Alice)和他的公钥(可能是任何人)的人发送了这条消息。
在实践中,非对称算法的计算成本很高,所以你真正要做的是选择一个适当长度的随机会话密钥和一个商定的标准对称加密算法,如 AES。然后用(相对较快的)对称算法对主消息进行加密,并作为消息的一部分发送。消息的另一部分是加密的或双重加密的随机会话密钥。Bob 可以解密消息的会话密钥部分以获得会话密钥;然后他用它来解密消息的主要部分。
请注意,如果您要向许多人发送消息,您可以使用适当的消息加密,然后使用收件人的公钥为每个收件人加密一次会话密钥。每个接收者只能使用属于他们的密钥解密会话密钥信息,但实际上所有人都可以解密它。如果消息很大(比如 2 MB 的 PDF),那么这比使用每个收件人的公钥单独加密消息要经济得多。
反过来,“用私钥加密”称为“签名”。
不; 签名是一个单独的操作。如果您阅读 Schneier 的“实用密码学”,您会看到作者建议使用一对公钥/私钥进行加密,使用第二对进行签名工作。例如,签名使用来自签名密钥的私钥对原始消息的固定长度散列进行加密。任何知道签名密钥的公钥部分的人都可以解密签名以获得原始消息的哈希值。据推测,同一个接收者也可以解密消息(使用签名密钥对的公钥),然后可以检查接收到的消息的哈希是否与从签名导出的哈希相匹配。任何不匹配都表明存在问题,应丢弃该消息。
有很多方法可以做这些事情 - 取决于安全要求。
但基本的一点是,一个人知道非对称密钥的私钥,并且可能很多人都知道非对称密钥的公共部分(这是非常安全的)。发件人可以使用收件人公钥对数据进行加密;发件人也可以使用自己的私钥对其进行加密。收件人可以使用自己的私钥解密收到的消息,如有必要,还可以使用发件人的公钥。
这个问题,即使在大约 2009-09-05T13:00-07:00 修正,也不完全连贯,IMNSHO。
您应该阅读“实用密码学”中的第 13 章“RSA”(可能也阅读了前面的一些章节 - 最值得注意的是第 3.3 节公钥加密)。
加密和解密符号
让我们定义一些符号来讨论正统的公钥密码术。让我们从基本的对称加密开始:
- C = E(K,m) 是加密算法 E 在(明文)消息 m 上使用密钥 K 生成的加密消息(密文,C)。
- P = D(K,C) 是由解密算法 D 使用密钥 K 对(加密的)消息 c 发现的纯文本消息(纯文本,P)。
- 要成为一个工作系统,m = P,所以 D(K,E(K,m)) = m。
到目前为止,这种表示法适用于对称加密,因为相同的值 K 用于加密和解密。任何知道 K(和算法,但 Kerckhoff 的“密钥中的秘密”原则意味着您假设攻击者知道算法 - 任何相反的假设都是加密的“蛇油”)的人都可以解密消息。
在非对称加密系统中,E a和 D a是算法 A 的加密和解密方法。非对称密码的关键区别在于E a使用的密钥 K encrypt与 D 使用的密钥 K decrypt不同一个。此外,为了实用,即使您知道 K加密,推导出 K解密也必须在计算上不可行,反之亦然。
使用非对称加密,Alice 创建了一对密钥(S alice,P alice)。按照惯例,S alice是密钥,P alice是公钥。请注意,Alice 知道这两个密钥。重要的是:
- S alice和 P alice是不同的。
- Alice 不会让其他任何人知道其中一个密钥 (S alice );至关重要的是,其他任何人都不知道这些信息。
- Alice 可以让其他人知道另一个密钥(P alice),而不会损害系统的安全性。
类似地,Bob 将创建一对密钥 (S bob , P bob )。注意:
- Bob 知道密钥 S bob、 P bob和 P alice。
- Alice 知道密钥 S alice、 P alice和 P bob。
爱丽丝向鲍勃发送消息
现在,当 Alice 想向 Bob 发送一条消息 M alice-bob以便 Bob 可以读取它(但没有其他人可以)时,她必须使用 Bob 的密钥 P bob对其进行加密。因此,她创建了一条消息:
- C alice-bob = E a (P bob , M alice-bob )
Bob 知道(从外部证据)消息是用 P bob加密的,所以他知道他必须用 S bob解密它:
- M alice-bob = D a (S bob , C alice-bob )
然而,在这一点上,他只知道这条消息来自知道他的 P bob密钥的人。他不知道它来自爱丽丝,除非通过外部证据。
如果 Bob 和 Alice 同意必须对他们的消息进行加密,以便他们都确信收到的消息来自对方,那么他们都必须确信除了 Alice 之外没有人知道 S alice,并且除了 Bob 之外没有人知道鲍勃_ _ 他们还必须确信 Bob 知道 P alice并且 Bob 必须确信 P alice确实属于 Alice,并且 Alice 知道 P bob并且 Alice 必须确信 P bob确实属于 Bob。建立这些信任关系是 PKI(公钥基础设施)的主要内容。
假设满足这些标准,那么 Alice 可以将她的消息发送给 Bob,Bob 确信只有 Alice 可以发送它。如前所述,该机制是双重加密:
- C1 alice-bob = E a (S alice ,M alice-bob )
- C2 alice-bob = E a (P bob ,C1 alice-bob )
Alice 将 C2 alice-bob发送给 Bob(连同一些签名或 MAC 以确认它在传输过程中没有损坏),然后 Bob 计算:
- D1 alice-bob = D a (S bob ,C2 alice-bob )
- D2 alice-bob = D a (P alice ,D1 alice-bob )
如果一切都按计划进行,则 D2 alice-bob = M alice-bob。
RSA 密钥对的机制
RSA 加密算法基于这样一个事实:如果您有两个公开的数字(它们是一个公钥的两个部分),即指数e和模数n,那么给定消息m,很容易计算c = m e mod n。然而,仅给定c(以及e和n )推导出m在计算上是不可行的。但是,如果您知道另一个指数d,那么您可以神奇地计算出r = c d mod n和r = m如果您已经适当地计算了e、d和n。在不知道其他信息的情况下从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在计算上是不可行的. “实用密码学”建议使用两个不同的对 ( e 1 , d 1 ) 和 ( e 2 , d 2 ),从相同的值n派生,您使用e 1加密消息,使用e 2进行数字签名;他们甚至建议对这些使用值 3 和 5。
OpenSSL 和密钥生成
我相信您对 OpenSSL 如何生成 RSA 密钥的描述令人困惑。
生成过程首先必须生成较大的随机素数,即上述符号中的p和q。有一些随机方法可以确定给定的大数是否(可能)是素数;计算两个这样的素数需要一点时间。总而言之,它们首先用于计算n,然后是d(假设e是通过某种约定建立的)。您在 OpenSSL 中看到的两个阶段是确定n,然后确定d。
用户案例剖析
问题说:
假设 Alice 想以一种非传统的方式向 Bob 发送一些东西:
爱丽丝和鲍勃曾经见过面,爱丽丝给了鲍勃一个“公钥”,这个“公钥”是由她创建的私钥生成的,但她警告鲍勃要保密。而且她将私钥保密,并且从未将公钥提供给其他任何人。
到现在为止还挺好。“公钥”不是很公开,但这并没有什么坏处。
Bob 是否可以确定他从 Alice 那里收到的消息(假设这些消息是由 Alice 私钥加密的)只能由他读取(假设他真的将 Alice 的公钥副本保密)?
如果加密技术有任何用途,那么是的;只有 Alice 和 Bob 可以阅读 Alice 用她的密钥加密的消息,因为只有 Alice 和 Bob 知道与她的密钥一起使用的公钥。
以及如何将这种加密可靠性与传统方式进行比较,在我们的例子中,传统方式是 Bob 向 Alice 发送消息(由 Alice 的公钥加密)?
困惑:该部分从讨论 Alice 向 Bob 发送消息开始;现在您已切换到 Bob 向 Alice 发送消息。
当 Bob 和 Alice 见面时,Alice 给了 Bob 她的 P alice公钥。据推测,鲍勃也给了爱丽丝他的 P bob公钥。并且两个公钥的公开流通都非常有限——这很好,但对系统的安全性并不重要。
现在,当 Bob 想向 Alice 发送一条消息时,他可以使用她的 P alice公钥对其进行加密,而 Alice(并且只有 Alice)可以使用她的 S alice密钥解密该消息。或者,Bob 可以用他的 S bob密钥加密消息,而 Alice 可以用 Bob 的 P bob公钥解密它。两组加密和解密都可以工作。
问题是关于什么的
非对称密钥被命名为“私有”和“公共”这一事实无助于理解我的问题。密钥具有基础属性,是我在广播“公钥”,使其具有“公共”属性。请在回答之前明确区分:我不是在考虑这些密钥的“公共”和“私有”属性,而是“私有密钥”加密与“公共密钥”加密的可靠性。
用正确的私钥加密和用正确的公钥解密与用正确的公钥加密和用正确的私钥解密一样可靠。区别在于谁可以做哪些操作。如果您清楚地了解谁在进行加密,谁在进行解密,以及谁知道哪些密钥,那么这些方法的保密性就变得相当清楚了。
即使在这种特殊情况下具有误导性,我也不能使用其他术语。
好吧,在您的情况下,“公钥”并不是那么广为人知,但这就是它的不寻常之处。
我知道这种情况是非传统的,可能会导致一些不一致,或者不是非对称加密系统的重点,因为 Bob 和 Alice 在这里共享某种共同的秘密,而这不是非对称加密的重点。
非对称加密方案的全部意义在于攻击者(通常称为 Eve,窃听者)是否知道公钥并不重要。只要 Alice 和 Bob 将私钥保密,就可以安全地发送消息。但是,您必须了解,如果 Alice 向 Bob 发送仅由 Alice 的密钥加密的消息,那么任何知道 Alice 的公钥的人(例如 Eve)都可以阅读该消息。除非 Eve 也知道密钥,否则 Eve 无法创建声称来自 Alice 的虚假消息 - 如果 Eve 发现 Alice 的密钥,Eve 可以随时假装是 Alice。但她能读懂。如果 Alice 向 Bob 发送仅由 Bob 的公钥加密的消息,那么只有 Bob 可以读取该消息(使用他的密钥),但是 Bob 无法知道它是真的来自 Alice,还是 Eve 假装是 Alice 发送的。这就是为什么你必须努力确保 Bob 知道只有 Alice 可以发送消息,并且 Alice 知道只有 Bob 可以阅读消息。