AES (Advanced Encryption Standard) — это симметричный алгоритм шифрования, который в настоящее время является одним из широко используемых алгоритмов шифрования. Алгоритм AES был выпущен Национальным институтом стандартов и технологий (NIST) в 2001 году. Он заменил исходный алгоритм DES (стандарт шифрования данных) и стал новым стандартом. AES — это симметричный алгоритм шифрования, то есть для шифрования и дешифрования используется один и тот же ключ. Для этого необходимо, чтобы безопасность ключа была очень важна, поскольку любой, у кого есть ключ, может выполнять операции шифрования и дешифрования. Длина его ключа включает 128 бит, 192 бита и 256 бит. Ключи разной длины обеспечивают разные уровни безопасности, при этом, как правило, более длинные ключи означают большую безопасность.
Алгоритм поддерживает несколько режимов работы, два из которых являются общими: CBC (цепочка блоков шифрования) и ECB (электронная кодовая книга).
При выборе режима необходимо учитывать безопасность и производительность с учетом конкретных сценариев и требований приложения. Вообще говоря, режим CBC является более безопасным выбором, тогда как режим ECB может быть проще реализовать и понять. В практических приложениях также можно рассматривать другие режимы, такие как режим CTR (счетчик) и режим GCM (режим Галуа/счетчик). Эти режимы сочетают в себе соображения безопасности и производительности.
Информация о заголовочном файле, необходимая в этом случае, следующая:
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <openssl/err.h>
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/crypto.h>
#include <openssl/pem.h>
extern "C"
{
#include <openssl/applink.c>
}
#pragma comment(lib,"libssl_static.lib")
#pragma comment(lib,"libcrypto.lib")
Режим Cipher Block Chaining (CBC) — это рабочий режим симметричного блочного шифрования. В режиме CBC открытый текст делится на блоки фиксированного размера, и блоки обрабатываются один за другим с использованием алгоритма шифрования. Каждый блок подвергается операции XOR с зашифрованным текстом предыдущего блока, а затем шифруется. Этот процесс приводит к эффекту «цепочки», отсюда и название «Цепочка блоков шифра».
Вот подробный обзор режима CBC:
начальный вектор (Initialization Vector, IV):
блочное шифрование:
операция исключающее ИЛИ:
шифрование:
Расшифровать:
Сериализация режима:
наполнение:
безопасность:
Сценарии использования:
В целом, режим CBC обеспечивает относительно надежный метод шифрования, но его реализация требует осторожности при использовании случайных и непредсказуемых IV и заполнении.
AES_set_encrypt_key
функция. В частности, он используется для установки исходного ключа, доступного на AES Формат, используемый в алгоритмах шифрования. Вот прототип функции:
int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
userKey
:Указывает на вход, используемый для установки ключаданныеуказатель,Это оригинальный ключ.bits
:Длина ключа,По кусочкам. существуют использование AES алгоритм шифрования, обычно 128、192 или 256。key
:ориентированный AES_KEY
Указатель на структуру, используемую для хранения заданной ключевой информации.Нулевое значение функциивозвращаться указывает на успех.,Ненулевое значение указывает на неудачу. После успешного звонка,key
Отформатированная ключевая информация сохраняется в параметре, который можно использовать позже. AES Используется в операциях шифрования.
AES_cbc_encrypt
да OpenSSL библиотека для исполнения AES в алгоритме Cipher Block Chaining (CBC) Функция режима. существовать CBC В этом режиме каждый блок открытого текста подвергается операции XOR с предыдущим блоком зашифрованного текста перед шифрованием, чтобы повысить случайность пароля.
Следующие да AES_cbc_encrypt
Прототип функции:
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char *ivec, const int enc);
in
:ориентированный输入данные(простой текст)указатель。out
:ориентированный输出данные(зашифрованный текст)указатель。length
:данныедлина,В байтах.key
:ориентированный AES_KEY
Указатель на структуру, содержащую ключ шифрования.ivec
:Initialization Вектор (IV), используемый для повышения случайности пароля, также представляет собой предыдущий блок зашифрованного текста. существовать CBC режим, IV Требуется для первого блока данных да, после этого IV Определяется предыдущим блоком зашифрованного текста.enc
:Укажите операциюдашифрование(AES_ENCRYPT
)возвращатьсяда Расшифровать(AES_DECRYPT
)。AES_set_decrypt_key
функция. Эта функция используется для настройки ключа, используемого для шифрования, на ключ, используемый для дешифрования, чтобы выполнить операцию дешифрования.
Следующие да AES_set_decrypt_key
Прототип функции:
int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
userKey
:ориентированныйиспользуется для Установить ключ Расшифроватьклавиша вводаданныеуказатель。bits
:Длина ключа,По кусочкам. Поддерживаемые длины включают 128, 192 и 256 бит.key
:ориентированный AES_KEY
Указатель на структуру, в которой будет храниться заданный ключ Расшифровать.Реализовать функцию добавления Расшифровать,следующееopenssl_aes_cbc_encrypt
используется дляиспользоватьCBCмодельшифрованиеданные,openssl_aes_cbc_decrypt
Напротив, он используется для Расшифроватьданные。
// ключ инициализации
const unsigned char key[AES_BLOCK_SIZE] = { 0x12,0x55,0x64,0x69,0xf1 };
// вектор инициализации
unsigned char iv[AES_BLOCK_SIZE] = { 0 };
// AES CBC модельшифрование
// параметр:
// - in: обращатьсяшифрованиеизданные
// - len: продолжительность ожидания шифрованные
// - out: Буфер для хранения результатов шифрования
// Возвращаемое значение:
// - возвращатьсянаполнениеназадшифрованиеданныедлина,неудачавозвращаться-1
int openssl_aes_cbc_encrypt(char* in, size_t len, char* out)
{
AES_KEY aes;
// наполняемые — целое число, кратное AES_BLOCK_SIZE
char* aesIn;
int blockNum, aesInLen;
// Установить ключ шифрования
if (AES_set_encrypt_key(key, 128, &aes) < 0)
{
return -1;
}
// Определите, является ли исходная длина данных да целым числом, кратным AES_BLOCK_SIZE.
if ((len % AES_BLOCK_SIZE) != 0)
{
// Если да не кратно целому числу, используйте 0наполнение.
blockNum = len / AES_BLOCK_SIZE + 1;
aesInLen = blockNum * AES_BLOCK_SIZE;
aesIn = (char*)calloc(aesInLen, 1);
memcpy(aesIn, in, len);
}
else
{
aesInLen = len;
aesIn = (char*)calloc(aesInLen, 1);
memcpy(aesIn, in,Лен);
} }
// Номерной знак AES CBC
AES_cbc_encrypt ( (беззнаковый символ *) aesIn, (unsigned char*)out, aesInLen, &aes, iv, AES_ENCRYPT);
// Освободить выделенную память
free(aesIn);
// возвращатьсянаполнениеназадшифрованиеданныедлина
return aesInLen;
}
// AES CBC модель Расшифровать
// параметр:
// - in: обращаться Расшифроватьизданные
// - len: обращаться Расшифроватьданныедлина
// - out: Буфер для хранения результатов Расшифровать
// Возвращаемое значение:
// - успехвозвращаться0,неудачавозвращаться-1
int openssl_aes_cbc_decrypt(char* in, size_t len, char* out)
{
AES_KEY aes;
// Установить ключ Расшифровать
if (AES_set_decrypt_key(key, 128, &aes) < 0)
{
return -1;
}
// AES CBC модель Расшифровать
AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv,AES_DECRYPT);
// возвращатьсяуспех
return 0;
}
Когда вам нужна помощь с шифрованием данных,Сначала откройтешифрованиедокумент这里我们Открытьизчасcsdn.zip
документ,шифрованиеназад会写出为csdn.cbc
документ;
int main(int argc, char* argv[])
{
// Массив, в котором хранится количество байт при заполнении.
char offset[4] = { '0' };
char* src = nullptr, *dst = nullptr;
int inlen, outlen, size;
FILE* srcFile, *dstFile;
// Откройте исходный файл, являющийся шифрованием
srcFile = fopen("d://comp/csdn.zip", "rb");
// шифрование после записи файла
dstFile = fopen("d://comp/csdn.cbc", "wb+");
// Получить размер файла
fseek(srcFile, 0, SEEK_END);
inlen = ftell(srcFile);
if (inlen < 0)
{
return 0;
}
fseek(srcFile, 0,SEEK_SET);
// -------------------------------------------------------
// Начать шифрование
источник = (char*)calloc(inlen, 1);
size = fread(src, 1, inlen, srcFile);
std::cout << «Читать в байтах: " << size << std::endl;
// Пространство, запрошенное выходной переменной, увеличивается на 16 байт.
outlen = (inlen / 16 + 1) * 16;
dst = (char*)calloc(outlen,1);
// 调用шифрованиефункция
size = openssl_aes_cbc_encrypt(src, inlen, dst);
// Получите количество байт наполнения и запишите его в первые 4 байта выходного файла.
sprintf(offset, "%d", size - inlen);
fwrite(offset, sizeof(char), 4, dstFile);
// -------------------------------------------------------
// Размер файла после вывода шифрования или Расшифровать должен соответствовать исходному файлу.
size = fwrite(dst, 1, size, dstFile);
std::cout << «Размер выходного файла: " << size << std::endl;
fcloseall();
free(src);
free(dst);
system("pause");
return 0;
}
Выходной рендеринг после запуска выглядит следующим образом:
Расшифровать также необходимо, чтобы открыть файл,Воляшифрованиедокументcsdn.cbc
Открыть,и Расшифровать Вывод какcsdnde.zip
документ;
int main(int argc, char* argv[])
{
// Массив, в котором хранится количество байт при заполнении.
char offset[4] = { '0' };
char* src = nullptr, *dst = nullptr;
int inlen, outlen, size;
FILE* srcFile, *dstFile;
// Открыть файл после шифрования
srcFile = fopen("d://comp/csdn.cbc", "rb");
// Файл написан после Расшифровать
dstFile = fopen("d://comp/csdnde.zip", "wb+");
// Получить размер файла
fseek(srcFile, 0, SEEK_END);
inlen = ftell(srcFile);
if (inlen < 0)
{
return 0;
}
fseek(srcFile, 0, SEEK_SET);
// -------------------------------------------------------
fread(offset, sizeof(char), 4, srcFile);
inlen -= 4;
src = (char*)calloc(inlen, 1);
// Получить количество байт заполнения из файла после шифрования.
size = fread(src, 1, inlen, srcFile);
std::cout << «Читать в байтах: " << size << std::endl;
// Получить исходный размер файла
size = size - atoi(offset);
outlen = (inlen / 16 + 1) * 16;
dst = (char*)calloc(outlen, 1);
// Расшифровать
openssl_aes_cbc_decrypt(src, inlen, dst);
// -------------------------------------------------------
// Размер файла после вывода шифрования или Расшифровать должен соответствовать исходному файлу.
size = fwrite(dst, 1, size, dstFile);
std::cout << «Размер выходного файла: " << size << std::endl;
fcloseall();
free(src);
free(dst);
system("pause");
return 0;
}
Выходной рендеринг после запуска выглядит следующим образом:
Electronic Codebook (ECB) Режим да — это рабочий режим симметричного шифрования блочного шифра. существовать ECB В этом режиме каждый блок открытого текста шифруется независимо и не зависит от других блоков. Это означает, что один и тот же блок открытого текста всегда будет генерировать один и тот же блок зашифрованного текста, что может привести к некоторым проблемам безопасности.
Следующие да ECB Подробный обзор шаблона:
блочное шифрование:
Нет ссылки:
Сериализация режима:
наполнение:
безопасностьвопрос:
Сценарии использования:
В целом режим ЕЦБ да Режим работы с простым блочным шифром,Но из-за проблемы безопасности,Другие режимы работы чаще используются в практических приложениях.
AES_ecb_encrypt
да OpenSSL библиотека для исполнения AES алгоритмический ECB Функция шифрования шаблона. Подробный обзор этой функции приведен ниже:
int AES_ecb_encrypt(const unsigned char *input, unsigned char *output, const AES_KEY *key, const int enc);
Описание параметра:
input
: Указатель на входной буфер данных для шифрования.output
: Указатель на выходной буфер данных после шифрования.key
: AES Указатель структуры ключа, содержащий ключевую информацию, необходимую для шифрования.enc
: целое значение,используется для указаниядаосуществлятьшифрование(AES_ENCRYPT
)возвращатьсяда Расшифровать(AES_DECRYPT
)действовать。Возвращаемое значение:
Описание функции:
AES_ecb_encrypt
функцияиспользуется длясуществовать ECB Выполнить в режиме AES алгоритмическийшифрованиеили Расшифроватьдействовать,Зависит от enc
параметр.key
Ключевая информация, предоставляемая параметром, выполняет операцию шифрованиеили Расшифровать.AES_ecb_encrypt
да OpenSSL библиотека для исполнения AES алгоритмический ECB Шаблон шифрованияили Расшифровать функцию. Подробный обзор этой функции приведен ниже:
int AES_ecb_encrypt(const unsigned char *input, unsigned char *output, const AES_KEY *key, const int enc);
Описание параметра:
input
: Указатель на входной буфер блока данных, который будет использоваться.output
: Указатель на выходной буфер блока данных после шифрования или Расшифровать.key
: AES Указатель структуры ключа содержит ключевую информацию, необходимую для шифрованияили Расшифровать.enc
: целое значение,используется для указаниядаосуществлятьшифрование(AES_ENCRYPT
)возвращатьсяда Расшифровать(AES_DECRYPT
)действовать。Возвращаемое значение:
Описание функции:
AES_ecb_encrypt
функцияиспользуется длясуществовать ECB Выполнить в режиме AES алгоритмическийшифрованиеили Расшифроватьдействовать,Зависит от enc
параметр.key
Ключевая информация, предоставляемая параметром, выполняет операцию шифрованиеили Расшифровать.// AES ECB модельшифрование
// параметр:
// - in: обращатьсяшифрованиеизданные
// - len: продолжительность ожидания шифрованные
// - out: Буфер для хранения результатов шифрования
// Возвращаемое значение:
// - успехвозвращатьсянаполнениеназадшифрованиеданныедлина,неудачавозвращаться-1
int openssl_aes_ecb_enrypt(char* in, size_t len, char* out)
{
int i;
int blockNum;
int aesInLen;
char* aesIn;
AES_KEY aes;
// Установить ключ шифрования
if (AES_set_encrypt_key(key, 128, &aes) < 0)
return -1;
// Определите, является ли исходная длина данных да целым числом, кратным AES_BLOCK_SIZE.
if ((len % AES_BLOCK_SIZE) != 0)
{
blockNum = len / AES_BLOCK_SIZE + 1;
aesInLen = blockNum * AES_BLOCK_SIZE;
aesIn = (char*)calloc(aesInLen, 1);
memcpy(aesIn, in, len);
}
else
{
blockNum = len / AES_BLOCK_SIZE;
aesInLen = len;
aesIn = (char*)calloc(aesInLen, 1);
memcpy(aesIn, in, len);
}
// Поскольку ЕЦБ каждый раз обрабатывает только данные размера AES_BLOCK_SIZE, все шифрование данных выполняется в цикле.
for (i = 0; i < blockNum; i++)
{
AES_ecb_encrypt((unsigned char*)aesIn, (unsigned char*)out, &aes, AES_ENCRYPT);
aesIn += AES_BLOCK_SIZE;
out += AES_BLOCK_SIZE;
}
// свободная память
// free(aesIn);
// возвращатьсянаполнениеназадшифрованиеданныедлина
return aesInLen;
}
// AES ECB модель Расшифровать
// параметр:
// - in: обращаться Расшифроватьизданные
// - len: обращаться Расшифроватьданныедлина
// - out: Буфер для хранения результатов Расшифровать
// Возвращаемое значение:
// - успехвозвращаться0,неудачавозвращаться-1
int openssl_aes_ecb_decrypt(char* in, size_t len, char* out)
{
unsigned int i;
AES_KEY aes;
// Установить ключ Расшифровать
if (AES_set_decrypt_key(key, 128, &aes) < 0)
{
return -1;
}
// Цикл Расшифровать каждый блок данных
for (i = 0; i < len / AES_BLOCK_SIZE; i++)
{
AES_ecb_encrypt((unsigned char*)in, (unsigned char*)out, &aes,AES_DECRYPT);
in += AES_BLOCK_SIZE;
out += AES_BLOCK_SIZE;
}
// возвращатьсяуспех
return 0;
}
Когда вам нужна помощь с шифрованием данных,Сначала откройтешифрованиедокумент这里我们Открытьизчасcsdn.zip
документ,шифрованиеназад会写出为csdn.ecb
документ;
int main(int argc, char* argv[])
{
// Массив, в котором хранится количество байт при заполнении.
char offset[4] = { '0' };
char* src = nullptr, *dst = nullptr;
int inlen, outlen, size;
FILE* srcFile, *dstFile;
// Откройте исходный файл, являющийся шифрованием
srcFile = fopen("d://comp/csdn.zip", "rb");
// шифрование после записи файла
dstFile = fopen("d://comp/csdn.ecb", "wb+");
// Получить размер файла
fseek(srcFile, 0, SEEK_END);
inlen = ftell(srcFile);
if (inlen < 0)
{
return 0;
}
fseek(srcFile, 0,SEEK_SET);
// -------------------------------------------------------
// Начать шифрование
источник = (char*)calloc(inlen, 1);
size = fread(src, 1, inlen, srcFile);
std::cout << «Читать в байтах: " << size << std::endl;
// Пространство, запрошенное выходной переменной, увеличивается на 16 байт.
outlen = (inlen / 16 + 1) * 16;
dst = (char*)calloc(outlen, 1);
// ECBшифрование
size = openssl_aes_ecb_enrypt(src, inlen, dst);
sprintf(offset, "%d", size - inlen);
fwrite(offset, sizeof(char), 4, dstFile);
// -------------------------------------------------------
// Размер файла после вывода шифрования или Расшифровать должен соответствовать исходному файлу.
size = fwrite(dst, 1, size, dstFile);
std::cout << «Размер выходного файла: " << size << std::endl;
fcloseall();
free(src);
free(dst);
system("pause");
return 0;
}
Выходной рендеринг после запуска выглядит следующим образом:
Расшифровать также необходимо, чтобы открыть файл,Воляшифрованиедокументcsdn.ecb
Открыть,и Расшифровать Вывод какcsdnde.zip
документ;
int main(int argc, char* argv[])
{
// Массив, в котором хранится количество байт при заполнении.
char offset[4] = { '0' };
char* src = nullptr, *dst = nullptr;
int inlen, outlen, size;
FILE* srcFile, *dstFile;
// Открыть файл после шифрования
srcFile = fopen("d://comp/csdn.ecb", "rb");
// Файл написан после Расшифровать
dstFile = fopen("d://comp/csdnde.zip", "wb+");
// Получить размер файла
fseek(srcFile, 0, SEEK_END);
inlen = ftell(srcFile);
if (inlen < 0)
{
return 0;
}
fseek(srcFile, 0, SEEK_SET);
// -------------------------------------------------------
fread(offset, sizeof(char), 4, srcFile);
inlen -= 4;
src = (char*)calloc(inlen, 1);
// Получить количество байт заполнения из файла после шифрования.
size = fread(src, 1, inlen, srcFile);
std::cout << «Читать в байтах: " << size << std::endl;
// Получить исходный размер файла
size = size - atoi(offset);
outlen = (inlen / 16 + 1) * 16;
dst = (char*)calloc(outlen, 1);
// Расшифровать
openssl_aes_ecb_decrypt(src, inlen, dst);
// -------------------------------------------------------
// Размер файла после вывода шифрования или Расшифровать должен соответствовать исходному файлу.
size = fwrite(dst, 1, size, dstFile);
std::cout << «Размер выходного файла: " << size << std::endl;
fcloseall();
free(src);
free(dst);
system("pause");
return 0;
}
Выходной рендеринг после запуска выглядит следующим образом: