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

时间:2017-01-23 06:11:43

标签: c++ base64 crypto++ bigint

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

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

2 个答案:

答案 0 :(得分:1)

这是我实现这一目标的解决方案。它使用了一些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到另外一个流。

答案 1 :(得分:0)

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