Расшифровать ASN.1 с помощью Crypto ++ - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь преобразовать последовательность ASN.1 «AgER» в CryptoPP::Integer.

#include <crypto++/asn.h>
#include <iostream>

int main(int, char*[])
{
    std::string base64{"AgER"};

    CryptoPP::StringSource s{base64, true};
    CryptoPP::BERSequenceDecoder d{s};
    CryptoPP::Integer i;
    i.BERDecode(d);

    std::cout << i.ConvertToLong() << std::endl;
}

Это вызывает исключение типа CryptoPP::BERDecodeErr с сообщением «BER decode error».

Различные инструменты ASN.1 могут без проблем анализировать строку: https://lapo.it/asn1js/#AgER

1 Ответ

1 голос
/ 17 июня 2020

Я обнаружил, что Crypto ++ ожидает двоичных данных, а не в кодировке Base64. Поэтому мне приходилось декодировать это раньше.

Вот рабочее решение;

#include <crypto++/asn.h>
#include <crypto++/base64.h>
#include <iostream>

int main(int, char*[])
{
    std::string base64{"AgER"};

    std::string decoded;
    CryptoPP::StringSource{base64, true, new CryptoPP::Base64Decoder{new CryptoPP::StringSink{decoded}}};

    CryptoPP::StringSource s{decoded, true};
    CryptoPP::Integer i;
    i.BERDecode(s);

    std::cout << i.ConvertToLong() << std::endl;
}
...