如何为Base32类使用不同的字母表?

时间:2017-11-16 09:06:45

标签: python c++ base64 crypto++ base32

在我做的时候在python上:

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 个答案:

答案 0 :(得分:0)

我找到了完美的解决方案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;
}

我希望那个贬低我的人也可以看到这个。 我对加密++和密码学作为一个整体非常陌生。