20.3 Алгоритм симметричного шифрования и дешифрования OpenSSL AES
20.3 Алгоритм симметричного шифрования и дешифрования OpenSSL AES

Алгоритм AES — симметричный алгоритм шифрования, полное название — Advanced Encryption Standard (Расширенный стандарт шифрования). Encryption Standard)。Это блочный шифр,к128биты для шифрования пакета,其密钥长度可к是128биты、192биты或256биты,Таким образом, могут быть обеспечены различные уровни безопасности. Алгоритм использует такие методы, как замена, перестановка и путаница.,и такие механизмы, как многораундовое шифрование и расширение ключа.,Превосходный эффект шифрования,Высокая безопасность,Широко используются в различных сферах,Такие как шифрование данных, Шифрование файлов、Сетевая безопасность и т. д.

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

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

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

в практическом применении,Обычно используетсяCBCрежим шифрования,потому что это лучше, чемECBрежим безопаснее,Но эффективность шифрования ниже. также,Есть другие режимы шифрования,нравитьсяCFB、OFB、CTRждать,Различные режимы шифрования подходят для разных сценариев.,Выбирать нужно исходя из реальных потребностей.

OpenSSLБиблиотека предоставляетAESПоддержка шифрования,Однако читателям по-прежнему необходимо самостоятельно инкапсулировать некоторые общие функции шифрования и дешифрования при их использовании.,Следующий фрагмент кода представляет собой краткое изложение некоторых функций, обычно используемых автором.,вaes_cbc_encryptфункция для использованияCBCШаблон для шифрования определенной строки,aes_cbc_decryptзатем используйтеCBCШаблон для расшифровки строки,вторая функцияAESфункция заключается в использованииOpenSSLФункции шифрования и дешифрования библиотеки по умолчанию реализованы во вторичной упаковке.。

Язык кода:c
копировать
#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Алгоритм шифрования и дешифрования,Передача параметров этих двух алгоритмов остается последовательной.,Первый параметр указывает буфер, который необходимо зашифровать.,Второй параметр указывает ключ, используемый для шифрования.,Третий параметр — это обработанный результат.

Язык кода:c
копировать
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Расшифровать,Метод вызова этого кода следующий:

Язык кода:c
копировать
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выполнить数据Расшифровать,Как показано на рисунке ниже;

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