我正在努力更好地了解公钥/私钥是如何工作的。我知道发送方可以使用他/她的私钥向文档添加数字签名,从而实质上获得文档的哈希值,但我不理解的是如何使用公钥来验证该签名。

我的理解是公钥加密,私钥解密…有人能帮我理解一下吗?


当前回答

我想为那些寻找更直观的东西的人提供一个补充解释。

这种困惑的很大一部分来自于命名“公钥”和“私钥”,因为这些东西的实际工作方式与“密钥”的理解方式直接不一致。

以加密为例。它可以被认为是这样工作的:

希望能够阅读秘密消息的各方都拥有一把密钥 隐藏(即私钥) 希望能够发送秘密消息的各方都有能力获得一个未解锁的锁(即一个公共锁) 然后发送秘密信息就像用一把没有上锁的锁一样简单,但之后只能用其中一把隐藏的钥匙来解锁。

这允许秘密消息在各方之间发送,但从直观的角度来看,“公共锁”是一个比“公钥”更合适的名称。

然而,对于发送数字签名,角色有点相反:

The party that wants to sign messages is the only one with access to the unlocked locks (i.e. a private lock) The parties that want to verify the signature all have the ability to obtain a key (i.e. a public key) Then what the signer does is create two identical messages: the one that anyone can read and one to accompany it, but which they lock with one of their private locks. Then when the receiver gets the message, they can read it, and then use the public key to unlock the locked message and compare the two messages. If the messages are the same, then they know that: The unlocked message wasn't tampered with during travel and, The message must have been from the person who has the matching lock to their public key. And finally, this entire system only works if anyone who wants to validate a signer's signature has an authoritative place to go to to get the matching key to the signer's locks. Otherwise, anyone can say "Hey, here's the key to so-and-so's private lock", send you a message pretending to be them but lock it with their private lock, you perform all the above steps and believe the message must actually be from the person you thought, but you're fooled because you were mislead as to the true owner of a public key.

只要有一个可信赖的来源来检索签名者的公钥,您就会知道公钥的合法所有者是谁,并能够验证他们的签名。

其他回答

我想为那些寻找更直观的东西的人提供一个补充解释。

这种困惑的很大一部分来自于命名“公钥”和“私钥”,因为这些东西的实际工作方式与“密钥”的理解方式直接不一致。

以加密为例。它可以被认为是这样工作的:

希望能够阅读秘密消息的各方都拥有一把密钥 隐藏(即私钥) 希望能够发送秘密消息的各方都有能力获得一个未解锁的锁(即一个公共锁) 然后发送秘密信息就像用一把没有上锁的锁一样简单,但之后只能用其中一把隐藏的钥匙来解锁。

这允许秘密消息在各方之间发送,但从直观的角度来看,“公共锁”是一个比“公钥”更合适的名称。

然而,对于发送数字签名,角色有点相反:

The party that wants to sign messages is the only one with access to the unlocked locks (i.e. a private lock) The parties that want to verify the signature all have the ability to obtain a key (i.e. a public key) Then what the signer does is create two identical messages: the one that anyone can read and one to accompany it, but which they lock with one of their private locks. Then when the receiver gets the message, they can read it, and then use the public key to unlock the locked message and compare the two messages. If the messages are the same, then they know that: The unlocked message wasn't tampered with during travel and, The message must have been from the person who has the matching lock to their public key. And finally, this entire system only works if anyone who wants to validate a signer's signature has an authoritative place to go to to get the matching key to the signer's locks. Otherwise, anyone can say "Hey, here's the key to so-and-so's private lock", send you a message pretending to be them but lock it with their private lock, you perform all the above steps and believe the message must actually be from the person you thought, but you're fooled because you were mislead as to the true owner of a public key.

只要有一个可信赖的来源来检索签名者的公钥,您就会知道公钥的合法所有者是谁,并能够验证他们的签名。

如果我必须根据我的理解重新措辞你的问题,你的问题如下:

如果公钥密码学确保可以从私钥派生出公钥,但不能从公钥派生出私钥,那么您可能想知道,公钥如何解密用私钥签名的消息,而发送方不会将签名消息中的私钥暴露给接收方?(反复阅读几次,直到理解为止)

其他答案已经解释了不对称密码学意味着你可以:

用公钥加密,用匹配的私钥解密(伪代码如下)

var msg = 'secret message';

