为什么京东支付接口的签名算法是用私钥加密而不是用私钥签名?

2017-09-09 00:49:05 +08:00
 v4j7o9m7s2
对接京东支付的时候,发现官方文档上写着 ‘私钥证书进行加密,并进行 base64 转码,得到签名字符串 sign ’。
最开始的时候以为是笔误,想表达的是 ’私钥证书进行签名‘,但是测试之后发现真的是用私钥进行加密。
看了一下 rfc2313,发现 rsa 的确是支持用私钥加密的,但是为什么要这样做呢?是有什么安全性上的考虑吗?求解。
6411 次点击
所在节点    程序员
25 条回复
Citrus
2017-09-09 12:49:41 +08:00
从 RSA 原理上来说,公私钥是对等的。但是从实际应用来说,为了加快计算速度,我们一般都取 e 为 65537。这样的话,如果你保密了 65537,别人直接就能猜出来了。。。
GuuJiang
2017-09-09 13:02:38 +08:00
@gamexg
#17 你的结论碰巧是正确的,然而论证是错误的
首先“公钥是两个大素数乘积,私钥是两个大素数本身”这句话是错误的,你下面的例子里的那两个大素数并不是私钥本身,而是用于生成公私钥的元素,虽然现有的工程实践中在设计私钥文件格式时顺便保存了这两个大素数,然而在使用私钥进行加解密时并用不到他们,换句话说你完全可以自己设计一种密钥文件格式,公私钥中都不保存大素数,也完全不影响使用
除了上面这个原因,还有另一个原因,为了下文简便先将 RSA 密钥的生成过程粗略地描述下,详细的过程在任何一篇 RSA 算法细节的文档中都能找到,生成两个大素数 p 和 q,乘积为 n,生成随机数 e,利用 n 和 e 计算出 d,注意这里已知 n 和 d 的话同样是可以计算出 e 的,二者地位等同,n 和 e 及 n 和 d 分别作为公私钥,然而现有的实现中 e 并不是用随机数,而是固定值 65537,于是只能 n 和 e 作为公钥,n 和 d 作为私钥,并且私钥文件中同时还保存了 pq 等其他信息
综上所述,公私钥不能互换并不是算法本身决定的,而只是现有工程实践的特例,原始的 RSA 算法中二组密钥实际地位等同,谁是私钥谁是公钥完全取决于后续使用时谁公开谁保密
GuuJiang
2017-09-09 13:04:21 +08:00
@flowfire @Citrus 呃,发出去以后才刷出二位的回复,你们基本把我想说的说完了
pynix
2017-09-09 23:45:13 +08:00
稍微了解点密码学理论基础也是好的。。。
mrathena
2018-04-10 01:00:17 +08:00
通常认为,京东用私钥加密,那么持有京东公钥的客户都可以解密,这种情况下,默认京东只使用唯一一套公私钥,下发给客户的公钥都是相同的。
如果京东为每个客户都生成一套新的公私钥,分配给客户的公钥都是不同的,一对一,那么用哪个来加密就无所谓了,反正别人都不知道,只有自己能够解密

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

https://yangjunhui.monster/t/389329

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

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

© 2021 V2EX