OpenSSL использует AES для шифрования и дешифрования файлов.
OpenSSL использует AES для шифрования и дешифрования файлов.

AES (Advanced Encryption Standard) — это симметричный алгоритм шифрования, который в настоящее время является одним из широко используемых алгоритмов шифрования. Алгоритм AES был выпущен Национальным институтом стандартов и технологий (NIST) в 2001 году. Он заменил исходный алгоритм DES (стандарт шифрования данных) и стал новым стандартом. AES — это симметричный алгоритм шифрования, то есть для шифрования и дешифрования используется один и тот же ключ. Для этого необходимо, чтобы безопасность ключа была очень важна, поскольку любой, у кого есть ключ, может выполнять операции шифрования и дешифрования. Длина его ключа включает 128 бит, 192 бита и 256 бит. Ключи разной длины обеспечивают разные уровни безопасности, при этом, как правило, более длинные ключи означают большую безопасность.

Алгоритм поддерживает несколько режимов работы, два из которых являются общими: CBC (цепочка блоков шифрования) и ECB (электронная кодовая книга).

  1. Режим CBC (цепочка блоков шифрования):
    • Принцип работы:
      • Режим CBC выполняет монопольную операцию над каждым блоком открытого текста с предыдущим блоком зашифрованного текста. В первом блоке используется вектор инициализации (IV) с открытым текстом ИСКЛЮЧАЮЩЕЕ. ИЛИ Этот механизм цепной обратной связи делает шифрование каждого блока зашифрованного текста зависимым от зашифрованного текста предыдущего блока, тем самым повышая безопасность.
    • Функции:
      • с вектором инициализации,Для одного и того же блока открытого текста полученный блок зашифрованного текста будет отличаться в зависимости от предыдущего блока открытого текста.
      • Применяется к данным, длина которых превышает один блок.
    • Преимущества и недостатки:
      • Преимущества: Обеспечивает более высокую безопасность.,Подходит для шифрования больших объемов данных.
      • Недостатки: Поскольку шифрование опирается на зашифрованный текст предыдущего блока.,Поэтому параллельная обработка невозможна.
  2. Режим ECB (электронная кодовая книга):
    • Принцип работы:
      • Режим ECB разбивает открытый текст на блоки,Каждый блок является независимым шифрованием.,Затем объедините их в зашифрованный текст. Один и тот же блок открытого текста всегда будет одним и тем же блоком зашифрованного текста.
    • Функции:
      • Вектор инициализации не требуется, один и тот же открытый текст получит тот же зашифрованный текст.
      • Подходит для шифрования независимых блоков данных.,Но для того же блока,Вывод в режиме ECB тот же.
    • Преимущества и недостатки:
      • Достоинства: Просто и легко реализовать.
      • Недостатки: один и тот же блок открытого текста генерирует один и тот же блок зашифрованного текста.,Может вызвать проблемы с безопасностью. Не подходит для шифрования больших объемов данных.

При выборе режима необходимо учитывать безопасность и производительность с учетом конкретных сценариев и требований приложения. Вообще говоря, режим CBC является более безопасным выбором, тогда как режим ECB может быть проще реализовать и понять. В практических приложениях также можно рассматривать другие режимы, такие как режим CTR (счетчик) и режим GCM (режим Галуа/счетчик). Эти режимы сочетают в себе соображения безопасности и производительности.

Информация о заголовочном файле, необходимая в этом случае, следующая:

Язык кода:javascript
копировать
#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")

Шифрование и дешифрование в режиме CBC.

Режим Cipher Block Chaining (CBC) — это рабочий режим симметричного блочного шифрования. В режиме CBC открытый текст делится на блоки фиксированного размера, и блоки обрабатываются один за другим с использованием алгоритма шифрования. Каждый блок подвергается операции XOR с зашифрованным текстом предыдущего блока, а затем шифруется. Этот процесс приводит к эффекту «цепочки», отсюда и название «Цепочка блоков шифра».

Вот подробный обзор режима CBC:

начальный вектор (Initialization Vector, IV)

  • существовать CBC режиме первый блок каждого сообщения использует начальный вектор (IV)。IV да Случайное число фиксированной длины, которое должно быть уникальным для каждого отдельного сообщения. IV Роль дасуществовать состоит в том, чтобы внести случайность в шифрование каждого блока, чтобы не допустить, чтобы один и тот же блок открытого текста генерировал один и тот же блок зашифрованного текста.

блочное шифрование

  • Сообщения делятся на фрагменты фиксированного размера (обычно 64 немного или 128 бит), то каждый блок является блочным шифрование. Наиболее часто используемый алгоритм блочного шифрования да AES。

операция исключающее ИЛИ

  • Перед каждым блоком шифрования блок открытого текста сопоставляется с предыдущим блоком шифрованного текста. исключающее ИЛИ. Вот тут-то и происходит «связывание». первый блок с IV ИСКЛЮЧАЮЩЕЕ ИЛИ.

шифрование

  • операция исключающее Результат после ИЛИ подается в блок алгоритма шифрования для шифрования. Полученный блок зашифрованного текста становится блоком следующего блока. IV。

Расшифровать

  • существовать Расшифроватьчас,Блок зашифрованного текста подается в блок Расшифровать алгоритм для Расшифровать. Результат после Расшифровать сравнивается с предыдущим блоком шифрованного текста операцию проверяющего ИЛИ.,Получите блок открытого текста.

