gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:25:34 24 4
gpt4 key购买 nike

如何解码可与 pycryptodome 库(适用于 Python 3)一起使用的 DER/PEM 格式的 IPFS 私钥和公钥?我从 IPFS 配置文件中以字符串形式获取 key ,因此这里不再解释此过程。

我正在尝试做的事情:

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()

我收到以下异常:

key = Crypto.PublicKey.RSA.importKey(publicKey)
File "/usr/local/lib/python3.6/site-packages/Crypto/PublicKey/RSA.py", line 754, in import_key
raise ValueError("RSA key format is not supported")

与 privateKey 类似的问题。 key 采用什么格式以及如何将其转换为可接受的格式?

import_key函数源码有:https://github.com/Legrandin/pycryptodome/blob/master/lib/Crypto/PublicKey/RSA.py#L682

最佳答案

解决方案并不像我乍一看那么简单。

首先,您需要了解 PrivateKey 和 PublicKey 变量的内容不仅仅是以 Base64 编码的纯 key ,它是以 ByteArray 序列化然后以 Base64 编码的 protobuf 对象。为了从中获取 key ,您首先需要获取该对象的模式,可以通过 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 字符串解码为字节数组:

decoded = base64.b64decode(publicKey) 

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

def deserialize(byte_message, proto_type):
module_, class_ = proto_type.rsplit('.', 1)
class_ = getattr(crypto_pb2, class_) # crypto_pb2 is a name of module we recently created and imported
rv = class_()
rv.ParseFromString(byte_message) # use .SerializeToString() to reverse operation
return rv

我们进一步调用该函数,传递解码后的base64及其对应的类的名称(PublicKeypublicKeyPrivateKeyprivateKey),我对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()

关于python - 如何解码 DER/PEM 格式的 IPFS 私钥和公钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54270908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com