Pull to refresh
0
0

Инженер

Send message

Доступно о криптографии на эллиптических кривых

Reading time37 min
Views279K
image


Тем, кто знаком с криптографией с открытым ключом, наверно известны аббревиатуры ECC, ECDH и ECDSA. Первая — это сокращение от Elliptic Curve Cryptography (криптография на эллиптических кривых), остальные — это названия основанных на ней алгоритмов.

Сегодня криптосистемы на эллиптических кривых используются в TLS, PGP и SSH, важнейших технологиях, на которых базируются современный веб и мир ИТ. Я уже не говорю о Bitcoin и других криптовалютах.

До того, как ECC стала популярной, почти все алгоритмы с открытым ключом основывались на RSA, DSA и DH, альтернативных криптосистемах на основе модулярной арифметики. RSA и компания по-прежнему популярны, и часто используются вместе с ECC. Однако несмотря на то, что магия, лежащая в фундаменте RSA и подобных ей алгоритмов легко объяснима и понятна многим, а грубые реализации пишутся довольно просто, основы ECC всё ещё являются для большинства людей загадкой.

В этой серии статей я познакомлю вас с основами мира криптографии на эллиптических кривых. Моя цель — не создание полного и подробного руководства по ECC (в Интернете полно информации по этой теме), а простой обзор ECC и объяснение того, почему её считают безопасной. Я не буду тратить время на долгие математические доказательства или скучные подробности реализации. Также я представлю полезные примеры с визуальными интерактивными инструментами и скриптами.
Читать дальше →

Как самому за один вечер собрать минимальную ОС Linux из исходного кода

Level of difficultyMedium
Reading time11 min
Views106K
image

В современном мире нас окружает огромное количество электронных устройств различной степени сложности. Если устройство более или менее сложное, например, телевизор, маршрутизатор, смартфон, то с большой долей вероятности оно работает под управлением операционной системы Linuх, и эта мысль не даёт мне покоя.

Ещё больше не даёт покоя мне тот факт, что все ядра операционной системы Linux, которые работают на различных устройствах и серверах, собраны из исходного кода, находящегося в репозитории на сайте kernel.org.

Такие разные устройства, а операционная система, работающая на них, собрана из одного и того же исходного кода! Это утверждение, конечно, верно лишь отчасти, так как фактически ядро обычно расширено и модифицировано разработчиками конкретных дистрибутивов Linux, а также разработчиками конкретных устройств, но общего исходного кода достаточно много.

Мне всегда хотелось собрать операционную систему Linux самому из исходного кода, но процесс этот всегда казался сложным и запутанным, да и многого я не понимал. Но всё-таки в определённый момент времени я накопил достаточное количество знаний, чтобы осуществить свою мечту. В этой статье я хочу рассказать вам, как собрать минимальную Linux из исходного кода и запустить её у себя на компьютере.
Читать дальше →

Модернизируем простейший усилитель. Часть 1

Reading time10 min
Views12K
В прошлой статье мы проанализировали простейший усилитель на одном транзисторе, выяснили его недостатки и вычислили некоторые параметры. Часть недостатков простейшего усилителя может быть устранена. В данной статье я хочу рассмотреть следующую модернизированную версию, устраняющую один из существенных недостатков простейшего усилителя:
Читать дальше →

Как стать властелином отладчика: помогут ELF, DWARF и много магии

Level of difficultyMedium
Reading time12 min
Views4.5K

Привет, Хабр! Меня зовут Константин, я работаю в команде файлового доступа в YADRO. Помимо основной работы, я пишу в open source, работаю над несколькими проектами — в том числе над дебаггером BugStalker (BS) на Rust. 

В этой статье речь пойдет о разработке дебаггеров. Расскажу, какие технологии лежат в основе любого популярного отладчика и как с их помощью реализуются точки останова или функции step. Особое внимание уделим нюансам отладки Rust-кода и поддержке Rust в дебаггерах.

