Гайд Шифрование данных | aes-256-cfb | CryptoPP / part-1

Эксперт
Статус
Оффлайн
Регистрация
17 Янв 2020
Сообщения
2,197
Реакции[?]
718
Поинты[?]
79K
Товары в продаже
1
Начало
Гайд для новичков/пастеров! Прощу вас относиться нормально и не флудить, спасибо за понимание!​
Не много о самой либе:
Crypto++ (Cryptopp) - это библиотека криптографии, которая предоставляет различные алгоритмы шифрования, хэширования, аутентификации и другие криптографические примитивы. Она написана на языке C++ и является одной из самых популярных криптографических библиотек.​
  1. Симметричные алгоритмы:
    • AES
    • DES
    • TripleDES
    • Blowfish
    • RC2,4,5,6
    • Twofish
    • Serpent
    • Camellia
  2. Алгоритмы аутентифицированного шифрования:
    • GCM
    • CCM
    • EAX
  3. Асимметричные алгоритмы:
    • RSA
    • ElGamal
    • DSA
    • ECDSA
    • ECMQV
  4. Хэш-функции:
    • MD5
    • SHA-1, 256, 512
    • Whirlpool
    • RIPEMD-160
  5. Алгоритмы генерации ключей и случайных чисел:
    • PKCS#12,5,8
    • X.509
и
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Сегодня же поговорим о AES-256-cfb (Как по мне лучше чем cbc). Для начало вам следует скачать
Пожалуйста, авторизуйтесь для просмотра ссылки.
и подключить его к проекту. Я думаю это не составить труда(или нет?)
Создаем .h(заголовок или же header) и следуем инструкции
Начинаем с инклудов и подключением библиотек:
includes/libs:
#include <aes.h>
#include <base64.h>
#include <modes.h>

#pragma comment(lib, "cryptlib.lib")
Сам код.
aesхуес:
namespace AES { //Чтобы не высерать основной неймспейс создаем свой
    std::string Encrypt(std::string str, std::string cipher, std::string iv) { //функция которая шифрует наш стринг/string с помощью уникальных ключей cipher и iv, возвращает зашифрованный текст(std::string).
        std::string Output;
        CryptoPP::CFB_Mode<CryptoPP::AES>::Encryption Encryption((BYTE*)cipher.c_str(), cipher.length(), (BYTE*)iv.c_str());
        CryptoPP::StringSource Encryptor(str, true, new CryptoPP::StreamTransformationFilter(Encryption, new CryptoPP::Base64Encoder(new CryptoPP::StringSink(Output), false)));
        return Output;
    }

    std::string Decrypt(std::string str, std::string cipher, std::string iv) { //функция которая расшифрует зашифрованный стринг/string с помощью уникальных ключей cipher i iv, возвращает расшифрованный текст(std::string).
        std::string Output;
        CryptoPP::CFB_Mode<CryptoPP::AES>::Decryption Decryption((BYTE*)cipher.c_str(), cipher.length(), (BYTE*)iv.c_str());
        CryptoPP::StringSource Decryptor(str, true, new CryptoPP::Base64Decoder(new CryptoPP::StreamTransformationFilter(Decryption, new CryptoPP::StringSink(Output))));
        return Output;
    }
}
Используем этот код в мейне:
AES::Encrypt("iDarling", "E9VwaE4nI8YElBMcdQE8guOWRc99d0cq", "ZEkY3CvOENM1gu9xdb0t8fWQ2XPtZUgO");
Console: RWnqazMopBo=

AES::Decrypt("RWnqazMopBo=", "E9VwaE4nI8YElBMcdQE8guOWRc99d0cq", "ZEkY3CvOENM1gu9xdb0t8fWQ2XPtZUgO");
Console: iDarling

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

Магия вне хогвартса:
1687377624537.png

P.S. Таким же успехом можете шифровать байтов.

Можно получить прикольный эффект - крипт(декрипт(текст, цифер1, ив1), цифер2, ив2);

Для веба (php):
    public function encrypt($str, $cipher_key, $iv_key)
    {
        $encrypted = base64_encode(openssl_encrypt($str, 'aes-256-cfb', $cipher_key, true, $iv_key));
        return $encrypted;
    }
    public function decrypt($str, $cipher_key, $iv_key)
    {
        $decrypted = openssl_decrypt(base64_decode($str), 'aes-256-cfb', $cipher_key, true, $iv_key);

        return $decrypted;
    }
Гайд предназначен для таких людей, а не для "гении" и гении кодинга, прежде чем высерать под темой посмотрите на скрин!
1687374618280.png

Не судите строго, делаю гайд впервые:)
(И это не со всем гайд :D)
 