Сериализация режима

  • Режим CBC является последовательным, поскольку зашифрованный текст каждого блока зависит от зашифрованного текста предыдущего блока. Это также означает, что все сообщение не может быть обработано параллельно.

наполнение

  • Если длина открытого текста не кратна размеру блока, требуется наполнение. Распространенной схемой наполнения является PKCS#7.

безопасность

  • при использовании режима CBC,Порядок блоков зашифрованного текста имеет решающее значение для безопасности. Если поменять местами два фрагмента сообщения,Расшифровать приведет к получению другого открытого текста. поэтому,Необходимо гарантировать, что порядок блоков зашифрованного текста не будет изменен.

Сценарии использования

  • CBC Режим часто используется для защиты протоколов безопасности транспортного уровня, таких как ТЛС) в,предоставитьшифрованиеиданныечестность。

В целом, режим CBC обеспечивает относительно надежный метод шифрования, но его реализация требует осторожности при использовании случайных и непредсказуемых IV и заполнении.

AES_set_encrypt_key функция. В частности, он используется для установки исходного ключа, доступного на AES Формат, используемый в алгоритмах шифрования. Вот прототип функции:

Язык кода:javascript
копировать
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 Прототип функции:

Язык кода:javascript
копировать
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 Прототип функции:

Язык кода:javascript
копировать
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Напротив, он используется для Расшифроватьданные。

Язык кода:javascript
копировать
// ключ инициализации
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документ;

Язык кода:javascript
копировать
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документ;

Язык кода:javascript
копировать
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;
}

Выходной рендеринг после запуска выглядит следующим образом:

Используйте шифрование и дешифрование в режиме ECB.

Electronic Codebook (ECB) Режим да — это рабочий режим симметричного шифрования блочного шифра. существовать ECB В этом режиме каждый блок открытого текста шифруется независимо и не зависит от других блоков. Это означает, что один и тот же блок открытого текста всегда будет генерировать один и тот же блок зашифрованного текста, что может привести к некоторым проблемам безопасности.

Следующие да ECB Подробный обзор шаблона:

блочное шифрование

  • Сообщения делятся на фрагменты фиксированного размера (обычно 64 немного или 128 Биты),然назад每个块都被独立шифрование. Наиболее часто используемый алгоритм блочного шифрования да AES。

Нет ссылки

  • существовать ECB модельсередина,шифрование независимо от каждого блока,На него не повлияют предыдущий и последующие блоки. Это означает, что один и тот же блок открытого текста будет генерировать один и тот же блок зашифрованного текста.

Сериализация режима

  • ECB Этот режим позволяет параллельную обработку всего сообщения, поскольку каждый фрагмент независим. Это да и CBC Преимущество перед шаблоном, поскольку оно обеспечивает более эффективную реализацию.

наполнение

  • Если длина открытого текста не кратна размеру блока, требуется наполнение. Распространенной схемой наполнения является PKCS#7.

безопасностьвопрос

  • Основная проблема безопасности — создание одного и того же блока зашифрованного текста из одного и того же блока открытого текста.,Это может привести к некоторым атакам. Например,Если содержимое двух блоков одинаково,Тогда их зашифрованный текст также будет одинаковым.

Сценарии использования

  • потому чтобезопасностьвопрос,ECB Шаблоны подходят не для всех сценариев. В общем, ЕЦБ Режим симметрии в основном используется для базового понимания и академических исследований, тогда как другие рабочие режимы чаще используются в практических приложениях, таких как CBC или GCM。

В целом режим ЕЦБ да Режим работы с простым блочным шифром,Но из-за проблемы безопасности,Другие режимы работы чаще используются в практических приложениях.

AES_ecb_encrypt да OpenSSL библиотека для исполнения AES алгоритмический ECB Функция шифрования шаблона. Подробный обзор этой функции приведен ниже:

Язык кода:javascript
копировать
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)действовать。

Возвращаемое значение:

  • Возвращает 0 при успехе, другие значения при ошибках.

Описание функции:

  • AES_ecb_encrypt функцияиспользуется длясуществовать ECB Выполнить в режиме AES алгоритмическийшифрованиеили Расшифроватьдействовать,Зависит от enc параметр.
  • существовать ECB модель下,Функция будет входить в блок данных самостоятельно шифрование (или Расшифровать).,На выходной результат каждого блока не влияют предыдущие и последующие блоки.
  • функция通过 key Ключевая информация, предоставляемая параметром, выполняет операцию шифрованиеили Расшифровать.

AES_ecb_encrypt да OpenSSL библиотека для исполнения AES алгоритмический ECB Шаблон шифрованияили Расшифровать функцию. Подробный обзор этой функции приведен ниже:

Язык кода:javascript
копировать
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)действовать。

Возвращаемое значение:

  • Возвращает 0 при успехе, другие значения при ошибках.

Описание функции:

  • AES_ecb_encrypt функцияиспользуется длясуществовать ECB Выполнить в режиме AES алгоритмическийшифрованиеили Расшифроватьдействовать,Зависит от enc параметр.
  • существовать ECB модель下,Функция будет входить в блок данных самостоятельно шифрование (или Расшифровать).,На выходной результат каждого блока не влияют предыдущие и последующие блоки.
  • функция通过 key Ключевая информация, предоставляемая параметром, выполняет операцию шифрованиеили Расшифровать.
Язык кода:javascript
копировать
// 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документ;

Язык кода:javascript
копировать
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документ;

Язык кода:javascript
копировать
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;
}

Выходной рендеринг после запуска выглядит следующим образом:

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода