(lib, "crypt32")
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <openssl/rand.h>
const size_t kKeyLength = 32;
const size_t kNonceLength = 12;
std::vector<BYTE> decrypt_value(std::vector<BYTE> ciphertext, std::vector<BYTE> key)
{
BYTE tag[AES_BLOCK_SIZE];
BYTE nonce[kNonceLength];
std::copy(ciphertext.begin(), ciphertext.begin() + 12, nonce);
std::copy(ciphertext.end() - 16, ciphertext.end(), tag);
std::vector<BYTE> plaintext;
plaintext.resize(ciphertext.size(), '\0');
int actual_size = 0, final_size = 0;
EVP_CIPHER_CTX* d_ctx = EVP_CIPHER_CTX_new();
auto a = EVP_DecryptInit(d_ctx, EVP_aes_256_gcm(), key.data(), nonce);
auto b = EVP_DecryptUpdate(d_ctx, &plaintext[0], &actual_size, &ciphertext[kNonceLength], ciphertext.size() - sizeof(tag) - sizeof(nonce));
auto c = EVP_CIPHER_CTX_ctrl(d_ctx, EVP_CTRL_GCM_SET_TAG, 16, tag);
if (!EVP_DecryptFinal(d_ctx, &plaintext[actual_size], &final_size)) { return std::vector<BYTE>(); }
EVP_CIPHER_CTX_free(d_ctx);
plaintext.resize(actual_size + final_size, '\0');
return plaintext;
}
std::vector<BYTE> encrypt_value(std::vector<BYTE> input, std::vector<BYTE> key) {
BYTE tag[AES_BLOCK_SIZE];
BYTE nonce[kNonceLength];
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dis(0, 255);
for (size_t i = 0; i < kNonceLength; ++i) {
nonce[i] = dis(gen);
}
std::vector<BYTE> plaintext;
plaintext.resize(41);
int actual_size = 0, final_size = 0;
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
auto a = EVP_EncryptInit(ctx, EVP_aes_256_gcm(), key.data(), nonce);
auto b = EVP_EncryptUpdate(ctx, &plaintext[0], &actual_size, input.data(), input.size());
EVP_EncryptFinal(ctx, plaintext.data() + actual_size, &final_size);
EVP_CIPHER_CTX_free(ctx);
plaintext.resize(actual_size + final_size);
return plaintext;
}
int main(int argc, char** argv)
{
std::vector<BYTE> crypted = {
150, 20, 32, 125, 108, 253, 9, 175, 62, 74, 91, 237,
130, 7, 222, 87, 106, 74, 172, 219, 152, 226, 140,
137, 174, 247, 103, 64, 187, 60, 16, 232, 208, 34, 20,
194, 223, 195, 146, 24, 1};
std::vector<BYTE> key = {
9, 23, 177, 38, 212, 171, 87, 115, 170, 123, 227,
198, 99, 223, 196, 178, 41, 232, 200, 80, 89, 211,
31, 106, 49, 195, 52, 10, 11, 189, 146, 144
};
std::cout << "Key " << key.size() << ": " << key.data() << std::endl << "-----------" << std::endl;
std::cout << "Crypted " << crypted.size() << ": " << crypted.data() << std::endl;
std::vector<BYTE> decrypted = decrypt_value(crypted, key);
std::cout << "Decrypted " << decrypted.size() << ": " << decrypted.data() << std::endl;
std::vector<BYTE> encrypted = encrypt_value(decrypted, key);
std::cout << "Encrypted " << encrypted.size() << ": " << encrypted.data() << std::endl;
// Ошибка если снова попробовать расшифровать, видимо из-за размера
std::vector<BYTE> cryptcheck = decrypt_value(encrypted, key);
std::cout << "Check " << cryptcheck.size() << ": " << cryptcheck.data() << std::endl;
return 0;
}
Приветствую! Подскажите, пожалуйста, что я делаю неправильно. Пытаюсь расшифровать значение с ключом AES.
Расшифровывается успешно - получаю нормальное значение на выходе.
Зашифровываю обратно и длинна шифрованного значения должна меняться, но она остается такая как в расшифрованном значении.
Что я делаю не так? Спасибо.
https://imgur.com/a/ZLuo1PM
По идее должно Encrypted должно быть снова 41, но оно остается таким же как и расшифрованное значение.
Есть ли отдельный чат по шифрованию какой-то? Спасибо
@ru_cryptography
Обсуждают сегодня