Последнее редактирование:
reinterpret_cat
Начинающий
Статус
Оффлайн
Регистрация
24 Янв 2019
Сообщения
53
Реакции[?]
17
Поинты[?]
5K
Тут по моему что-то напутано в названиях функций

Да и лучше не выводить так шифрованный текст (string_to_hex)

Это ещё ладно, но смысл тянуть такую тяжелую либу ради одного метода шифрования? Файл мог весить <100kb без флагов оптимизаций, а по итогу весит минимум 500kb+, хз, сомнительно
1687383279173.png
 
Главный модератор
Главный Модератор
Статус
Оффлайн
Регистрация
13 Фев 2018
Сообщения
1,091
Реакции[?]
799
Поинты[?]
143K
Поправь орфографию, пунктуацию и общую структуру предложений, пожалуйста.
Глаза вытекают из-за вот таких приколов:
Гайд предназначен для таких людей, а не для "гении" и гении кодинга, прежде чем высерать под темой посмотрите на скрин!
Можно получить прикольный эффект - крипт(декрипт(текст, цифер1, ив1), цифер2, ив2);
Каждый запрос - свой ключ шифрований.(с веба или внутри программы(лоадера) - генерация слов из рандомных цифр/букв).
И нет, это не претензия в стиле "Иди учи русский".
Ты позиционируешь свой тред как нечто для новичков. Но тут есть маленькая загвоздка. Новички твой слог не поймут, а прошаренным - его и понимать не надо, для них вся эта инфа не в новинку.

Пис.
 
I Want to Die in New Orleans
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
507
Реакции[?]
491
Поинты[?]
80K
ниче такого, выглядит гайд полезно, но сорян не могу не доебаться
1687389290761.png
вместо std::string здесь было бы более целесообразным юзать std::string_view, если ты используешь его лишь для чтения то это было бы явно лучшим решением (думаю ты и сам это знаешь), так ещё и показал бы хороший пример новичкам
 
эксперт в майнкрафт апи
Read Only
Статус
Оффлайн
Регистрация
25 Янв 2023
Сообщения
684
Реакции[?]
287
Поинты[?]
22K
Не много советов:
Создайте временных(уникальных) ключей. Каждый запрос - свой ключ шифрований.(с веба или внутри программы(лоадера) - генерация слов из рандомных цифр/букв).
Не совсем понял этот блок(мб потому что я сонный, прошу простить если что то понял неправильно), но почему ты предлагаешь их генерировать на каждое сообщение?Передавать их вместе с сообщением?Это небезопасно.Почему ты не упомянул TLS спецификацию с генерацией инициализационного вектора + обычного ключа для симметричного шифрования на основе ассиметричного в таком случае?
 
Эксперт
Статус
Оффлайн
Регистрация
17 Янв 2020
Сообщения
2,197
Реакции[?]
718
Поинты[?]
79K
Товары в продаже
1
Тут по моему что-то напутано в названиях функций

Да и лучше не выводить так шифрованный текст (string_to_hex)

Это ещё ладно, но смысл тянуть такую тяжелую либу ради одного метода шифрования? Файл мог весить <100kb без флагов оптимизаций, а по итогу весит минимум 500kb+, хз, сомнительно
Посмотреть вложение 251245
Увы доступа щас с компа нету, знакомого попросил чтоб пример сделал и скинул. На быстрые руки сделал и скинул.

ниче такого, выглядит гайд полезно, но сорян не могу не доебаться
Посмотреть вложение 251260
вместо std::string здесь было бы более целесообразным юзать std::string_view, если ты используешь его лишь для чтения то это было бы явно лучшим решением (думаю ты и сам это знаешь), так ещё и показал бы хороший пример новичкам
Да ты прав, когда за компом буду исправлю.
Поправь орфографию, пунктуацию и общую структуру предложений, пожалуйста.
Глаза вытекают из-за вот таких приколов:





И нет, это не претензия в стиле "Иди учи русский".
Ты позиционируешь свой тред как нечто для новичков. Но тут есть маленькая загвоздка. Новички твой слог не поймут, а прошаренным - его и понимать не надо, для них вся эта инфа не в новинку.

Пис.
Да есть такое, я не русский. Для меня сложно было научиться русскому. Не дружу с орфографией русского языка. Ну постараюсь.) Мне кажется и тут ошибки будут)
Не совсем понял этот блок(мб потому что я сонный, прошу простить если что то понял неправильно), но почему ты предлагаешь их генерировать на каждое сообщение?Передавать их вместе с сообщением?Это небезопасно.Почему ты не упомянул TLS спецификацию с генерацией инициализационного вектора + обычного ключа для симметричного шифрования на основе ассиметричного в таком случае?
До этого еще дойдем.
 
