Crypto++ (CryptoPP) — это библиотека C++ для криптографии и шифрования. Это проект с открытым исходным кодом, который предоставляет большое количество криптографических алгоритмов и функций, включая симметричное шифрование, асимметричное шифрование, хэш-функции, коды аутентификации сообщений (MAC), цифровые подписи и многое другое. Цель Crypto++ — предоставить высокопроизводительные и надежные инструменты криптографии для удовлетворения потребностей безопасности при разработке программного обеспечения.
Advanced Encryption Standard (AES) — это стандарт шифрования с симметричным ключом, используемый для защиты конфиденциальных данных на компьютерах. AES был идентифицирован Национальным институтом стандартов и технологий (NIST) в 2001 году и заменил устаревший стандарт шифрования данных (DES).
Ниже приведены основные функции и обзор алгоритма шифрования AES:
В целом, AES — это эффективный, безопасный и широко используемый алгоритм шифрования, подходящий для различных сценариев применения. Он обеспечивает хороший баланс между надежностью шифрования и производительностью, что делает его предпочтительным алгоритмом для многих приложений информационной безопасности.
AES (расширенный стандарт шифрования) широко используется в процессе шифрования и дешифрования для защиты конфиденциальных данных. Ниже приводится обзор алгоритма AES:
AES — это симметричный алгоритм шифрования, то есть для шифрования и дешифрования используется один и тот же ключ. Ключи являются ключом к защите безопасности данных, поэтому алгоритмы симметричного шифрования должны обеспечивать безопасное распространение ключей и управление ими.
AES поддерживает ключи различной длины, включая 128-битные, 192-битные и 256-битные. Более длинные ключи обычно означают большую безопасность, но также могут привести к увеличению вычислительных затрат на шифрование и дешифрование.
AES — это алгоритм блочного шифрования, который шифрует данные блоками фиксированного размера (128 бит). Процессы шифрования и дешифрования представляют собой операции над этими блоками данных.
AES широко используется для защиты конфиденциальных данных, таких как файлы, базы данных, сетевые коммуникации и т. д. Он является основой для многих протоколов и стандартов безопасности, включая TLS (уровень защищенных сокетов), IPsec (безопасность интернет-протокола) и других.
AES широко распространен и считается безопасным и надежным алгоритмом шифрования. Выбор длины ключа имеет решающее значение для безопасности, и обычно рекомендуется использовать 128-битные, 192-битные или 256-битные ключи для удовлетворения конкретных требований безопасности.
общий,AES как эффективный и безопасный алгоритм симметричного шифрования,в наше времяшифрование Общение играет важную роль в。AESИспользование требует введения заголовочных файлов.#include <aes.h>
Другие части и«C++ вычисляет значение хэша через CryptoPP»
Введение заголовочного файла в статье должно быть последовательным.。
следующееAESEncrypt
это Использовать алгоритм AESруководитьшифрованиефункция。Ниже приведены комментарии к основным шагам функции.:
AESEncryption
объект, используемый дляAESшифрование。inBlock
(блок входных данных)、outBlock
(Блок выходных данных)、xorBlock
(блок исключающего ИЛИ)。SetKey
функция Настройка ключа шифрования AES。Обратите внимание, что при фактическом использовании убедитесь, что выделенная память освобождена, чтобы предотвратить утечки памяти.
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руководитьРасшифроватьфункция。以下是对функцияиз主要步骤из注释:
AESDecryption
объект, используемый дляAESРасшифровать。inBlock
(блок входных данных)、outBlock
(Блок выходных данных)、xorBlock
(блок исключающего ИЛИ)。SetKey
функция Настроить ключ AES Расшифровать。Обратите внимание, что при фактическом использовании убедитесь, что выделенная память освобождена, чтобы предотвратить утечки памяти.
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. Функция возвращает зашифрованные данные и размер данных через параметры.
Прототип функции:
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 используется для расшифровки. Функция возвращает расшифрованные данные и размер данных через параметры.
Прототип функции:
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
используется для Расшифроватьданные;
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
中из长度,Как показано на рисунке ниже;