Как использовать другой алфавит для классов Base32?
На питоне, когда я делаю:
encoded = base64.b32encode("1ACC64E9510C32CE8E34".decode('hex'))
я получил DLGGJ2KRBQZM5DRU
, Пока на Crypto++:
std::string decoded2;
std::string first_20="1ACC64E9510C32CE8E34";
StringSource ssv(first_20, true /*pumpAll*/,
new HexDecoder(
new StringSink(decoded2)
) // HexDecoder
); // StringSource
boost::algorithm::to_lower(decoded2);
StringSource ss( decoded2, true,
new Base32Encoder(
new StringSink(hash_sink)
) // Base64Decoder
); // StringSource
std::cout<<"encoded raw:"<<hash_sink<<std::endl;
я получил DMGGJ4MTBS3N7DTW
что неправильно.
Есть ли способ, которым я могу кодировать строку выше в C++ и получить такой же результат, как это делает Python?
1 ответ
Я нашел идеальное решение GitHub
static const CryptoPP::byte ALPHABET[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; // Most libraries use RFC4648.
const std::string decode( const std::string& encoded )
{
std::string decoded;
static int decoding_array[256];
CryptoPP::Base32Decoder::InitializeDecodingLookupArray(decoding_array,
ALPHABET,
32,
true); // false = case insensitive
CryptoPP::Base32Decoder b32decoder;
CryptoPP::AlgorithmParameters dp = CryptoPP::MakeParameters(
CryptoPP::Name::DecodingLookupArray(),
(const int *)decoding_array,
false);
b32decoder.IsolatedInitialize(dp);
b32decoder.Attach( new CryptoPP::StringSink( decoded ) );
b32decoder.Put( (std::uint8_t*)encoded.c_str(), encoded.size() );
b32decoder.MessageEnd();
return decoded;
}
Я надеюсь, что парень, который проголосовал против меня, также может увидеть это. Я очень плохо знаком с крипто ++ и криптографией в целом.