Помогите понять в чем ошибка, не получается провести декрипт. Приложил рабочий вариант на Python.
Сравнил hex значения всех параметров (salt, iv, key, cipher) - совпадают с тем что в Python.
Сравнил hex значения всех параметров (salt, iv, key, cipher) - совпадают с тем что в Python.
C++:
#include <iostream>
using std::cerr;
using std::cout;
using std::endl;
using std::string;
#include <vector>
using std::vector;
#include <string>
using std::string;
#include "cryptopp/hex.h"
using CryptoPP::HexDecoder;
using CryptoPP::HexEncoder;
#include "cryptopp/cryptlib.h"
using CryptoPP::AuthenticatedSymmetricCipher;
using CryptoPP::BufferedTransformation;
#include "cryptopp/filters.h"
using CryptoPP::AuthenticatedDecryptionFilter;
using CryptoPP::AuthenticatedEncryptionFilter;
using CryptoPP::Redirector;
using CryptoPP::StringSink;
using CryptoPP::StringSource;
#include "cryptopp/aes.h"
using CryptoPP::AES;
#include "cryptopp/sha.h"
using CryptoPP::SHA256;
#include "cryptopp/pwdbased.h"
using CryptoPP::PKCS5_PBKDF2_HMAC;
#include "cryptopp/gcm.h"
using CryptoPP::GCM;
#include "cryptopp/base64.h"
using CryptoPP::Base64Decoder;
using CryptoPP::byte;
#include "assert.h"
int main(int argc, char *argv[])
{
// purpose
byte unused = 0;
// password
byte password[] = "Caa5f6daa8#..";
size_t plen = strlen((const char *)password);
// salt
string salt_b64 = "1In+R0F1apmcIOjpkBDRSm3S65OGI3MV02ECZtU2hRY=";
string salt_temp;
StringSource ss(salt_b64, true, new Base64Decoder(new StringSink(salt_temp)));
const byte *salt = (const byte *)salt_temp.data();
size_t slen = strlen((const char *)salt);
// key
byte key[SHA256::DIGESTSIZE];
PKCS5_PBKDF2_HMAC<SHA256> pbkdf;
pbkdf.DeriveKey(key, 32, unused, password, plen, salt, slen, 10000);
// iv
string iv_b64 = "zbIzYeha9QW4hjw7eAPyYg==";
string iv_temp;
StringSource ss2(iv_b64, true, new Base64Decoder(new StringSink(iv_temp)));
const byte *iv = (const byte *)iv_temp.data();
size_t ivlen = strlen((const char *)iv);
// cipher
string cipher_b64 = "CSESV6gQenLzp+AGy9MypU2lBKjxOiCOXUU+xLYkOb8zYGrNOMw0JkgNWW/PH+184k1jYL2phcinsRd+OWidpSAca9z/w1eVpghvVfFYQ0Z6bp54BAxHHZO4DcWcGSBdpKEmAo4S3pzup6wpSnnupaqyImDQl7pwEg1KmqCQSocnKt3DJzzE/MxOW8byKwqh93bkwwIU9aX+/UJU5e23BU8b1bP2WeFc81huGRDyZS5Mz2OmVJAgfqRdBdXcGByLLp6wq/eDdm04vHw23IJdenU42Pdci8Mt4qdKI9ISfjX4RECE70mPpVtCz032CD/QhZdcwiJM1mwDw/7MOLh2OLwxEBHCdFsdzWfa/qpYHAOaJdt5M3TMB6Mu9Z15KkjBBBfm/WCd26JyhBFywmN6QuDuPsED2Nagz2SFFfyFJssMoAcrtzNC1VYh4q/5vdeNoHGh0lKwkXmmKmOat9GVHq8eDgT5RK3yvPaICbvQNCZ6OEOFrAwvt0asW1PfNgLQoLrbCa5et5B+XzUkzISknItDV9panBLIwOBsb9K3GJJ1BcgwOjHPe2u2XkcXwdRlcGGD3imJZnPEd+m+Kv1VbH2lNcKZ5LXZPYFyszr/+7SDO6PYx+7YJB9ewEpc10AYZ/fMnpOAh6ozDpZwMRwapAbOMhZf";
string cipher_temp;
StringSource ss3(cipher_b64, true, new Base64Decoder(new StringSink(cipher_temp)));
const byte *cipher_full = (const byte *)cipher_temp.data();
size_t cipher_full_len = strlen((const char *)cipher_full);
vector<byte> cipher_vector(cipher_full, cipher_full + cipher_full_len);
vector<byte> cipher_vector_shrinked;
cipher_vector_shrinked = vector<byte>(cipher_vector.begin(), cipher_vector.end() - 16);
byte *cipher = &cipher_vector_shrinked[0];
size_t cipher_len = strlen((const char *)cipher);
// decrypt
const int TAG_SIZE = 12;
GCM<AES>::Decryption d;
d.SetKeyWithIV(key, sizeof(key), iv, ivlen);
string rpdata;
AuthenticatedDecryptionFilter df(d, new StringSink(rpdata), AuthenticatedDecryptionFilter::DEFAULT_FLAGS, TAG_SIZE);
StringSource ss4(cipher, true, new Redirector(df));
cout << "Recovered: " << rpdata << endl;
return 0;
}
Python:
import base64
import hashlib
from Crypto.Cipher import AES
password = "Caa5f6daa8#.."
cipher_b64 = "CSESV6gQenLzp+AGy9MypU2lBKjxOiCOXUU+xLYkOb8zYGrNOMw0JkgNWW/PH+184k1jYL2phcinsRd+OWidpSAca9z/w1eVpghvVfFYQ0Z6bp54BAxHHZO4DcWcGSBdpKEmAo4S3pzup6wpSnnupaqyImDQl7pwEg1KmqCQSocnKt3DJzzE/MxOW8byKwqh93bkwwIU9aX+/UJU5e23BU8b1bP2WeFc81huGRDyZS5Mz2OmVJAgfqRdBdXcGByLLp6wq/eDdm04vHw23IJdenU42Pdci8Mt4qdKI9ISfjX4RECE70mPpVtCz032CD/QhZdcwiJM1mwDw/7MOLh2OLwxEBHCdFsdzWfa/qpYHAOaJdt5M3TMB6Mu9Z15KkjBBBfm/WCd26JyhBFywmN6QuDuPsED2Nagz2SFFfyFJssMoAcrtzNC1VYh4q/5vdeNoHGh0lKwkXmmKmOat9GVHq8eDgT5RK3yvPaICbvQNCZ6OEOFrAwvt0asW1PfNgLQoLrbCa5et5B+XzUkzISknItDV9panBLIwOBsb9K3GJJ1BcgwOjHPe2u2XkcXwdRlcGGD3imJZnPEd+m+Kv1VbH2lNcKZ5LXZPYFyszr/+7SDO6PYx+7YJB9ewEpc10AYZ/fMnpOAh6ozDpZwMRwapAbOMhZf"
iv_b64 = "zbIzYeha9QW4hjw7eAPyYg=="
salt_b64 = "1In+R0F1apmcIOjpkBDRSm3S65OGI3MV02ECZtU2hRY="
encrypted_data = base64.b64decode(cipher_b64)
salt = base64.b64decode(salt_b64)
vector = base64.b64decode(iv_b64)
key = hashlib.pbkdf2_hmac("sha256", password.encode("utf8"), salt, 10000, dklen=32)
cipher = AES.new(key, AES.MODE_GCM, nonce=vector)
decrypted_data = cipher.decrypt(encrypted_data[:-16]).decode("utf8")
print(decrypted_data)
