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 ответов

8 просмотров

https://imgur.com/a/ZLuo1PM

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

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

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

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

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

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann Chapmann
19
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
19
Так а кто может спарсить всех участников чата? Идишники
Magic
18
Карта сайта