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

Posted

技术标签:

【中文标题】如何为 Base32 类使用不同的字母表?【英文标题】:How to use a different alphabet for Base32 classes? 【发布时间】:2017-11-16 09:06:45 【问题描述】:

当我这样做时在 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 相同的结果?

【问题讨论】:

请始终发布带有头文件的代码。 (顺便说一句,我没有投反对票)。 头文件为#include &lt;string&gt; #include &lt;iostream&gt; #include &lt;rsa.h&gt; #include &lt;osrng.h&gt; #include &lt;files.h&gt; #include &lt;string&gt; #include &lt;boost/program_options.hpp&gt; #include &lt;hex.h&gt; #include &lt;boost/algorithm/string/case_conv.hpp&gt; #include &lt;boost/algorithm/string/erase.hpp&gt; using namespace std; #include &lt;base64.h&gt; #include &lt;rsa.h&gt; #include &lt;sha.h&gt; #include &lt;filters.h&gt; #include &lt;base32.h&gt; 这个问题怎么没有显示任何研究工作?我什至问过cryptopp问题跟踪器,他们说功能不一样github 你在哪里定义hash_sink hash_sink 只是一个空字符串来保存结果。我被告知我应该初始化 Crypto++ Base32 实现以使用与默认不同的字母表。但我不知道如何在上述代码的上下文中执行此操作 【参考方案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;

我希望投票给我的人也能看到这一点。 我对 crypto++ 和整个密码学非常陌生。

【讨论】:

这似乎与默认字母相同:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"。也许您应该准确地说明您想要什么,而不是说“这是错误的”。另请参阅base32.cpp 源文件。 在默认模式下,我只是得到不同的结果。起初我不知道这是一个字母问题。直到我在 cryptopp repo 上打开了一个问题。我还被问到使用这个特定的字母作为默认值有什么好处。我猜他想确定是否将其设为默认值。 如果模组也可以删除这篇文章,我将很高兴。我不明白为什么会投反对票,而这是一个与新用户永远不会第一手了解的复杂事物相关的问题。 我对这个社区感到失望,这是自不久前以来的第二次。我从来没有从这里收到过答案,大多数时候只是我自己回答。大多数人来这里只是为了赞成和反对投票而不是帮助用户吗?如果英语不是我的第一语言怎么办??我想这将是我在这里问的最后一个问题,甚至没有人对我的回答投赞成票。 我认为您可以标记该问题并要求版主将其删除。在网页中搜索“flag”一词。

以上是关于如何为 Base32 类使用不同的字母表?的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个字符设置0位?

如何为同一服务使用@Autowired 注解两个或多个不同的组件类?

如何为 kotlin 委托属性使用不同的类型

如何为不同的类声明相同的对象名称?

XML De/Serialization:如何为类的不同实例的相同属性定义不同的名称

如何为单个 UIView 提供两个不同的类引用?