var encryptedMessage = encrypt(pub_key, msg);

var decryptedMessage = decrypt(priv_key, encryptedMessage);

print(msg == decryptedMessage == 'secret message'); // True

使用私钥加密,使用匹配的公钥解密(伪代码如下)

var msg = 'secret message';

var encryptedMessage = encrypt(priv_key, msg);

var decryptedMessage = decrypt(pub_key, encryptedMessage); // HOW DOES THIS WORK???

print(msg == decryptedMessage == 'secret message'); // True

我们知道例子#1和#2都可行。例1有直观的意义,而例2回避了最初的问题。

事实证明,椭圆曲线密码学(也称为“椭圆曲线乘法”)是原始问题的答案。椭圆曲线密码学是一种数学关系,使下列条件成为可能:

公钥可以用数学方法从私钥生成 私钥不能以数学方式从公钥(即公钥)生成。“地板门函数”) 私钥可以通过公钥验证

对大多数人来说,条件1和2是有意义的,但条件3呢?

你有两个选择:

你可以钻进兔子洞,花几个小时学习椭圆曲线密码学是如何工作的(这是一个很好的起点)……还是…… 你可以接受上面的性质——就像你接受牛顿的3个运动定律一样,而不需要自己推导它们。

总之,使用椭圆曲线密码术创建了一个公共/私有密钥对,从本质上讲,它创建了一个在两个方向上都有数学链接的公共和私有密钥,但不是在两个方向上都有数学推导。这使得您可以使用某人的公钥来验证他们是否签署了特定的消息,而不会向您暴露他们的私钥。

如果我用我的私钥加密一些文本,那么任何拥有我的公钥的人都可以解密它。公钥是公开的,任何人都可以拥有它(包括小偷和骗子),那么用我的私钥加密文本有什么意义(因为它可以用我的公钥解密,这是公开的)?

它给了我们真实性。我的意思是,如果你能用我的公钥解密一条消息,那么你就可以说这条消息是我发的。但是,有一个但是。假设有人用我的公钥解密了一条消息,并得到了消息“Hi!”,这是否意味着我说了“Hi!”?有可能使用了其他一些私钥加密消息,碰巧我的私钥将其解密为有意义的文本而不是胡言乱语。

这就是为什么我们还需要用我们的公钥提供确切的消息。因此,接收者可以将其与解密的消息进行比较。

所以,我们提供

公钥 原始消息 加密信息

如果原始消息=解密(加密消息,公钥),那么里面的消息肯定是我的,因为只有我有私钥。

奖金:

总是发送“原始消息”并不方便。“原始消息”可以是一个4GB的ISO文件。最好是计算原始消息的哈希(单向哈希函数,也称为消息摘要,是一种数学函数,它接受可变长度的输入字符串并将其转换为固定长度的二进制序列,该序列在计算上难以反转—即从哈希生成原始字符串)并发送它。

所以,现在我们发送:

公钥 原始消息的散列 原始消息的加密散列

现在如果哈希(原始消息)=解密(加密消息,公钥),那么里面的消息肯定是我的,因为只有我有私钥。

您对“公钥加密,私钥解密”的理解是正确的…用于数据/消息加密。对于数字签名,情况正好相反。使用数字签名,您将试图证明由您签署的文件来自您。要做到这一点,您需要使用只有您拥有的东西:您的私钥。

简单来说,数字签名是数据(文件、消息等)的哈希值(SHA1、MD5等),随后使用签名者的私钥进行加密。因为这是只有签名者拥有(或应该拥有)的东西,所以这就是信任的来源。每个人都有(或应该有)访问签名者的公钥的权限。

为了验证数字签名,接收者

计算相同数据(文件、消息等)的哈希值, 使用发送方的公钥解密数字签名 比较两个哈希值。

如果匹配,则认为签名有效。如果它们不匹配,则意味着使用了不同的密钥对其进行签名,或者数据已被更改(有意或无意)。

我认为误解中的最大问题是,当人们读到“不对称”这个词时,在他们的头脑中,他们认为“好吧,一个密钥加密,另一个密钥解密,因此它们是不对称的”。但如果你理解不对称实际上意味着“if密钥A加密了数据,那么它的“姐妹”密钥B可以解密数据。如果密钥B被用来加密数据,那么密钥A现在只能解密。”对称意味着用于加密数据的相同密钥可以用于解密数据。