今天碰到一个对接 Java rsa pkcs1 用公钥解密,

2021-06-11 21:20:37 +08:00
 chenqh

python 我搜了好久,都是用私钥解密的, 论坛里的大佬有给个资料的吗?

我实在搜不到了

2766 次点击
所在节点    Python
21 条回复
zvcs
2021-06-11 21:22:30 +08:00
公钥不也是私钥吗?
GM
2021-06-11 21:30:49 +08:00
对于一对公钥、私钥:
公钥加密了,可以用对应的私钥解密。
私钥加密了,可以用对应的公钥解密。
LLaMA2
2021-06-11 21:32:44 +08:00
记住口诀,公加私解,私加公验
yuanmomo
2021-06-11 21:40:52 +08:00
公钥那个不叫解密,叫验证。从知乎看来的~

加密的时候,肯定不希望别人能看到解密过后的内容,所以就只能用私钥解密,对应就是公钥加密。

反过来,当有个东西我希望别人能验证就是属于我这个私钥,而不是别人的私钥那就是私钥签名,公钥验证
godblessumilk
2021-06-12 00:26:13 +08:00
理论上无论公钥加密还是私钥加密都是可以的,只是用私钥加密,能作简单的身份认证(用私钥加密明文,生成数字签名)
chenqh
2021-06-12 00:42:29 +08:00
@yuanmomo 但是我用 python 搞不了呀, 因为我对接的 java, 他用私钥加密的, 所以我用公钥解密, 但是试了好久都不行呀,
求指点
zonghow
2021-06-12 01:17:06 +08:00
M2Crypto 可以 关键 api:public_decrypt
liuidetmks
2021-06-12 07:19:44 +08:00
rsa 的话,公钥解密叫签名验证。

别人用私钥加密,你用公钥能解开 就能证明是他发的内容了。
xiangyuecn
2021-06-12 07:22:23 +08:00
本质上是没毛病的😂 N E D 三个数,NE 、ND 随便哪个做公钥,另外一个就是私钥

不过有一个问题,比较标准的密钥生成工具,指定了 N 后,E 一般给的就是 AQAB=65537,据说是因为这个数加密更快。然后,这样的固定的 E 只能是做公钥😂

附我几年前写的从 pem 中提取 N 、E 、D 的代码(纯字节码解析):

C#: https://github.com/xiangyuecn/RSA-csharp

Java: https://github.com/xiangyuecn/RSA-java

Python: - 🤷‍♂️
chenqh
2021-06-12 09:57:58 +08:00
@zonghow 我试试 m2crypto
chenqh
2021-06-12 10:00:02 +08:00
@zonghow 但是我 centos7 怎么装 `M2Crypto` 呀
chenqh
2021-06-12 10:15:43 +08:00
@zonghow 关键我还是用的 pyenv 装的 python3, 早知道用 ubuntu 了
chenqh
2021-06-12 10:33:46 +08:00
大佬们给个 python 私钥加密, 公钥解密的例子把, 我也不想私钥加密,公钥解密的呀, 但是对接就是这个样子呀, 大佬们, 帮帮忙把
openmm
2021-06-12 10:54:14 +08:00
哈哈哈哈 专业点叫私钥签名 公钥验签 虽然原理上也是加解密 但用途上目的不是为了加密 而是为了验证
chenqh
2021-06-12 11:10:12 +08:00
@openmm 不, 就是公钥解密, 他平台自己保留私钥, 他给我的内容是私钥加密的, 所以我这边需要公钥解密
LLaMA2
2021-06-12 11:56:39 +08:00
把密文和公钥发来,大伙给你验证下
chenqh
2021-06-12 12:27:23 +08:00
我左搜右搜,终于找到解密, 现在要搞私钥加密了
among
2021-06-15 17:11:39 +08:00
class MyRsa():
def __init__(self, pri_key_file, pub_key_file):
with open(pri_key_file, mode='rb') as privatefile:
private_keydata = privatefile.read()
self.privkey = rsa.PrivateKey.load_pkcs1(private_keydata)
with open(pub_key_file, mode='rb') as publicfile:
public_keydata = publicfile.read()
self.pubkey = rsa.PublicKey.load_pkcs1(public_keydata)

def encrypt_b64(self, msg):
crypto_text = rsa.sign(msg.encode('utf8'), self.privkey, 'SHA-1')
res = base64.b64encode(crypto_text)
res = res.decode()
logz.info(msg)
# logz.info(self.privkey)
logz.info(res)
return res



rsa1 = MyRsa(pri_key_file=pri_key_file, pub_key_file=pub_key_file)
signature = rsa1.encrypt_b64(sign_str)
print(signature)


试试,拷贝了一段。
chenqh
2021-06-15 18:27:08 +08:00
@among 我用 M2Crypto 实现了, 就是我的 python 需要重装
among
2021-06-15 20:24:34 +08:00
@chenqh

问题解决了,是不是也需要贴个 代码出来。。

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

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

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

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

© 2021 V2EX