如何解码DER/PEM格式的IPFS私钥和公钥?

2024-05-17 11:34:34 发布

您现在位置:Python中文网/ 问答频道 /正文

如何解码DER/PEM格式的IPFS私钥和公钥,它可以与pycryptome库一起使用(对于python3)?我以字符串的形式从IPFS配置文件中获取密钥,因此在这里我将不解释这个过程。在

我想做的是:

import base64, Crypto

publicKey = "CAASpgIwgE ... jkupAgMBAAE="
privateKey = "CAASqQkwgg ... Xmzva/Km7A=="

publicKey = base64.b64decode(publicKey)
key = Crypto.PublicKey.RSA.import_key(publicKey)
crypter = Crypto.Cipher.PKCS1_OAEPPKCS1_OAEP.new(key)
encryptedData = crypter.encrypt(data.encode())
result = base64.b64encode(encryptedData).decode()

我有以下例外:

^{pr2}$

privateKey也有类似的问题。密钥的格式是什么?如何将其转换为可接受的格式?在

导入键函数源代码在那里:https://github.com/Legrandin/pycryptodome/blob/master/lib/Crypto/PublicKey/RSA.py#L682


Tags: keyimport格式密钥解码cryptorsaipfs
1条回答
网友
1楼 · 发布于 2024-05-17 11:34:34

解决办法并不像我乍看起来那么简单。在

首先,您需要了解PrivateKey和PublicKey变量的内容不仅仅是Base64中编码的纯密钥,它是一个在ByteArray中序列化然后在Base64中编码的protobuf对象。为了从中获取一个键,首先需要获得这个对象的模式,reference可以使用这个模式。在

我们保存这个文件并按照this page上的说明操作。简而言之,我运行命令protoc python_out=. crypto.proto来创建一个名为crypto_pb2.py的Python模块。在

所有准备工作都已完成,现在转到代码:

import crypto_pb2
import base64

publicKey = "CAASpgIwgE ... jkupAgMBAAE="
privateKey = "CAASqQkwgg ... Xmzva/Km7A=="

必须首先将base64字符串解码为字节数组:

^{pr2}$

这个函数将一个字节数组反序列化为一个熟悉的Python protobuf对象,我从this answer获取它,并做了一些修改:

^{3}$

我们进一步调用函数,传递解码后的base64及其对应的类的名称(PublicKey表示publicKey,而{}表示{}),我对Data属性感兴趣。在

publicKey = deserialize(decoded, 'crypto.pb.PublicKey').Data

现在可以将其作为ByteArray传输到import_key函数。不要执行其他转换。在

key = Crypto.PublicKey.RSA.import_key(publicKey)
crypter = Crypto.Cipher.PKCS1_OAEPPKCS1_OAEP.new(key)
encryptedData = crypter.encrypt(data.encode())
result = base64.b64encode(encryptedData).decode()

相关问题 更多 >