为什么我的解密数据格式如下?

时间:2014-07-23 18:58:24

标签: c++ encryption aes crypto++

我目前正在开展一个侧面项目,以学习如何使用Crypto ++进行加密/解密。为了测试我的项目,我获得了以下值来帮助设置和验证我的项目是否正常工作:

original string: "100000"
encrypted value: "f3q2PYciHlwmS0S1NFpIdA=="
key and iv: empty byte array
key size: 24 bytes
iv size: 16 bytes

项目运行并解密加密值,但不是返回

"100000"

它返回

"1 0 0 0 0 0 "

每个空间真的是" \ 0"。这是我用于解密的最小代码:

#include "modes.h"
#include "aes.h"
#include "base64.h"

using namespace CryptoPP;

void main()
{
    string strEncoded = "f3q2PYciHlwmS0S1NFpIdA==";
    string strDecrypted;
    string strDecoded;
    byte abKey[24];
    byte abIV[AES::BLOCKSIZE];

    memset(abKey, 0, sizeof(abKey));
    memset(abIV, 0, AES::BLOCKSIZE);

    AES::Decryption cAESDecryption(abKey, sizeof(abKey));
    CBC_Mode_ExternalCipher::Decryption cCBCDecryption(cAESDecryption, abIV);

    StringSource(strEncoded, true, new Base64Decoder(new StringSink(strDecoded)));

    StreamTransformationFilter cDecryptor(cCBCDecryption, new StringSink(strDecrypted));
    cDecryptor.Put(reinterpret_cast<const byte*>(strDecoded.c_str()), strDecoded.size());
    cDecryptor.MessageEnd();
}

我可以按原样使用解密后的值,但我需要帮助理解的是为什么解密后的值显示为&#34; 1 0 0 0 0 0&#34;而不是&#34; 100000&#34;?顺便说一句,这是作为Windows控制台应用程序在VS2005中构建的,使用Crypto ++作为静态库,我使用调试模式来查看值。

2 个答案:

答案 0 :(得分:4)

添加strHex字符串,并在解密文本后添加以下行:

StringSource ss2(strDecrypted, true, new HexEncoder(new StringSink(strHex)));
cout << strHex << endl;

你应该看到类似的东西:

$ ./cryptopp-test.exe
310030003000300030003000

正如@Maarten所说,它看起来像没有 BOM的UTF-16 LE 。我的猜测是样本是在.Net中创建的,他们要求你用C ++ / Crypto ++解密。我猜测.Net是因为它的UTF-16 是小端,而Java默认是UTF-16 大端(IIRC)。

您还可以要求他们为您提供getBytes(Encoding.UTF8)生成的字符串。这也将支持这个问题。

因此strDecrypted中的值 a std::string。它只是一个需要转换的二进制字符串(a.k.a a Rope)。对于转换为UTF-8(或其他窄字符集),我相信您可以使用iconvlibiconv内置于GNU Linux的GLIBC(IIRC)中,可以在BSD的lib目录中找到。

如果您使用的是Windows,请使用WideCharToMultiByte功能。

答案 1 :(得分:2)

很可能只是使用UTF-16LE or UCS-2LE 编码的文本,显然没有字节顺序标记(BOM)。因此,要显示您必须先解码的文本。