Загрузка...

Делаем любой симметричный алгоритм шифрования асимметричным.

Тема в разделе Вирусология создана пользователем LazersBoy 26 окт 2019. 473 просмотра

Загрузка...
  1. LazersBoy
    LazersBoy Автор темы 26 окт 2019 Заблокирован(а) 163 10 окт 2019
    План статьи:
    1. Теория
    2. Теория
    3. Практика

    Теория:
    Начнём с терминов

    Шифрование: изменение информации с целью скрытия сути сообщения от всех кроме
    получателя. Это всякие алгоритмы подписи, хеширования, шифрования и тп...
    Симметричное шифрование: шифрование информации определённым ключем, такие алгоритмы
    принимают на вход информацию и ключ, а отдают зашифрованную информацию этим ключём.
    Ассиметричное шифрование: шифрование на основе публичного и приватного ключа,
    публичным ключём можно зашифровать информацию, приватным расшифровать. Имея публичный ключ
    расшифровать информацию 'нормальными' способа не получится.
    Алгоритм Диффи Хелльмена: алгоритм который позволяет создать 1 ключ на основе твоего приватного ключа и
    публичного ключа собеседника, если он сделает это со своим приватным ключём и моим публичным то получится тот-же
    самый ключ.
    Эллептические кривые: аналог RSA, алгоритм для подписи сообщений, с помощью
    приватного ключа можно подписать сообщения, а с помощью публичного проверить подпись.
    Это можно использовать для проверки отправителя, но мы будем использовать их для шифрования.

    Что нужно для шифрования используя эту идею:
    1) Эллептические кривые
    2) Алгоритм Диффи Хелльмена
    3) Любой симметричный алгоритм шифрования

    Пример:
    Пример использования алгоритма Диффи Хелльмена:
    Алиса и Кирито создали пару ключей:
    Публичный ключ алисы: APUBLIC
    Приватный ключ алисы: APRIVATE

    Публичный ключ Кирито: KPUBLIC
    Приватный ключ Кирито: KPRIVATE

    APUBLIC + KPRIVATE = FEDEADXXXXXXXX
    APRIVATE + KPUBLIC = FEDEADXXXXXXXX

    Этот алгоритм хотели использовать с целью защищённой передачи информации
    через интернет. Если кто-то перехватит публичные ключи, то ничего сделать с ними он не сможет.
    Но у меня возникла другая мысль. А что если хранить в коде публичный ключ и при каждом шифровании информации
    генерировать новую пару ключей, на основе сохранённого публичного ключа и сгенерированного ключа создать ключ используя
    алгоритм Диффи Хелльмена и сохранить сгенерированный публичный ключ в зашифрованной версии сообщения. С помощью
    этого способо можно использовать любой симметричный алгоритм шифрования в ассиметричном виде!

    Практика:
    Вот примерный на c++

    Код
    //функция принимает буффер, длинну буффера и публичный ключ
    byte* encrypt(byte* buffer, int buflen, byte* pubkey){
    byte* local_priv_key, local_pub_key, secret;
    //генерируем два ключа
    ECCGenKeys(local_priv_key, local_pub_key);
    //создаём сессионный ключ на основе вшитого публичного ключа и сгенерированного приватного
    ECCGenSessionKey(secret, pubkey, local_private_key);

    byte* temp_buffer = (byte*)alloc(buflen);
    byte* return_buffer = (byte*)alloc(buflen + 32);
    copy(temp_buffer, buflen, buffer);
    //шифруем буффер с использованием сгенерированного сессионного ключа
    aes_encrypt(temp_buffer, secret);
    copy(return_buffer, 32, local_pub_key);
    copy(return_buffer + 32, buflen, temp_buffer);
    memfree(temp_buffer);

    memfree(local_priv_key);
    memfree(local_pub_key);
    memfree(secret);
    return return_buffer;
    }

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

    Для расшифровки нам нужно использовать сохранённый приватный ключ и публичный ключ (первые 32 байта буффера)
    Примерно так будем выглядить код расшифровки

    Код
    //функция принимает буффер, длинну буффера и приватный ключ
    byte* decrypt(byte* buffer, *buflen, byte* prikey){
    byte* secret, byte* data = (byte*)alloc(buflen - 32), byte* pubkey = (byte*)alloc(32);//выделение памяти...

    copy(data, buffer + 32, buflen - 32);
    copy(pubkey, buffer, 32);

    //восстанавливаем сессионный ключ на основе нашего приватного и публичного что сохранён в сообщении
    ECCGenSessionKey(secret, pubkey, prikey);
    //расшифровываем сообщение полученным ключём
    aes_decrypt(data, secret);

    memfree(pubkey);
    memfree(secret);
    return data;
    }
    После выполнения этого кода мы получим расшифрованный вариант сообщения.

    Получается что можно использовать любой симметричный алгоритм шифрования
    в ассиметричном виде, хоть AES, Salsa20, GOST, да хоть XOR

    Конец.
     
  2. Jmayonezze
    Jmayonezze 26 окт 2019 Заблокирован(а) 623 3 мар 2019
    че за хуйня
     
  3. СловилТрипак
    СловилТрипак 26 окт 2019 Спайсуха опять накрыла 1225 27 май 2019
    Jmayonezze, ааааа нихуа хуа не понимать
     
  4. tiredangelz
    tiredangelz 26 окт 2019 426 31 окт 2018
    нихуя не прочитал, нихуя не понял, нихуя не интересно:2011_like:
     
  5. Kom1SsAr
    Kom1SsAr 26 окт 2019 Ищу работу 163 3 сен 2018
    Копипаст? Или сам писал?
     
  6. LazersBoy
    LazersBoy Автор темы 26 окт 2019 Заблокирован(а) 163 10 окт 2019
  7. tiredangelz
    tiredangelz 26 окт 2019 426 31 окт 2018
Top