2017-08-14 104 views
0

我有一个字符串哈希使用SHA256作为一个键,但我将如何使用此密钥加密在CBC模式和加密+ +的AES字符串? 谢谢。如何使用AES加SHA256哈希作为密钥crypto ++

+0

您可能应该阅读加密的基础知识。 _你是如何创建你的密钥无关紧要的。 SHA256是一种红鲱鱼。 – MSalters

+0

@ MSalters好的,谢谢,我对CBC模式下的AES工作原理有了一个基本的了解,但我只是解释了我是如何做出这个关键的,但我明白这并不重要。 – spies9149

+0

为什么要散列一个你想用作键的字符串?为什么不使用适当的密钥派生方案? –

回答

0

我最终以下面的代码达到了预期的效果。

QString qhash = "hash"; 
    std::string plain = "message"; 
    std::string ciphertext; 
    std::string stdhash = qhash.toStdString(); 

    CryptoPP::HexDecoder decoder; 
    decoder.Put((byte*)stdhash.data(),qhash.size()); 
    decoder.MessageEnd(); 

    CryptoPP::word64 size = decoder.MaxRetrievable(); 
    char *decodedKey = new char[size]; 
    decoder.Get((byte *)decodedKey, size); 

    byte hash[CryptoPP::AES::MAX_KEYLENGTH], iv[ CryptoPP::AES::BLOCKSIZE ]; 

    CryptoPP::StringSource(reinterpret_cast<const char *>(decodedKey), true,new CryptoPP::ArraySink(hash, CryptoPP::AES::MAX_KEYLENGTH)); 
    memset(iv, 0x00, CryptoPP::AES::BLOCKSIZE); 
    CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption Encryptor(hash,sizeof(hash),iv); 
    CryptoPP::StringSource(plain, true, new CryptoPP::StreamTransformationFilter(Encryptor, new CryptoPP::HexEncoder(new CryptoPP::StringSink(ciphertext)))); 
    return ciphertext; 
+0

为什么你不使用Qt的一切?看起来混合东西会让你的任务复杂化。 – jww

+0

这段代码对我来说看起来不太健康。你没有使用密钥派生函数。其中一个[Pipelines](https://www.cryptopp.com/wiki/Pipelining)什么都不做。 – jww

+0

@jww我并没有对Qt使用Qt,因为我希望代码能够用于不同的项目以及不使用Qt。我没有使用KDF,因为我不确定如何正确实施带有认证加密的KDF,但我目前正在研究如何执行此操作。这个功能解决了我最初的目标,这就是为什么我发布它作为答案。 – spies9149