在AES 256 Crypto ++中获取十六进制加密字符串

时间:2014-02-20 02:28:35

标签: c++ encryption crypto++

我正在尝试在MS visual studio中使用Crypto ++实现AES 256算法。操作系统是Windows 7(64位)。

我需要提供密钥作为十六进制字符串,密码作为字符串,最后我希望加密字符串也是十六进制字符串。

以下是我要做的事情:

我的加密方法:

std::string encrypt(const std::string &password)
{
    std::string plain = password;
    std::string ciphertext;
    char * decodedKey= "729308A8E815F6A46EB3A8AE6D5463CA7B64A0E2E11BC26A68106FC7697E727E37011";

    byte key[ CryptoPP::AES::MAX_KEYLENGTH ], iv[ CryptoPP::AES::BLOCKSIZE ];
    CryptoPP::StringSource( reinterpret_cast<const char *>(decodedKey), true,
              new  CryptoPP::HashFilter(*(new  CryptoPP::SHA256), new CryptoPP::ArraySink(key, CryptoPP::AES::MAX_KEYLENGTH)) );
    memset( iv, 0x00,  CryptoPP::AES::BLOCKSIZE );

    CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption Encryptor( key, sizeof(key), iv );
    CryptoPP::StringSource( plain, true, new CryptoPP::StreamTransformationFilter( Encryptor,
              new CryptoPP::HexEncoder(new CryptoPP::StringSink( ciphertext ) ) ) );

    std::cout<<"Ciphertext:" << ciphertext;
    return ciphertext;
}

从主要方法

int main(int argc, char* argv[]) {

    encrypt("test");
    return 0;
}

目前我只是为了调试而硬编码密钥。我的密钥是十六进制字符串,如下所示。我需要将输出加密字符串作为十六进制字符串。

1 个答案:

答案 0 :(得分:2)

  

我需要提供密钥作为十六进制字符串,密码作为字符串,最后我希望加密字符串也是十六进制字符串。

这在Crypto ++ wiki中有所介绍(有很多例子可供复制/粘贴)。来自HexDecoder's Scripting and Strings

  

有时,邮件列表会收到有关的问题   交叉验证。例如,请参阅AES CTR Chiper。不同的输出   在PHP-mcrypt和Crypto ++之间。在问题中,PHP-mcrypt字符串   用法如下:

$key = "1234567890123456789012345678901234567890123456789012345678901234";
$key = pack("H".strlen($key), $key);
$iv = "1111111111222222222233333333334444444444555555555566666666667777";
$iv = pack("H".strlen($iv), $iv);
     

避免拼写错误的最简单方法之一是通过复制/粘贴和a   HexDecoder:

string encodedKey = "1234567890123456789012345678901234567890123456789012345678901234";
string encodedIv = "1111111111222222222233333333334444444444555555555566666666667777";
string key, iv;

StringSource ssk(encodedKey, true /*pumpAll*/,
    new HexDecoder(
        new StringSink(key)
    ) // HexDecoder
); // StringSource

StringSource ssv(encodedIv, true /*pumpAll*/,
    new HexDecoder(
        new StringSink(iv)
    ) // HexDecoder
); // StringSource

运行上述代码后,keyiv是十六进制(即二进制)字符串,而不是可打印(即ASCII)字符串。