如何在 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;
StringSource
是 BufferedTransformation
。 Integer
构造函数 you are using is:
Integer (BufferedTransformation &bt, size_t byteCount, Signedness sign=UNSIGNED, ByteOrder order=BIG_ENDIAN_ORDER)
在 StringSource
和 Integer
之间是 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
。
我使用 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;
StringSource
是 BufferedTransformation
。 Integer
构造函数 you are using is:
Integer (BufferedTransformation &bt, size_t byteCount, Signedness sign=UNSIGNED, ByteOrder order=BIG_ENDIAN_ORDER)
在 StringSource
和 Integer
之间是 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
。