如何为 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 <string> #include <iostream> #include <rsa.h> #include <osrng.h> #include <files.h> #include <string> #include <boost/program_options.hpp> #include <hex.h> #include <boost/algorithm/string/case_conv.hpp> #include <boost/algorithm/string/erase.hpp> using namespace std; #include <base64.h> #include <rsa.h> #include <sha.h> #include <filters.h> #include <base32.h>
这个问题怎么没有显示任何研究工作?我什至问过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 类使用不同的字母表?的主要内容,如果未能解决你的问题,请参考以下文章
如何为同一服务使用@Autowired 注解两个或多个不同的组件类?