如何在 Crypto++ 中将 base64 转换为整数?

How to convert base64 to Integer in Crypto++?

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

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());
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

这是我实现此目的的解决方案。它使用了一些 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 流式传输和流式传输到 CryptoPP::Integer