Если уже решили писать свой отладчик, дочитайте до конца — там будет аналитика, которая поможет не наступить на Rust-грабли.

Читать далее

Операционная система в 1 000 строк кода (часть 3)

Level of difficultyMedium
Reading time28 min
Views8.9K

Перед вами третья часть серии статей, в которой мы пишем собственную небольшую ОС. В этой части мы реализуем аллокатор памяти, механизм её адресации с использованием таблицы страниц, а также переключение контекста и некоторые другие элементы системы.

▍ Навигация по вышедшим частям


Читать дальше →

Много алгоритмов сортировки на языке C++: от простого к сложному с примерами и пояснениями

Level of difficultyMedium
Reading time8 min
Views13K

Всем привет! Подтолкнуло написать меня эту статью мой непосредственный интерес к алгоритмам и решению задач на leetcode, каждый раз, используя стандартную сортировку из STL std::sort, я знал, что ее сложность O(n*log(n)), но как она реализована внутри не доходили руки разобраться, в добавок мне стало интересно, какие есть другие виды сортировок, кроме самых простых, с которыми каждый знакомится в начале своего пути.

Я решил это исправить! И описать все виды сортировок, с которыми мне так или иначе приходилось встречать во время выполнения своих тасков или решению задач на leet.

Начнем с того, что разберемся, какие виды сортировок вообще есть и разобьем их на условные простые/продвинутые/для специальных случаев, а также разберемся, что использует std::sort у себя под капотом.

Читать далее

Анализируем простейший усилитель

Level of difficultyMedium
Reading time26 min
Views37K
В настоящей статье я хочу рассмотреть и проанализировать широко известную и подкупающую своей простотой минимальную схему усилителя на одном биполярном транзисторе:


Прекрасно осознавая, что в Интернете на данную тему имеется огромное количество статей, тем не менее рискну написать еще одну. Несмотря на кажущуюся простоту, данный усилитель так или иначе затрагивает большое количество различных вопросов и здесь есть что обсудить. Соответственно, разные авторы рассматривают данный усилитель несколько под разными углами. Надеюсь, и моя статья кому-то окажется интересной и полезной.
Читать дальше →

LaTeX для всех: от первых шагов до продвинутых трюков

Level of difficultyEasy
Reading time1 min
Views7.5K

Привет, Хабр!

Каждый, кто хоть раз сталкивался с оформлением документов или версткой научных работ, слышал про LaTeX. Это мощный инструмент, способный на многое, но с непривычки разобраться с его синтаксисом может быть, мягко говоря, сложно. Именно по этой причине я решил создать книгу LaTeX book by examples — для начинающих и продвинутых пользователей. В этой статье я коротко расскажу, что в ней особенного и почему вам стоит на неё взглянуть (и возможно даже поставить звёздочку на GitHub 😁).

Читать далее

Состояние производительности Python 3.13: Free-Threading

Level of difficultyEasy
Reading time8 min
Views8.2K

CPython 3.13 был выпущен две недели назад и стал одним из наиболее сфокусированных на производительности релизов за последнее время. Пробежавшись по release notes, я заметил несколько фич, которые могли бы повлиять на производительность.

В этой статье мы сфокусируемся на free‑threaded режиме и посмотрим, как его использовать и как он может влиять на производительность.

Читать далее

Чиним GRUB без флешки

Level of difficultyEasy
Reading time4 min
Views6.9K

Кажется, у каждого есть старенький ноутбук, который давно служит лишь для просмотра фильмов. У меня такой тоже есть — подключён по HDMI к телевизору и почти забыт. Однажды ради эксперимента я установил на него Linux, а через пару месяцев, когда понадобилось место, решил просто удалить линуксовый раздел. Затем я перезагрузил ноутбук и винда, конечно же, не загрузилась. После установки линукса, загрузчик GRUB переписал MBR, и теперь система не знала, откуда грузиться.

