170 похожих чатов

#Include <tuple> #include <vector> #include <list> #include <string> #include <iostream> #include <random> #include <Windows.h> #pragma comment

(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.
Расшифровывается успешно - получаю нормальное значение на выходе.
Зашифровываю обратно и длинна шифрованного значения должна меняться, но она остается такая как в расшифрованном значении.

Что я делаю не так? Спасибо.

5 ответов

14 просмотров

https://imgur.com/a/ZLuo1PM

Ivan
https://imgur.com/a/ZLuo1PM

По идее должно Encrypted должно быть снова 41, но оно остается таким же как и расшифрованное значение.

Есть ли отдельный чат по шифрованию какой-то? Спасибо

Похожие вопросы

Обсуждают сегодня

Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
13
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Карта сайта