我使用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());
答案 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;
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。