2017-08-14 267 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