Что делать? Казалось бы, всё просто: берём флешку, загружаемся с Live CD, восстанавливаем MBR. Но флешки у меня не было. Можно было бы флешку одолжить, но хотелось решить проблему здесь и сейчас. Размышляя об этом, я залез в биос и обнаружил, что ноутбук поддерживает загрузку по сети через PXE…

Читать далее

Голый Линукс — запуск ядра-одиночки

Reading time11 min
Views32K

Итак, Linux - не операционная система, а только ядро для неё. Всё остальное приходит от проекта GNU (и других). И вот интересно - на что годится ядро само по себе?

Эта статья - очень "начального" уровня. Устроим маленький эксперимент - создадим чистую виртуальную машину и попробуем запустить ядро Linux "без всего". Или почти "без", т.к. нам понадобится загрузчик ОС - и какая-нибудь "пользовательская программа" (её мы сотворим сами). Конечно, продвинутые пользователи Linux такой "эксперимент" могут провести просто отредактировав параметры запуска при включении - но наш рассказ всё же для тех кто почти (или совсем) не в теме :)

Бонусом чуть-чуть коснёмся системных вызовов и пару слов скажем о других ядрах.

Загружаемся... Погружаемся...

Учимся читать QR-коды без компьютера

Level of difficultyMedium
Reading time4 min
Views54K

Задавались ли вы когда-нибудь вопросом, как работают QR-коды? Если да, то эта статья для вас. Здесь вас ждёт интерактивное объяснение*, которое мы составили для семинара, проводившегося в рамках Всемирного конгресса хакеров 37C3, но вы также можете использовать его самостоятельно.

Прочитав статью, вы узнаете:

  • Из чего состоят QR-коды.
  • Как декодировать QR-коды вручную (используя нашу шпаргалку).
Читать дальше →

Самые быстрые мьютексы

Level of difficultyEasy
Reading time8 min
Views8K

Cosmopolitan Libc хорошо известна своим «полиглотным жирным бинарным» хаком, который позволяем исполняемым файлам запускаться на шести операционных системах для AMD64/ARM64. Вас может удивить, что при этом она может быть лучше С‑библиотекой для вашего продакшена. Чтобы продемонстрировать это, давайте сравним библиотеку мьютексов Cosmo с другими платформами.

Мы напишем простой тест, который создает 30 потоков, увеличивающих одно и то же число 100 000 раз. Это поможет проверить, насколько хорошо реализация мьютексов справляется с задачей при интенсивном использовании.

Читать далее

Создание Git-коммита: The Hard Way

Reading time6 min
Views11K

Мы постоянно используем высокоуровневые команды git, такие как git add и git commit. Однако также существует другая группа команд git, которые обрабатывают низкоуровневые операции.

В этой статье мы создадим git‑коммит, используя низкоуровневые операции, а не команду git commit.

Читать далее

P2P общего назначения

Level of difficultyMedium
Reading time10 min
Views3.4K

IT-индустрия совершила интересный виток развития в последние десятилетия. На заре IT-революции, когда компьютеры были дорогими, их ресурсы, хоть и скромные по нынешним временам, нужно было использовать эффективно. Это привело к появлению многопользовательских OS, например, семейства UNIX, созданию компьютерных сетей и появлению протоколов удаленного доступа. 

Стремительное развитие производительности чипов и удешевление железа привело к революции персональных компьютеров. Однако опережающий рост вычислительных потребностей запустил развитие на новый круг. Сейчас найдется немного компаний и организаций, которые обходятся исключительно персональными компьютерами и сервисами в локальной сети. Когда-то диковинные IaaS, PaaS, SaaS, распределенные вычислительные технологии плотно вошли в жизнь. Доступ к удаленным системам — обыденная потребность не только для администраторов и программистов. Все знают о протоколах ssh, rdp, vnc, многие пользуются TeamViewer, AnyDesk, Remmina, X2Go и т. п. Ввиду того, что IPv4 сети и порожденный ими NAT пока еще более чем актуальны, не каждое из перечисленных средств позволяет подключиться к машине, находящейся за NAT, если у вас нет возможности пробросить порты.

Читать далее

Большие простые числа: преобразование Фурье

Reading time10 min
Views13K

В одной из предыдущих статей я рассказал о математических алгоритмах, позволяющих проверить простоту очень большого числа. Но в основе всех тех алгоритмов лежит одна базовая операция — перемножение двух больших чисел. Именно операции длинного умножения занимают 99,9% времени выполнения любого теста простоты. Как же умножение реализуется на практике? Говорят, что при помощи быстрого преобразования Фурье. Но беглое прочтение Википедии вызывает недоумение. Какое отношение преобразование Фурье имеет к умножению целых чисел? Давайте разбираться.

Читать далее

Основы работы с фьютексами

Reading time10 min
Views39K
Фьютекс (futex — сокращение от «Fast userspace mutex») — это механизм, предложенный разработчиками Linux из IBM в 2002 году и вошедший в ядро в конце 2003 года. Основной идеей было предоставить более эффективный способ синхронизации пользовательских потоков с минимальным количеством обращений к ядру ОС.

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

Важный момент: фьютексы — это достаточно низкоуровневый инструмент, напрямую его использовать стоит лишь при разработке фундаментальных библиотек, вроде стандартной библиотеки C/C++. Очень маловероятно, что вам понадобится использовать фьютексы в обычном прикладном приложении.
Читать дальше →

Как оптимизировать код на С для x86-процессоров: подсистема кэша и памяти, инструкции AVX-512

Level of difficultyMedium
Reading time12 min
Views13K

Меня зовут Андрей Бакшаев, я ведущий инженер-программист в YADRO. Моя команда занимается разработкой и оптимизацией математических библиотек под архитектуру x86. До этого я 15 лет работал в Intel. Значительная часть моих задач заключалась в том, чтобы реализовывать некоторые алгоритмы обработки изображений и сигналов в довольно известной математической библиотеке IPP, максимально эффективно используя возможности процессоров. Я также исследовал производительность этих алгоритмов в процессорах на ранней стадии проектирования. 

В статье я поделюсь своим опытом оптимизации низкоуровневого кода на языке C. Рассмотрим подсистему кэша и памяти процессоров и новые инструкции AVX-512. Разберем пример ускорения копирования байтового массива данных и посмотрим, как векторизованный код позволяет сократить время работы широко используемого алгоритма замены байтов по таблице с 619 до 34 мс, то есть примерно в 18 раз. 

Читать далее

Ленивая реализация обхода дерева дочерних элементов класса QObject

Reading time10 min
Views7.9K

Введение


В статье описана ленивая реализация обхода дерева на языке C++ с использованием сопрограмм и диапазонов на примере улучшения интерфейса работы с дочерними элементами класса QObject из фреймворка Qt. Подробно рассмотрено создание пользовательского представления для работы с дочерними элементами и приведены ленивая и классическая его реализации. В конце статьи есть ссылка на репозиторий с полным исходным кодом.

Читать дальше →

Внутренности Linux: как /proc/self/mem пишет в недоступную для записи память

Reading time7 min
Views9.4K

Странная причудливость псевдофайла /proc/*/mem заключается в его «пробивной» семантике. Операции записи через этот файл будут успешными даже если целевая виртуальная память помечена как недоступная для записи. Это сделано намеренно, и такое поведение активно используется проектами вроде компилятора Julia JIT или отладчика rr.

Но возникают вопросы: подчиняется ли привилегированный код разрешениям виртуальной памяти? До какой степени оборудование может влиять на доступ к памяти ядра?

Мы постараемся ответить на эти вопросы и рассмотрим нюансы взаимодействия между операционной системой и оборудованием, на котором она исполняется. Изучим ограничения процессора, которые могут влиять на ядро, и узнаем, как ядро может их обходить.
1
23 ...

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Registered
Activity

Specialization

Software Developer