【问题标题】:How to convert base64 to Integer in Crypto++?如何在 Crypto++ 中将 base64 转换为整数?
【发布时间】:2017-06-07 14:25:20
【问题描述】:

我使用 Crypto++ 库。我有一个保存为 CString 的 base64 字符串。我想将我的字符串转换为整数。实际上这个base64是从一个整数构建的,现在我想再次转换为整数。但是两个整数不相等。换句话说,第二个整数不等于原始整数。

Base64Decoder bd;
CT2CA s(c);
std::string strStd(s);

bd.Put((byte*)strStd.data(), strStd.size());
bd.MessageEnd();

word64 size = bd.MaxRetrievable();
vector<byte> cypherVector(size);

string decoded;
if (size && size <= SIZE_MAX)
{
    decoded.resize(size);
    bd.Get((byte*)decoded.data(), decoded.size());
}

Integer cipherMessage((byte*)decoded.data(), decoded.size());

【问题讨论】:

  • 您是如何解决这个问题的?如果下面的代码对您不起作用,那么我们将需要查看一些 Base64 编码的数据,以便我们可以使用真实数据运行您的程序。

标签: c++ base64 crypto++ bigint


【解决方案1】:
string decoded;
if (size && size <= SIZE_MAX)
{
    decoded.resize(size);
    bd.Get((byte*)decoded.data(), decoded.size());
}

您有一个名为decoded 的字符串,但您从未通过Base64Decoder 运行它来真正解码数据。

使用类似以下的内容。我没有方便测试的 MFC 项目,所以我假设您将 CString 转换为 std::string

// Converted from Unicode CString
std::string str;

StringSource source(str, true, new Base64Decoder);
Integer value(val, source.MaxRetrievable());
std::cout << std::hex << value << std::endl;

StringSourceBufferedTransformationInteger 构造函数you are using is

Integer (BufferedTransformation &bt, size_t byteCount, Signedness sign=UNSIGNED, ByteOrder order=BIG_ENDIAN_ORDER)

StringSourceInteger 之间是Base64Decoder。它是一个即时解码字符串的过滤器。因此数据从源 (StringSource) 流向接收器 (Integer 构造函数)。

另请参阅 Crypto++ wiki 上的 Pipelines

【讨论】:

    【解决方案2】:

    这是我实现这一目标的解决方案。它使用了一些 Qt 类,但替换它们应该很简单:

    #include <QByteArray>
    #include <QScopedArrayPointer>
    
    #include <crypto++/base64.h>
    #include <crypto++/rsa.h>
    
    using namespace CryptoPP;
    
    Integer convertBase64ToCryptoPpInt(const QByteArray &base64)
    {
        Base64Decoder decoder;
        decoder.Put(reinterpret_cast<const byte*>(base64.data()), base64.size());
        decoder.MessageEnd();
        const word64 size = decoder.MaxRetrievable();
        QScopedArrayPointer<byte> decoded{new byte[size]};
        decoder.Get(decoded.data(), size);
        return {decoded.data(), size};
    }
    
    QByteArray convertCryptoPpIntToBase64(const Integer &i)
    {
        // Copy content of i into byte array
        const unsigned iLen = i.ByteCount();
        QScopedArrayPointer<byte> idata{new byte[iLen]};
        i.Encode(idata.data(), iLen);
    
        // Encode data
        Base64Encoder encoder;
        encoder.Put(idata.data(), iLen);
        encoder.MessageEnd();
        const int encodedSize = encoder.MaxRetrievable();
        QScopedArrayPointer<byte> encoded{new byte[encodedSize]};
        encoder.Get(encoded.data(), encodedSize);
    
        return {reinterpret_cast<char*>(encoded.data()), encodedSize};
    }
    

    使用CryptoPP's pipelining 可能更紧凑,但我不知道如何从CryptoPP::Integer 流式传输。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 2021-07-27
      相关资源
      最近更新 更多