Как декодировать закрытый и открытый ключ IPFS в формате DER / PEM?

Попробуйте следующее:

$ echo -e "A \xd8\xa8 ña ñe ño áÄãç " | sed -r "s/[^a-zA-Z0-9]//g"
Aaeo

Альтернативой будет печать всего диапазона ASCII (но символа пробела и управляющих символов):

$ echo -e "A \xd8\xa8 ña ñe ño áÄãç " | sed -r "s/[^\x21-\x7F]//g"
Aaeo
0
задан Vergeltung 19 January 2019 в 20:02
поделиться

1 ответ

1115 Решение было не таким простым, как мне показалось на первый взгляд.

Для начала вам нужно понять, что содержимое переменных PrivateKey и PublicKey - это не просто чистый ключ, закодированный в Base64, это объект protobuf, сериализованный в ByteArray, а затем закодированный в Base64. Чтобы получить ключ от него, вам сначала нужно получить схему этого объекта, которая доступна по ссылке .

Мы сохраняем этот файл и следуем инструкциям на этой странице . Короче говоря, я выполнил команду protoc --python_out=. crypto.proto для создания модуля Python под названием crypto_pb2.py.

Все приготовления завершены, и теперь перейдите к коду:

import crypto_pb2
import base64

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

Сначала необходимо декодировать строку base64 в байтовый массив:

decoded = base64.b64decode(publicKey) 

Эта функция десериализует массив байт в знакомый объект Python protobuf, я взял его из этого ответа и немного изменил:

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 и имя класса которому он соответствует (PublicKey для publicKey и PrivateKey для privateKey), меня интересует свойство Data.

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

Теперь вы можете передать его в функцию import_key как ByteArray. Не выполняйте дополнительных преобразований.

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()
0
ответ дан Vergeltung 19 January 2019 в 20:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: