C++ CryptoPP использует шифрование и дешифрование AES.
C++ CryptoPP использует шифрование и дешифрование AES.

Crypto++ (CryptoPP) — это библиотека C++ для криптографии и шифрования. Это проект с открытым исходным кодом, который предоставляет большое количество криптографических алгоритмов и функций, включая симметричное шифрование, асимметричное шифрование, хэш-функции, коды аутентификации сообщений (MAC), цифровые подписи и многое другое. Цель Crypto++ — предоставить высокопроизводительные и надежные инструменты криптографии для удовлетворения потребностей безопасности при разработке программного обеспечения.

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

Ниже приведены основные функции и обзор алгоритма шифрования AES:

  1. Алгоритм симметричного ключа: AES — алгоритм с симметричным ключом.,Это означает, что один и тот же ключ используется как для шифрования, так и для расшифрования данных. Это требует, чтобы взаимодействующие стороны передали ключ перед обменом данными.,и обеспечить ее конфиденциальность.
  2. Пароль блокировки: AES делит данные открытого текста на блоки фиксированного размера (128 бит).,Затем делайте независимое шифрование для каждого блока. Этот блок фиксированного размера называется группой. AES поддерживает пакеты различной длины.,В том числе 128-бит, 192-бит и 256-бит.
  3. Количество раундов: Алгоритм шифрования Безопасность AES связана с количеством раундов. Количество раундов представляет собой количество циклов обработки блока данных.,AES с ключами разной длины использует разное количество раундов. в целом,128-битный ключ использует 10 раундов.,192-битный ключ использует 12 раундов.,256-битный ключ использует 14 раундов.
  4. Длина ключа: AES поддерживает ключи различной длины.,В том числе 128-бит, 192-бит и 256-бит.Выбор длины ключа напрямую влияетшифрование Алгоритм безопасности。
  5. SubBytes, ShiftRows, MixColumns и AddRoundKey: Это Алгоритм шифрования AESЧетыре основные операции в,Они обрабатывают данные посредством нескольких итераций. SubBytes и ShiftRows вносят нелинейность,MixColumns и AddRoundKey обеспечивают распространение и запутывание.
  6. Сильная безопасность: AES широко считается безопасным、надежныйшифрованиеалгоритм。Он подвергся обширному криптоанализу и оценке.,и широко используется во многих приложениях,Включая шифрование коммуникаций, шифрование файлов и аппаратное шифрование.

В целом, AES — это эффективный, безопасный и широко используемый алгоритм шифрования, подходящий для различных сценариев применения. Он обеспечивает хороший баланс между надежностью шифрования и производительностью, что делает его предпочтительным алгоритмом для многих приложений информационной безопасности.

Использовать алгоритм AES

AES (расширенный стандарт шифрования) широко используется в процессе шифрования и дешифрования для защиты конфиденциальных данных. Ниже приводится обзор алгоритма AES:

1. Алгоритм симметричного шифрования:

AES — это симметричный алгоритм шифрования, то есть для шифрования и дешифрования используется один и тот же ключ. Ключи являются ключом к защите безопасности данных, поэтому алгоритмы симметричного шифрования должны обеспечивать безопасное распространение ключей и управление ими.

2. Длина ключа:

AES поддерживает ключи различной длины, включая 128-битные, 192-битные и 256-битные. Более длинные ключи обычно означают большую безопасность, но также могут привести к увеличению вычислительных затрат на шифрование и дешифрование.

3. Алгоритм шифрования блока:

AES — это алгоритм блочного шифрования, который шифрует данные блоками фиксированного размера (128 бит). Процессы шифрования и дешифрования представляют собой операции над этими блоками данных.

4. Процесс шифрования и дешифрования:

шифрование:
  • Фрагментирование данных: разделение открытого текста на фрагменты данных фиксированного размера (128 бит).
  • Добавление начального раундового ключа: над открытым текстом и начальным ключом выполняется простая операция обфускации.
  • Раундовое шифрование: запутывание блоков данных с помощью нескольких раундов операций подстановки и замены (SubBytes, ShiftRows, MixColumns, AddRoundKey).
  • Последний раунд: в последнем раунде операция MixColumns опускается.
  • Получите зашифрованный текст.
Расшифровка:
  • Решение для начального раундового ключа: выполните простую операцию обфускации зашифрованного текста и начального ключа.
  • Раунд расшифровки: выполнение обратных операций над блоками данных посредством нескольких раундов обратных операций (InvSubBytes, InvShiftRows, InvMixColumns, AddRoundKey).
  • Последний раунд: в последнем раунде операция InvMixColumns опускается.
  • Получите понятный текст.

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

AES широко используется для защиты конфиденциальных данных, таких как файлы, базы данных, сетевые коммуникации и т. д. Он является основой для многих протоколов и стандартов безопасности, включая TLS (уровень защищенных сокетов), IPsec (безопасность интернет-протокола) и других.

6. Безопасность:

AES широко распространен и считается безопасным и надежным алгоритмом шифрования. Выбор длины ключа имеет решающее значение для безопасности, и обычно рекомендуется использовать 128-битные, 192-битные или 256-битные ключи для удовлетворения конкретных требований безопасности.

общий,AES как эффективный и безопасный алгоритм симметричного шифрования,в наше времяшифрование Общение играет важную роль в。AESИспользование требует введения заголовочных файлов.#include <aes.h>Другие части и«C++ вычисляет значение хэша через CryptoPP»Введение заголовочного файла в статье должно быть последовательным.。

следующееAESEncryptэто Использовать алгоритм AESруководитьшифрованиефункция。Ниже приведены комментарии к основным шагам функции.:

  1. Инициализация объекта AES-шифрования:
    • создаватьAESEncryptionобъект, используемый дляAESшифрование。
    • Определите блоки данных, необходимые для шифрования AES.:inBlock(блок входных данных)、outBlock(Блок выходных данных)、xorBlock(блок исключающего ИЛИ)。
  2. Рассчитайте размер блока данных шифрования:
    • Рассчитать количество необходимых блоков данных для шифрования,Учтите, что исходный размер данных не может быть целым кратным размеру блока AES.
  3. Буфер данных после выделения шифрования:
    • Выделяет память на основе рассчитанного размера блока данных шифрования.
  4. Настройка ключа шифрования AES:
    • вызовSetKeyфункция Настройка ключа шифрования AES。
  5. Процесс шифрования AES:
    • Перебирайте фрагменты необработанных данных, по одному размеру фрагмента AES за раз.
    • Скопируйте исходный блок данных в блок входных данных.
    • Использовать алгоритм AESруководитьшифрование。
    • Скопируйте блок данных после шифрования в выходной буфер。
  6. Возврат результатов шифрования:
    • Возвращает буфер данных и размер после шифрования.

Обратите внимание, что при фактическом использовании убедитесь, что выделенная память освобождена, чтобы предотвратить утечки памяти.

Язык кода:c
копировать
BOOL AESEncrypt(BYTE *pOriginalData, DWORD dwOriginalDataSize, BYTE *pAESKey, DWORD dwAESKeySize, BYTE **ppEncryptData, DWORD *pdwEncryptData)
{
	// Определите блоки данных, необходимые для шифрования AES.
	AESEncryption aesEncryptor;
	// шифрование Оригинальный текстовый блок данных
	unsigned char inBlock[AES::BLOCKSIZE];
	// шифрование блока данных после зашифрованного текста
	unsigned char outBlock[AES::BLOCKSIZE];
	// Должно быть установлено все 0
	unsigned char xorBlock[AES::BLOCKSIZE];

	DWORD dwOffset = 0;
	BYTE *pEncryptData = NULL;
	DWORD dwEncryptDataSize = 0;

	// Рассчитайте необходимый размер блока данных шифрования, и нажмите 128 бит Прямо сейчас 16 байт выровнять, Недостаточно Пэд 0 Выравнивание
	// бизнес
	DWORD dwQuotient = dwOriginalDataSize / AES::BLOCKSIZE;
	// остаток
	DWORD dwRemaind = dwOriginalDataSize % AES::BLOCKSIZE;
	if (0 != dwRemaind)
	{
		dwQuotient++;
	}

	// Подать заявку на динамическую память
	dwEncryptDataSize = dwQuotient * AES::BLOCKSIZE;

	// Буфер данных после выделения шифрования
	pEncryptData = new BYTE[dwEncryptDataSize];
	if (NULL == pEncryptData)
	{
		return FALSE;
	}

	// Настройка ключа шифрования AES
	aesEncryptor.SetKey(pAESKey, dwAESKeySize);

	do
	{
		// инициализировать блок данных
		RtlZeroMemory(inBlock, AES::BLOCKSIZE);
		RtlZeroMemory(xorBlock, AES::BLOCKSIZE);
		RtlZeroMemory(outBlock, AES::BLOCKSIZE);

		// Получить блок шифрования
		if (dwOffset <= (dwOriginalDataSize - AES::BLOCKSIZE))
		{
			RtlCopyMemory(inBlock, (PVOID)(pOriginalData + dwOffset), AES::BLOCKSIZE);
		}
		else
		{
			RtlCopyMemory(inBlock, (PVOID)(pOriginalData + dwOffset),(dwOriginalDataSize - dwOffset));
		}

		// Использовать алгоритм AESруководитьшифрование
		aesEncryptor.ProcessAndXorBlock(inBlock, xorBlock, outBlock);

		// Скопируйте блок данных после шифрования в выходной буфер
		RtlCopyMemory((PVOID)(pEncryptData + dwOffset), outBlock, AES::BLOCKSIZE);

		// Обновить данные
		dwOffset = dwOffset + AES::BLOCKSIZE;
		dwQuotient--;
	} while (0 < dwQuotient);

	// Возврат данных
	*ppEncryptData = pEncryptData;
	*pdwEncryptData = dwEncryptDataSize;

	return TRUE;
}

следующееAESDecryptэто Использовать алгоритм AESруководитьРасшифроватьфункция。以下是对функцияиз主要步骤из注释:

  1. AES Расшифровать инициализацию объекта:
    • создаватьAESDecryptionобъект, используемый дляAESРасшифровать。
    • Определите блоки данных, необходимые для AESРасшифровать.:inBlock(блок входных данных)、outBlock(Блок выходных данных)、xorBlock(блок исключающего ИЛИ)。
  2. Рассчитать размер блока данных Расшифровать:
    • Рассчитайте необходимое количество блоков данных Расшифровать.,Учтите, что размер данных шифрования не может быть целым кратным размеру блока AES.
  3. Буфер данных после распределения Расшифровать:
    • Выделяет память на основе рассчитанного размера блока данных Расшифровать.
  4. Настроить ключ AES Расшифровать:
    • вызовSetKeyфункция Настроить ключ AES Расшифровать。
  5. Процесс AES Расшифровать:
    • Цикл обработки блоков данных шифрование,Обрабатывайте данные по одному размеру блока AES за раз.
    • Скопируйте блок данных шифрования в блок входных данных.。
    • Использовать алгоритм AESруководить Расшифровать。
    • Скопируйте блок данных после Расшифровать в выходной буфер.。
  6. Вернуть Расшифровать результаты:
    • Возвращает буфер данных и размер после Расшифровать.

Обратите внимание, что при фактическом использовании убедитесь, что выделенная память освобождена, чтобы предотвратить утечки памяти.

Язык кода:c
копировать
BOOL AESDecrypt(BYTE *pEncryptData, DWORD dwEncryptData, BYTE *pAESKey, DWORD dwAESKeySize, BYTE **ppDecryptData, DWORD *pdwDecryptData)
{
	// Определите блоки данных, необходимые для AESРасшифровать.
	AESDecryption aesDecryptor;				
	// Расшифровать блок данных зашифрованного текста
	unsigned char inBlock[AES::BLOCKSIZE];		
	// Расшифровать блок данных открытого текста
	unsigned char outBlock[AES::BLOCKSIZE];			
	// Должно быть установлено все 0
	unsigned char xorBlock[AES::BLOCKSIZE];						
	DWORD dwOffset = 0;
	BYTE *pDecryptData = NULL;
	DWORD dwDecryptDataSize = 0;

	// Вычислить длину зашифрованного текста, и нажмите 128 бит Прямо сейчас 16 байт выровнять, Недостаточно Пэд 0Выравнивание
	// бизнес
	DWORD dwQuotient = dwEncryptData / AES::BLOCKSIZE;
	// остаток
	DWORD dwRemaind = dwEncryptData % AES::BLOCKSIZE;		
	if (0 != dwRemaind)
	{
		dwQuotient++;
	}

	// Буфер данных после распределения Расшифровать
	dwDecryptDataSize = dwQuotient * AES::BLOCKSIZE;
	pDecryptData = new BYTE[dwDecryptDataSize];
	if (NULL == pDecryptData)
	{
		return FALSE;
	}

	// Настроить ключ AES Расшифровать
	aesDecryptor.SetKey(pAESKey, dwAESKeySize);

	do
	{
		// инициализировать блок данных
		RtlZeroMemory(inBlock, AES::BLOCKSIZE);
		RtlZeroMemory(xorBlock, AES::BLOCKSIZE);
		RtlZeroMemory(outBlock, AES::BLOCKSIZE);

		// Скопируйте блок данных шифрования в блок входных данных.
		if (dwOffset <= (dwDecryptDataSize - AES::BLOCKSIZE))
		{
			RtlCopyMemory(inBlock, (PVOID)(pEncryptData + dwOffset), AES::BLOCKSIZE);
		}
		else
		{
			RtlCopyMemory(inBlock, (PVOID)(pEncryptData + dwOffset),(dwEncryptData - dwOffset));
		}

		// Использовать алгоритм AESруководить Расшифровать
		aesDecryptor.ProcessAndXorBlock(inBlock, xorBlock, outBlock);

		// Скопируйте блок данных после Расшифровать в выходной буфер.
		RtlCopyMemory((PVOID)(pDecryptData + dwOffset), outBlock, AES::BLOCKSIZE);

		// Обновить данные
		dwOffset = dwOffset + AES::BLOCKSIZE;
		dwQuotient--;
	} while (0 < dwQuotient);

	// Возврат данных
	*ppDecryptData = pDecryptData;
	*pdwDecryptData = dwDecryptDataSize;

	return TRUE;
}

Функция AESEncrypt используется для AES-шифрования входных необработанных данных с использованием указанного ключа AES. Функция возвращает зашифрованные данные и размер данных через параметры.

Прототип функции:

Язык кода:c
копировать
BOOL AESEncrypt(
    BYTE *pOriginalData,     // [in] указатель на необработанные данные
    DWORD dwOriginalDataSize, // [in] Исходный размер данных
    BYTE *pAESKey,           // [in] Указатель на ключ шифрования AES
    DWORD dwAESKeySize,       // [in] Размер ключа шифрования AES
    BYTE **ppEncryptData,    // [out] Указатель на указатель, используемый для хранения данных после шифрования
    DWORD *pdwEncryptData    // [out] Указатель на DWORD, используемый для хранения размера данных после шифрования.
);
  • pOriginalData: Укажите на желаниешифрованиеизуказатель на необработанные данные。
  • dwOriginalDataSize: Размер исходных данных.
  • pAESKey: Указатель на ключ, используемый для шифрования AES.
  • dwAESKeySize: Размер ключа шифрования AES。
  • ppEncryptData: Указатель на указатель, используемый для хранения данных после шифрования。该指针需要在функция外释放分配из内存。
  • pdwEncryptData: Указатель на DWORD, используемый для хранения размера данных после шифрования.。

Функция возвращает значение BOOL, указывающее, была ли операция успешной. Если функция возвращает TRUE, это означает, что шифрование прошло успешно, в противном случае это означает, что шифрование не удалось.

Функция AESDecrypt используется для расшифровки входных зашифрованных данных AES. Указанный ключ AES используется для расшифровки. Функция возвращает расшифрованные данные и размер данных через параметры.

Прототип функции:

Язык кода:c
копировать
BOOL AESDecrypt(
    BYTE *pEncryptData,      // [in] Указатель на данные после шифрования
    DWORD dwEncryptDataSize, // [in] Размер данных после шифрования
    BYTE *pAESKey,           // [in] Указатель на ключ AES Расшифровать
    DWORD dwAESKeySize,       // [in] AES Расшифровать размер ключа
    BYTE **ppDecryptData,    // [out] Указатель на указатель, используемый для хранения данных после Расшифровать
    DWORD *pdwDecryptData    // [out] Указатель на DWORD, используемый для хранения размера данных после Расшифровать.
);
  • pEncryptData: Указатель на данные после шифрования быть Расшифровать.
  • dwEncryptDataSize: Размер данных после шифрования.
  • pAESKey: Указатель на ключ, используемый для Расшифровать AES.
  • dwAESKeySize: AES Расшифровать размер ключа。
  • ppDecryptData: Указатель на указатель, используемый для хранения данных после Расшифровать。该指针需要在функция外释放分配из内存。
  • pdwDecryptData: Указатель на DWORD, используемый для хранения размера данных после Расшифровать.。

Функция возвращает значение BOOL, указывающее, была ли операция успешной. Если функция возвращает TRUE, это означает, что расшифровка прошла успешно, в противном случае это означает, что расшифровка не удалась.

вызов时通过AESEncryptшифрованиеданные,AESDecryptиспользуется для Расшифроватьданные;

Язык кода:c
копировать
void ShowData(BYTE *pData, DWORD dwSize)
{
	for (int i = 0; i < dwSize; i++)
	{
		if ((0 != i) &&
			(0 == i % 16))
		{
			printf("\n");
		}
		else if ((0 != i) &&
			(0 == i % 8))
		{
			printf(" ");
		}

		printf("%02X ", pData[i]);
	}
	printf("\n");
}

int main(int argc, char* argv[])
{
	BYTE *pEncryptData = NULL;
	DWORD dwEncryptDataSize = 0;
	BYTE *pDecryptData = NULL;
	DWORD dwDecryptDataSize = 0;
	char szOriginalData[] = "It’s better to be alone than to be with someone you’re not happy to be with.";

	char szAESKey[] = "ABCDEFGHIJKIMNOP";
	BOOL  bRet = FALSE;

	// шифрование
	bRet = AESEncrypt((BYTE *)szOriginalData, (1 + ::lstrlen(szOriginalData)), (BYTE *)szAESKey, ::lstrlen(szAESKey), &pEncryptData, &dwEncryptDataSize);
	if (FALSE == bRet)
	{
		return 1;
	}

	// Расшифровать
	bRet = AESDecrypt(pEncryptData, dwEncryptDataSize, (BYTE *)szAESKey, ::lstrlen(szAESKey), &pDecryptData, &dwDecryptDataSize);
	if (FALSE == bRet)
	{
		return 2;
	}

	// показывать
	printf("исходные данные:\n");
	ShowData((BYTE *)szOriginalData, (1 + ::lstrlen(szOriginalData)));
	printf("Криптотекстовые данные:\n");
	ShowData(pEncryptData,dwEncryptDataSize);
printf("Расшифроватьпоследние данные:\n");
ShowData(pDecryptData, dwDecryptDataSize);

	// свободная память
	delete[]pEncryptData;
	pEncryptData = NULL;
	delete[]pDecryptData;
	pDecryptData = NULL;

	system("pause");
	return 0;
}

После запускаszOriginalData中изданныеруководитьшифрование,КлючszAESKey中из长度,Как показано на рисунке ниже;

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 и детали кода