为什么都是私钥签名公钥验签,而不是直接私钥加密公钥解密?

2018-12-21 09:39:51 +08:00
 zjsxwc

为什么都是私钥签名公钥验签,而不是直接私钥加密公钥解密?

是处于什么考虑这么做?性能考虑吗?

8739 次点击
所在节点    程序员
48 条回复
ruimz
2018-12-21 12:00:26 +08:00
考虑到签名的本质就是私钥加密公钥解密,则按楼主所说,能被 A 公钥解密的信息一定是 A 私钥发出的。
理论上没问题,就是效率非对称不高。就是效率问题

不过楼上为什么那么多人怀疑私钥加密公钥解密的做法呢?能用公钥解开的就是好签名,解不开的就是假签名,没毛病啊
Justin13
2018-12-21 12:01:13 +08:00
签名和加密的区别了解下。
mcfog
2018-12-21 12:10:05 +08:00
私钥“加密”,公钥“解密”的过程一般就叫做“签名”,“验签”,目的是证明信息是我发的
“加密”一般是指保护信息不让别人看,应该是公钥加密,私钥解密

题目里的说法,前后两半部分是一回事,后半部分一般不那么说

至于性能问题,对于签名的场景,一般是用信息摘要(也就是哈希)作为签名的信息,而对于加密的场景,一般是用不对称算法(也就是公钥私钥)来保护对称算法的协商过程(也就是双方协商用什么对称算法,并随机生成临时的密钥,并定时轮换等),用对称算法保护实际内容
shm7
2018-12-21 12:14:37 +08:00
对称密码体系你可以用来加密,也可以用来做数字签名,就是反过来用密钥对。
git 中用的代码提交就是用的这种,ssh 也是。
geelaw
2018-12-21 12:20:56 +08:00
因为楼主和楼上很多人没搞清楚公钥、私钥的意思。

在一个非对称加密方案中,公钥是用于加密的密钥,私钥是用于解密的密钥。在一个数字签名方案中,公钥是用于验证的密钥,私钥是用于签名的密钥。

如果加上一点“类型”的感觉,四个密钥之间没有“隐式转换”,不存在“用私钥加密、用公钥解密”这种东西,无论你说的私钥 /公钥是指加密方案还是签名方案的一部分。

至于某些加密、签名方案巧合地让此私钥和彼私钥有内容上的相似之处,那属于 private class member。
Paryace
2018-12-21 12:34:30 +08:00
理论上公钥和私钥是可以反过来用的,哪边"加密",哪边"解密"都不影响。

问题就在现行的库和协议默认私钥里面保存了原始信息,理论上有里面的数据可以硬算出公钥,相当于人为强行区分私钥和公钥,所以规定了流程:公钥加密,私钥解密,私钥签名,公钥验证。
reself
2018-12-21 12:40:41 +08:00
非对称算法很慢的,因此签名和加密都不是直接在原文上操作。一般来说要用到私钥、公钥,密钥,hash 钥。分别对应非对称加密,对称加密,散列算法。
加密时用的性能好的对称加密算法,而不是非对称算法。发送端用公钥加密密钥和 hash 钥,传输完成后,接收端用私钥解密出密钥和 hash 钥,再拿密钥来解密出明文,再用 hash 钥校验完整性。
签名也是这样的。用首先 hash 起到了保证完整性的作用,签名 hash 就间接签名了原文,就没必要消耗大量的算力来直接签名原文了。
alcarl
2018-12-21 12:53:10 +08:00
私钥加密公钥解密的主要应用领域就是签名,是一码事好吧。。。。。直接加密数据,如果量很大,rsa 算法很慢的超级慢
reself
2018-12-21 12:53:13 +08:00
签名和验签的方法有很多种。私钥加密公钥解密只是实现方法的一种。如果只有两个人通信,那么用对称加密也可以,因为默认只有你们俩知道密钥,知道密钥本身代表了对方的身份。但是三个人就不行了,你收到了一份声明是没法区分是谁发的,因为对面两个人都知道密钥,他们可以互相冒充。
而用非对称的话就能保证唯一性,能用谁的公钥解就能说明是谁发的。除非他们两个人共享私钥(这代表他们两个人绝对信任彼此,一方无条件赞成另一方的决定),或者私钥泄露(这属于私钥的管理问题了,很严重)。
zsj950618
2018-12-21 13:12:48 +08:00
那 rsa 来说,大质数运算太太太慢了。所以 rsa 直接加密的内容越少越好
yucao
2018-12-21 13:21:54 +08:00
主要还是你要的目标是什么?
是验证数据是没有被修改的数字水印?
还是给数据进行加密?
后者就是你所说的情况啊
确定自己的需求是第一要义啊...
timeg0
2018-12-21 13:27:30 +08:00
验签和加密解密是两种信息安全模型,验签了为解决不可否认问题,加解密是了解决保密性问题。一般验签用的是非对称算法,如 RSA,RSA 是基于大素数分解这个数学难题来开发的,效率一般比较低下。加解密一般是对称加密算法,如 DES,3DES 等,效率比较高。很多地方是对称算法和非对称算法结合起来使用。
Leigg
2018-12-21 13:34:01 +08:00
20 楼一针见血
CRVV
2018-12-21 13:40:45 +08:00
@geelaw
你有没有意识到自己回复的内容是正确的废话?
楼主问不混用的原因,你回答说这东西就这么规定的

在 RSA 里面,公钥和私钥没有本质的区别,公开的那个叫公钥,不公开的叫私钥。用公钥做加密是加密,用私钥做加密是签名。
至于怎么规定的,那是另外一件事。规定的那个方法当然是正确的方法,但楼主问的是为什么另一种不正确。

楼主问的问题其实很简单
如果用私钥加密得到密文,然后把密文改掉,再用公钥解密。这样也可以解出来一个结果,但是这个结果和原来不一样。签名的目的是确保收到的消息正确,所以这样做不可行

这事和性能毫无关系。
类似的情况在对称加密里也有,confidentiality 和 integrity 是两件事,要用完全不同的方法来做,看看 AEAD 的实现就懂了。
maomo
2018-12-21 14:37:52 +08:00
泻药

题主的问题应该修正为:为什么消息签名用 E(Hash(m))而不直接用 E(m)?

答案:后者不能满足签名的安全性要求。并不是因为性能或者其他原因。

首先要明白为什么要签名?签名是主要为了提供消息的“完整性”和“认证性”,保证消息不被篡改和伪造。

那么为什么不直接用 E(m)?答案是因为如果采用这种方案,攻击者可以利用选择密文攻击( CCA )伪造任意消息的签名,破坏了完整性和认证性。用 E(Hash(m))的原因是 Hash 函数提供了抵抗 CCA 的能力,因此可以保证完整性和认证性。

以上
hoiyd
2018-12-21 14:57:21 +08:00
理论上没问题,实际是性能的问题。大段的文字,用非对称加解密比较慢。
所以一般是用 对称加密算法 加解密大段文字,非对称加解密算法来加解密 对称加密算法的秘钥 和 签名。
williamx
2018-12-21 15:07:26 +08:00
楼主问了一个非常好的问题!
faemon
2018-12-21 15:29:20 +08:00
其实在实际使用过程中,对数据加密是使用对称加密的,然后用公钥加密对称加密的密钥,然后接收者用私钥解密得出密钥,再用密钥解密出数据,所以并不是直接使用公钥加密数据。

公钥和私钥是一对的,其实签名也可以理解为一种加密,所以能理解为公钥加密只能私钥解密,私钥加密只能公钥解密,两者作用一样。所以区分两者就为了破解的难度问题(知道公钥算出私钥,知道私钥算出公钥,其实都是依赖那个大质数来算出对方),如果在不知道那个大质数,而在拥有破解能力(计算机运算能力)非常大的情况下,保证知道公钥情况下破解获得私钥的难度大于知道私钥破解公钥的难度,所以区分出公私钥,派发公钥出去,自己保留私钥。数学家应该知道两者破解的难度差异有多大吧
maristie
2018-12-21 15:46:19 +08:00
贴一段 wikipedia

Used directly, this type of signature scheme is vulnerable to key-only existential forgery attack. To create a forgery, the attacker picks a random signature σ and uses the verification procedure to determine the message, m, corresponding to that signature.[25] In practice, however, this type of signature is not used directly, but rather, the message to be signed is first hashed to produce a short digest, that is then padded to larger width comparable to N, then signed with the reverse trapdoor function[26]. This forgery attack, then, only produces the padded hash function output that corresponds to σ, but not a message that leads to that value, which does not lead to an attack. In the random oracle model, hash-then-sign (an idealized version of that practice where hash and padding combined have close to N possible outputs), this form of signature is existentially unforgeable, even against a chosen-plaintext attack.[16][clarification needed]

There are several reasons to sign such a hash (or message digest) instead of the whole document.

For efficiency
The signature will be much shorter and thus save time since hashing is generally much faster than signing in practice.
For compatibility
Messages are typically bit strings, but some signature schemes operate on other domains (such as, in the case of RSA, numbers modulo a composite number N). A hash function can be used to convert an arbitrary input into the proper format.
For integrity
Without the hash function, the text "to be signed" may have to be split (separated) in blocks small enough for the signature scheme to act on them directly. However, the receiver of the signed blocks is not able to recognize if all the blocks are present and in the appropriate order.
geelaw
2018-12-22 07:23:59 +08:00
@CRVV #34 你说的是一些错误的话,你需要阅读密码学的教材来明白词的含义,而不是依靠直觉理解。

> 在 RSA 里面,公钥和私钥没有本质的区别,公开的那个叫公钥,不公开的叫私钥。用公钥做加密是加密,用私钥做加密是签名。

首先你需要定义“本质”。RSA 这个名字既可以指代使用 RSA trapdoor 的加密方案,也可以指代使用 RSA trapdoor 的签名方案。混淆的根源是没有说明白到底是什么密码学方案。而目前流行的使用 RSA trapdoor 的加密、签名方案刚好都用到了 RSA trapdoor 的 inversion 的过程。在 RSA trapdoor 中,正 /反运算需要的额外输入(代码和陷门代码)可以具有类似的格式,也可以没有。

> 至于怎么规定的,那是另外一件事。规定的那个方法当然是正确的方法,但楼主问的是为什么另一种不正确。

这是错误的想法,名词的含义是根据其定义而来。如果使用某个东西签名,那么那个东西就是私钥。正确的问法是:“为什么不能把 RSA 加密的公钥、加密算法当作 RSA 签名私钥、签名算法,把 RSA 解密的私钥、解密算法当作 RSA 签名公钥、验证算法?”

> 楼主问的问题其实很简单
> 如果用私钥加密得到密文,然后把密文改掉,再用公钥解密。这样也可以解出来一个结果,但是这个结果和原来不一样。签名的目的是确保收到的消息正确,所以这样做不可行

你想象中的攻击并不一定能够成功。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/519617

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX