План статьи: 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; } Код //функция принимает буффер, длинну буффера и публичный ключ 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; } Код //функция принимает буффер, длинну буффера и приватный ключ 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 Конец.
Kom1SsAr, обижаешь --- Сообщение объединено с предыдущим 26 окт 2019 Jmayonezze, СловилТрипак, tiredangelz, вы ведь даже не прочитали