rsa 生成的公钥、私钥,可以互相交换吗?我可以把 PRIVATE KEY 发给客户端,把 PUBLIC KEY 留给自己用吗?

2021-10-22 15:42:29 +08:00
 find456789

问这个问题的原因是:

我想给软件增加 注册码的功能, 我最终选了 rsa 非对称加密算法

但是我体验了一下, 发现 只能用 公钥 PUBLIC KEY 加密用户信息(到期时间,会员等级) ,

// 假设这是明文 
{
username:aaaa,
level:2,
endtime:2022-12-12 12:12:12
}

且只能用 私钥 PRIVATE KEY 来解密,得到原文


所以,我就考虑, 把 PRIVATE KEY 内嵌到软件内部

把 PUBLIC KEY 存在我自己私人电脑上的注册机内部;

然后,客户注册、付费以后,我就用我电脑的注册机,生成注册码(用 PUBLIC KEY 把明文信息加密)

然后,我把注册码 发给客户

// 假设注册码是这个
lbLeK+0MeLNXPm+MlbLeK+0MeLNXPm+MlbLeK+0MeLNXPm+MlbLeK+0MeLNXPm+M==

客户把注册码输入 软件, 软件利用 PRIVATE KEY 把密文,解密成 明文信息


但是我在探索的过程中, 看到一些网友说,openssl 是可以通过 PRIVATE KEY 得到 PUBLIC KEY 的, 如果真的这样的话,就会被人写出 注册机来

信息来源: https://segmentfault.com/q/1010000002932436/a-1020000002947602


我使用 python-rsa 生成的公钥私钥格式如下:

-----BEGIN RSA PRIVATE KEY-----
MIICXwIBAAKBgQCGohHh3ypajwWHgFxbeUOZQehVDdjpXD+rA1RjoYIyA9fBuptv
i5I8SuncRe0tkqKj5eYYtMgp4fjQ9SvFLjvjygrdPj+tzfefs7wiaYlxKaons3MT
HCZRvfQ9+i5M6rdXGIcd4hQX3Og0EacNU3aeNW9f0XHqMaP5bQsNJ6HLSQIDAQAB
AoGAPH25Vyk0GHhGXbl4xcjYbJXGU+Di4wcFvErEsfcxTlOXr32utRGa5Ogr50Kr
7FwEI2v6VIN1pAvaBdkCQi1CysQZ8hT4KFZtnaojIyIeJFXMCSpKpM7z106FEh/L
3mjeGGDLBamo0Pyjhg34rkEgDbci3QAIMb+nPZKFp1LbZGECRQCsTYp3AO3t7KWg
Vn2bfJGAedOyRalNpAeWjj/SLHON08Ko9iKFG0g1HU05D+Ma7unlOwnrPDMonqxE
tSMfZtcN8ZTnLQI9AMgIKIleej3VwiSWtUMFcJoKmTJgUcX0kDmdM9nbMnCrR5Sv
AbNM1XqKyj8eVSjGYPYA8oFlvKjchKMGDQJEDPV0AYlHW8qdllaK8ePHibMf8dt9
ZUJ985vVPvhq5HLVxCFm7T3lC2GdyjngqcjoPH5ZO6D2dAqjCDPbZWQ1rm3J9i0C
PE5Yy6/KPmzbvZfhI4vlpI3hGtHdYgn72UWHqhhpP19b5sR4q1zT+kVt+Psx4T8A
PFf+VP2ToIovHRBRPQJECXhvoSzyL+QnY9nixOucF/oB97sqfC3WQwkcNYL4v4wK
I5YOFZHgxRBmvflkAH6KPSKDrr0GPSlu/ZDwQetWvAyDUiU=
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAIaiEeHfKlqPBYeAXFt5Q5lB6FUN2OlcP6sDVGOhgjID18G6m2+LkjxK
6dxF7S2SoqPl5hi0yCnh+ND1K8UuO+PKCt0+P63N95+zvCJpiXEpqiezcxMcJlG9
9D36Lkzqt1cYhx3iFBfc6DQRpw1Tdp41b1/Rceoxo/ltCw0noctJAgMBAAE=
-----END RSA PUBLIC KEY-----

由于我对算法是个新手, 所以,特来发帖,问问大家:

我这种格式的 公钥私钥,交换使用,会有风险吗?

私钥泄露,公钥我保存好, 别人能通过私钥,能逆向出公钥吗?

谢谢

2081 次点击
所在节点    问与答
25 条回复
arthurire
2021-10-22 16:46:38 +08:00
你发给对方的是一段明文和一个签名.

公钥可以验证"这个签名是不是由指定明文和指定私钥生成的"

所以到期时间必须是你写的时间,私钥是你的私钥,这个验证流程才能通过.

所以你明文给他就好了.
lakehylia
2021-10-22 17:25:05 +08:00
私钥是加密的,公钥不需要解密出密文,只需要验证正确就可以。你把到期时间用私钥加密,然后把到期时间明文跟密文一起发给客户端,客户端用公钥验证这个密文的正确性,然后到期时间跟本地比较就行。
gps949
2021-10-22 17:30:08 +08:00
完整性、身份认证场景:私钥签名—>公钥验签
保密场景:公钥加密—>私钥解密
GuuJiang
2021-10-22 17:44:55 +08:00
又见月经问题,参见我在 https://v2ex.com/t/704756#r_9467988 里的回复,基本可以解决类似问题的一切疑问
ysc3839
2021-10-22 17:45:02 +08:00
这也是我在另一个帖子中说自己看 RSA 原理然后写一个的原因,因为现成的 RSA 实现基本上都给你层层封装了,不一定合适,自己写的话可以把长度压缩到最短。
可以参考这个页面 https://crunch.js.org/examples/rsa.html 自己理解下 RSA 的数学计算过程。
以及参考这个回答 https://www.zhihu.com/question/25912483/answer/31653639 有提到签名的验证的算法。

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

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

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

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

© 2021 V2EX