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

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


当前回答

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

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

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

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

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个运动定律一样,而不需要自己推导它们。

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

其他回答

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

关于你的问题,我在看RSA的实现。并且更清楚地了解了使用公钥验证使用私钥的签名的方式。毫无疑问,私钥不会被暴露。以下是如何……

这里的技巧是将私钥隐藏在函数中。这里是(p-1)*(q-1)

假设p是私钥,e是公钥。P被封装在另一个函数中以使其隐藏。

E.g., `d = (p-1)(q-1); d * e = 1` (d is the inverse of e - public key)
Data sent = [encrypted(hash), message] = [m ^d, message];

留言在哪里 假设

'Data sent' = y

为了检验完整性,我们找到y^e得到m,因为m ^(d*e) = m ^1 = m。

希望这能有所帮助!:)

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

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

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

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

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文件。最好是计算原始消息的哈希(单向哈希函数,也称为消息摘要,是一种数学函数,它接受可变长度的输入字符串并将其转换为固定长度的二进制序列,该序列在计算上难以反转—即从哈希生成原始字符串)并发送它。

所以,现在我们发送:

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

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

公钥加密,只有私钥可以解密,反之亦然。它们都加密为不同的哈希值,但每个密钥都可以解密对方的加密。

有几种不同的方法可以验证消息是否来自预期的发送方。例如:

发件人发送:

的消息 用他们的私钥加密的消息的哈希值

接收方:

用公钥解密签名(2)以获得一条消息,该消息应该与(1)相同,但我们还不知道。现在我们有两个消息,我们需要验证它们是否相同。为此,我们将用我们的公钥对它们进行加密,并比较两个哈希值。所以我们将.... 用公钥加密原始消息(1)以获得哈希值 加密解密的消息(3)以获得第二个散列,并与(4)进行比较以验证它们是否相同。

如果它们不相同,这意味着要么消息被篡改了,要么它是用其他密钥签名的,而不是我们认为的那个……

另一个例子是发送方使用接收方可能也知道使用的公共散列。例如:

发件人发送:

一个消息 获取消息的已知哈希值,然后使用私钥加密该哈希值

接收方:

解密(2)并获得一个哈希值 使用发送方使用的相同散列对消息(1)进行散列 比较两个散列以确保它们匹配

这再次确保消息没有被篡改,并且它来自预期的发送者。