【问题标题】:Get hexadecimal encrypted string in AES 256 Crypto++在 AES 256 Crypto++ 中获取十六进制加密字符串
【发布时间】:2014-03-20 18:01:05
【问题描述】:

我正在尝试在 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;
}

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

【问题讨论】:

  • 抛开所有这些crypto++——你的终极问题是什么?是如何从一个字母字符串转换为每个字符十六进制字符串的两位数?
  • 除了让它落入以太之外,尝试对函数的返回值做一些事情吗?

标签: c++ encryption crypto++


【解决方案1】:

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

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

避免拼写错误的最简单方法之一是通过复制/粘贴和 十六进制解码器:

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)字符串。

【讨论】:

  • 请你检查一下这个问题:stackoverflow.com/questions/21965102/… ..它说明了实际问题
  • Parth - 我不是 Java 人,我很少使用它。 Java 人员可以更好地回答您的问题。
  • 是的,HexDecoder 工作正常,问题已解决。建议所有..请参考 Crypto++ 文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多