Разработчик
Статус
Оффлайн
Регистрация
1 Сен 2018
Сообщения
1,596
Реакции[?]
879
Поинты[?]
118K
Начало
Гайд для новичков/пастеров! Прощу вас относиться нормально и не флудить, спасибо за понимание!​
Не много о самой либе:
Crypto++ (Cryptopp) - это библиотека криптографии, которая предоставляет различные алгоритмы шифрования, хэширования, аутентификации и другие криптографические примитивы. Она написана на языке C++ и является одной из самых популярных криптографических библиотек.​
  1. Симметричные алгоритмы:
    • AES
    • DES
    • TripleDES
    • Blowfish
    • RC2,4,5,6
    • Twofish
    • Serpent
    • Camellia
  2. Алгоритмы аутентифицированного шифрования:
    • GCM
    • CCM
    • EAX
  3. Асимметричные алгоритмы:
    • RSA
    • ElGamal
    • DSA
    • ECDSA
    • ECMQV
  4. Хэш-функции:
    • MD5
    • SHA-1, 256, 512
    • Whirlpool
    • RIPEMD-160
  5. Алгоритмы генерации ключей и случайных чисел:
    • PKCS#12,5,8
    • X.509
и
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Сегодня же поговорим о AES-256-cfb (Как по мне лучше чем cbc). Для начало вам следует скачать
Пожалуйста, авторизуйтесь для просмотра ссылки.
и подключить его к проекту. Я думаю это не составить труда(или нет?)
Создаем .h(заголовок или же header) и следуем инструкции
Начинаем с инклудов и подключением библиотек:
includes/libs:
#include <aes.h>
#include <base64.h>
#include <modes.h>

#pragma comment(lib, "cryptlib.lib")
Сам код.
aesхуес:
namespace AES { //Чтобы не высерать основной неймспейс создаем свой
    std::string Encrypt(std::string str, std::string cipher, std::string iv) { //функция которая шифрует наш стринг/string с помощью уникальных ключей cipher и iv, возвращает зашифрованный текст(std::string).
        std::string Output;
        CryptoPP::CFB_Mode<CryptoPP::AES>::Encryption Encryption((BYTE*)cipher.c_str(), cipher.length(), (BYTE*)iv.c_str());
        CryptoPP::StringSource Encryptor(str, true, new CryptoPP::StreamTransformationFilter(Encryption, new CryptoPP::Base64Encoder(new CryptoPP::StringSink(Output), false)));
        return Output;
    }

    std::string Decrypt(std::string str, std::string cipher, std::string iv) { //функция которая расшифрует зашифрованный стринг/string с помощью уникальных ключей cipher i iv, возвращает расшифрованный текст(std::string).
        std::string Output;
        CryptoPP::CFB_Mode<CryptoPP::AES>::Decryption Decryption((BYTE*)cipher.c_str(), cipher.length(), (BYTE*)iv.c_str());
        CryptoPP::StringSource Decryptor(str, true, new CryptoPP::Base64Decoder(new CryptoPP::StreamTransformationFilter(Decryption, new CryptoPP::StringSink(Output))));
        return Output;
    }
}
Используем этот код в мейне:
AES::Encrypt("iDarling", "E9VwaE4nI8YElBMcdQE8guOWRc99d0cq", "ZEkY3CvOENM1gu9xdb0t8fWQ2XPtZUgO");
Console: RWnqazMopBo=

AES::Decrypt("RWnqazMopBo=", "E9VwaE4nI8YElBMcdQE8guOWRc99d0cq", "ZEkY3CvOENM1gu9xdb0t8fWQ2XPtZUgO");
Console: iDarling

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

Магия вне хогвартса:
Посмотреть вложение 251239

P.S. Таким же успехом можете шифровать байтов.

Можно получить прикольный эффект - крипт(декрипт(текст, цифер1, ив1), цифер2, ив2);

Для веба (php):
    public function encrypt($str, $cipher_key, $iv_key)
    {
        $encrypted = base64_encode(openssl_encrypt($str, 'aes-256-cfb', $cipher_key, true, $iv_key));
        return $encrypted;
    }
    public function decrypt($str, $cipher_key, $iv_key)
    {
        $decrypted = openssl_decrypt(base64_decode($str), 'aes-256-cfb', $cipher_key, true, $iv_key);

        return $decrypted;
    }
Гайд предназначен для таких людей, а не для "гении" и гении кодинга, прежде чем высерать под темой посмотрите на скрин!

Не судите строго, делаю гайд впервые:)
(И это не со всем гайд :D)
Щитпост ради щитпоста, у Crypto++ и так существует адекватная документация
 
Сверху Снизу