проблема с крипто ++ ECIES BERDecodePrivateKey

Я пытаюсь сохранить ECIES num0 PrivateKey с помощью DEREncodePrivateKey в std::string и перезагрузить его в объекте num1 PrivateKey для тестирования. Проблема в том, что когда ключ загружается с помощью BERDecodePrivateKey во втором объекте PrivateKey, он не может быть проверен (также проверено шифрование и дешифрование без проверки и не расшифровано)

вот код

    using namespace CryptoPP;
        CryptoPP::AutoSeededRandomPool prng;

        ECIES<ECP>::PrivateKey pp; 
        pp.Initialize(prng, ASN1::secp256k1());
/* returns true*/
        bool val=pp.Validate(prng, 3);

        std::string saves;
        StringSink savesink(saves);
        pp.DEREncodePrivateKey(savesink);
/*additional unnecessary steps to make sure the key is written completely */
        savesink.MessageEnd();
        savesink.Flush(true);   

        ECIES<ECP>::PrivateKey pro;
        StringSource savesSource(saves, true);
        pro.BERDecodePrivateKey(savesSource,true,savesSource.MaxRetrievable());
/*here the exception is thrown */
        pro.ThrowIfInvalid(prng, 3);

1 ответ

Решение

Наконец -то выяснилось, в чем проблема, поскольку @maarten-bodewes, упомянутый в комментарии, закодированный в DER частный показатель не определяет OID кривой для объекта privateKey, поэтому перед декодированием BER и импортом ключа нам нужно каким-то образом определить OID для объекта; Самый простой способ - определить его, когда инициализация нового объекта выше кода изменяется на:

ECIES<ECP>::PrivateKey pro;
    StringSource savesSource(saves, true);
    auto rett = savesSource.MaxRetrievable();
    pro.Initialize(prng, ASN1::secp256k1());
    pro.BERDecodePrivateKey(savesSource,true,savesSource.MaxRetrievable());

Вас также AccessGroupParameters().Initialize(/*OID*/); или Initialize(/*OID*/) для существующего объекта

Другие вопросы по тегам