Алгоритм AES — симметричный алгоритм шифрования, полное название — Advanced Encryption Standard (Расширенный стандарт шифрования). Encryption Standard)。Это блочный шифр,к128
биты для шифрования пакета,其密钥长度可к是128
биты、192
биты或256
биты,Таким образом, могут быть обеспечены различные уровни безопасности. Алгоритм использует такие методы, как замена, перестановка и путаница.,и такие механизмы, как многораундовое шифрование и расширение ключа.,Превосходный эффект шифрования,Высокая безопасность,Широко используются в различных сферах,Такие как шифрование данных, Шифрование файлов、Сетевая безопасность и т. д.
Алгоритм AES использует один и тот же ключ для шифрования и дешифрования. Этот алгоритм имеет высокую скорость шифрования и дешифрования и подходит для сценариев, в которых шифруются и расшифровываются большие объемы данных. В практических приложениях обычно используется гибридный метод шифрования, то есть алгоритм RSA используется для шифрования ключа в алгоритме симметричного шифрования, а затем алгоритм симметричного шифрования используется для шифрования данных для обеспечения конфиденциальности данных и эффективность шифрования и дешифрования.
В алгоритме AES обычно используются два режима шифрования, а именно режимы CBC и ECB, которые имеют разные преимущества и недостатки.
в практическом применении,Обычно используетсяCBC
режим шифрования,потому что это лучше, чемECB
режим безопаснее,Но эффективность шифрования ниже. также,Есть другие режимы шифрования,нравитьсяCFB、OFB、CTR
ждать,Различные режимы шифрования подходят для разных сценариев.,Выбирать нужно исходя из реальных потребностей.
OpenSSLБиблиотека предоставляетAES
Поддержка шифрования,Однако читателям по-прежнему необходимо самостоятельно инкапсулировать некоторые общие функции шифрования и дешифрования при их использовании.,Следующий фрагмент кода представляет собой краткое изложение некоторых функций, обычно используемых автором.,вaes_cbc_encrypt
функция для использованияCBCШаблон для шифрования определенной строки,aes_cbc_decrypt
затем используйтеCBCШаблон для расшифровки строки,вторая функцияAES
функция заключается в использованииOpenSSL
Функции шифрования и дешифрования библиотеки по умолчанию реализованы во вторичной упаковке.。
#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
int aes_cbc_encrypt(char* in, char* key, char* out)
{
if (!in || !key || !out)
return 0;
unsigned char iv[AES_BLOCK_SIZE];
for (int i = 0; i < AES_BLOCK_SIZE; ++i)
iv[i] = 0;
AES_KEY aes;
if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)
{
return 0;
}
int len = strlen(in);
AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_ENCRYPT);
return 1;
}
// Расшифровка режима CBC
int aes_cbc_decrypt(char* in, char* key, char* out)
{
if (!in || !key || !out)
return 0;
// Зашифрованный вектор инициализации
unsigned char iv[AES_BLOCK_SIZE];
// iv обычно устанавливается на все 0
for (int i = 0; i < AES_BLOCK_SIZE; ++i)
iv[i] = 0;
AES_KEY aes;
if (AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0)
{
return 0;
}
int len = strlen(in);
AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_DECRYPT);
return 1;
}
// Интегрируйте шифрование и дешифрование
void AES(unsigned char* InBuff, unsigned char* OutBuff, unsigned char* key, char* Type)
{
if (strcmp(Type, "encode") == 0)
{
AES_KEY AESEncryptKey;
AES_set_encrypt_key(key, 256, &AESEncryptKey);
AES_encrypt(InBuff, OutBuff, &AESEncryptKey);
}
else if (strcmp(Type, "decode") == 0)
{
AES_KEY AESDecryptKey;
AES_set_decrypt_key(key, 256, &AESDecryptKey);
AES_decrypt(InBuff, OutBuff, &AESDecryptKey);
}
}
С помощью приведенного выше алгоритма инкапсуляции,Далее автор продемонстрирует, как применяются эти различные функции шифрования.,Сначала краткое введениеaes_cbc_encrypt
иaes_cbc_decrypt
Эти две функции инкапсулированы сами по себе.AESАлгоритм шифрования и дешифрования,Передача параметров этих двух алгоритмов остается последовательной.,Первый параметр указывает буфер, который необходимо зашифровать.,Второй параметр указывает ключ, используемый для шифрования.,Третий параметр — это обработанный результат.
int main(int argc, char* argv[])
{
char szBuffer[1024] = "hello lyshark";
char szDst[1024] = { 0 };
char szSrc[1024] = { 0 };
// Вычислить строку ключей
char key[AES_BLOCK_SIZE] = { 0 };
for (int x = 0; x < AES_BLOCK_SIZE; x++)
{
key[x] = 32 + x;
}
// AES-шифрование
if (aes_cbc_encrypt(szBuffer, key, szDst) != 0)
{
std::cout << «Длина после шифрования: " << strlen(szDst) << std::endl;
}
// AES-расшифровка
if (aes_cbc_decrypt(szDst, key, szSrc) != 0)
{
std::cout << «Расшифрованный контент: " << szSrc << std::endl;
}
system("pause");
return 0;
}
Приведенный выше фрагмент кода реализует функцию шифрования и дешифрования данных через AES. Ниже приведен выходной эффект этого кода.
Второй метод вызова — использоватьAPI
выполнить,в的AES
функция,проходитьAES_set_encrypt_key
Установить ключ шифрования,и позвони напрямуюAES_encrypt
выполнить数据加密,Напротив,проходитьAES_set_decrypt_key
Установить ключ дешифрования,и позвониAES_decrypt
Расшифровать,Метод вызова этого кода следующий:
int main(int argc, char* argv[])
{
unsigned char Buffer[1024] = "hello lyshark";
unsigned char EncodeBuf[1024] = { 0 };
unsigned char DecodeBuf[1024] = { 0 };
unsigned char aes_key[32] = { 0 };
// Случайно сгенерировать ключ
for (int x = 0; x < 32; x++)
{
int ch = rand() % 5;
aes_key[x] = (char)ch;
}
AES(Buffer, EncodeBuf, (unsigned char *)aes_key, (char*)"encode");
std::cout << «Длина зашифрованных данных: " << strlen((char *)EncodeBuf) << std::endl;
AES(EncodeBuf, DecodeBuf, (unsigned char*)aes_key, (char*)"decode");
std::cout << «Расшифровать данные: " << DecodeBuf << std::endl;
system("pause");
return 0;
}
Как указано выше, код,проходить调用AES
функция时,входящийencode
выполнить数据加密,входящийdecode
выполнить数据Расшифровать,Как показано на рисунке ниже;