<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Математика</title>
<link>https://andgein.ru/blog/tags/math/</link>
<description>Блог Андрея Гейна: заметки о жизни, программировании, преподавании и дизайне</description>
<author></author>
<language>en</language>
<generator>Aegea 11.3 (v4134)</generator>

<itunes:subtitle>Блог Андрея Гейна: заметки о жизни, программировании, преподавании и дизайне</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Заметка девятнадцатая. О математике в музыке и докторах философии</title>
<guid isPermaLink="false">20</guid>
<link>https://andgein.ru/blog/all/19-notes-and-math/</link>
<pubDate>Wed, 03 Feb 2021 14:35:35 +0100</pubDate>
<author></author>
<comments>https://andgein.ru/blog/all/19-notes-and-math/</comments>
<description>
&lt;blockquote&gt;
&lt;p&gt;«У слова &lt;i&gt;тон&lt;/i&gt; значений больше, чем снега в горах.»&lt;br /&gt;
&lt;i&gt;Иоанн де Грокейо&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;script type="text/x-mathjax-config"&gt;
MathJax.Hub.Config({
  tex2jax: {
     inlineMath: [['$','$'], ['\\(','\\)']]
  },
  "HTML-CSS": {
     linebreaks: { automatic: true, width: "75% container" }
   }, 
  "SVG": {
     linebreaks: { automatic: true, width: "75% container" }
   } 
});
&lt;/script&gt;
&lt;script async src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_CHTML'&gt;&lt;/script&gt;
&lt;style&gt;
@media (max-width: 700px) {
  p { overflow-x: scroll; }
}
&lt;/style&gt;
&lt;p&gt;Привет! Сегодня мы поговорим про ноты. Да-да, те самые, которые до-ре-ми-фа-соль-ля-си. Почему в этом ряду их всегда семь? Почему после си снова идёт до, но &lt;i&gt;следующей октавы&lt;/i&gt;? И почему на фортепиано между этим семью белыми нотами есть ещё пять чёрных? Почему их ровно пять, и почему они так странно расположенны?&lt;/p&gt;
&lt;p&gt;Удивительно, но ответы на эти вопросы вы скорее услышите на уроках физики и математики, чем в музыкальной школе.&lt;/p&gt;
&lt;h2&gt;Немножко физики&lt;/h2&gt;
&lt;p&gt;Давайте для начала возьмём обычную акустическую гитару как один из самых наглядных музыкальных инструментов — вы дёргаете за струну, она колеблется, вместе с ней колеблется воздух, и вы слышите &lt;i&gt;ноту&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://andgein.ru/files/blog/19/guitar.gif"&gt;&lt;/p&gt;
&lt;p&gt;Высота услышанной ноты зависит от &lt;b&gt;частоты колебаний струны&lt;/b&gt;, то есть от того, сколько колебаний она успевает сделать за одну секунду. Например, ля первой октавы — это 440 Гц, то есть ровно 440 колебаний в секунду. У низких нот частота меньше, а у высоких — больше.&lt;/p&gt;
&lt;p&gt;В реальности чистого колебания с нужной частотой добиться практически невозможно. Вместо этого колебание струны представляет собой сумму сразу нескольких колебаний — всей струны, двух её половинок с частотой в два раза больше, трёх её третинок с частотой в три раза больше и так далее.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://andgein.ru/blog/pictures/1988.jpg" width="700" height="665" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Музыканты в этот момент говорят, что звук, который вы слышите, образуется как сумма основного тона (например, ноты ля с частотой 440 Гц) и &lt;i&gt;обертонов&lt;/i&gt; (от немецкого &lt;i&gt;ober&lt;/i&gt; — высокий) — колебаний с частотой 880 Гц, 1320 Гц, 1760 Гц и так далее. Наше ухо воспринимает &lt;a href="https://ru.wikipedia.org/wiki/Натуральный_звукоряд"&gt;такую склейку&lt;/a&gt; позитивно, ведь все встречающиеся в природе звуки образуются ровно таким образом.&lt;/p&gt;
&lt;p&gt;Здесь нам важно запомнить, что с точки зрения нашего уха колебания с частотами $\nu$, $2 \cdot \nu$, $3 \cdot  \nu$, $4 \cdot \nu$ и так далее хорошо сочетаются друг с другом и приятно звучат. При этом частоты соседних колебаний относятся друг к другу как 1 к 2, 2 к 3, 3 к 4 и так далее. Благодаря этому факту  появятся на свет приятные нашему слуху октавы, квинты, кварты и терции, но об этом чуть позже :-)&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://andgein.ru/blog/pictures/Selection_2021.02.02_20:52:36_01.png" width="966" height="389" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Отдельного внимания заслуживает первый обертон — тот самый, что имеет частоту в два раза больше, чем основной тон. Если взять его за основу и построить обертоны уже к нему, то этот ряд наполовину будет состоять из обертонов его старшего брата. Как следствие, итоговый звук зазвучит в нашем ухе очень похожим образом, хотя и выше.&lt;/p&gt;
&lt;p&gt;Именно поэтому две получившиеся ноты (построенные от частоты $\nu$ с её обертонами и от частоты $2 \cdot \nu$ с её обертонами) решили называть одинаково — и там ля, и тут ля. А чтобы эти ля различать, придумали, собственно, октавы. Нота, построенная на основной частоте 440 Гц — это &lt;i&gt;ля первой октавы&lt;/i&gt;, а на основной частоте 880 Гц — &lt;i&gt;ля второй октавы&lt;/i&gt;. Ля третьей октавы построено уже на 1760 Гц, дальше идёт ля четвёртой октавы и так далее. Октавы ниже первой тоже существуют — ля малой октавы строится на 220 Гц, ля большой — на 110 Гц и так далее.&lt;/p&gt;
&lt;h2&gt;Немножко математики&lt;/h2&gt;
&lt;p&gt;Окей, с октавами разобрались. Но откуда берутся остальные ноты внутри октавы? На самом деле они появляются достаточно естественным образом. Мы только что выяснили, что обертоны для ля первой октавы звучат на частотах 880 Гц, 1320 Гц и 1760 Гц. Про 880 Гц и 1760 Гц нам уже всё понятно — это ля второй и третьей октавы. А вот что такое 1320 Гц? Если частоты нот ля второй и третьей октавы относятся друг к другу как 1 к 2, то частота этой лежащей между ними ноты соотносится с ними как 2 к 3 и 3 к 4 (а $\frac{2}{3} \times \frac{3}{4}$ как раз равно $\frac{1}{2}$ —  радует, что математически мы ещё нигде не ошиблись). Эта промежуточная нота — нота ми. &lt;i&gt;На самом деле это не совсем современная нота ми, но мы об этом поговорим позже.&lt;/i&gt; Пока давайте считать, что это честная ми, образующая &lt;i&gt;квинту&lt;/i&gt; с ля второй октавы и &lt;i&gt;кварту&lt;/i&gt; с ля третьей октавы. Названия «квинта» и «кварта» на самом деле появятся позже, но уже сейчас нам нужно как-то обозначать музыкальные интервалы (промежутки между двумя нотами), вот давайте и воспользуемся правильными названиями: интервал между нотами с соотношением основных частот 2 к 3 будем называть квинтой, а с соотношением 3 к 4 — квартой.&lt;/p&gt;
&lt;p&gt;Получается, что обертоны располагаются следующим образом: первый — через октаву после базового тона, второй — через квинту после первого обертона и третий — через кварту после второго (что то же самое, что через две октавы после базового тона). Ну а дальше аналогично появляются и остальные интервалы — &lt;i&gt;большая терция&lt;/i&gt; (интервал с соотношением частот 4 к 5) и &lt;i&gt;малая терция&lt;/i&gt; (5 к 6). Чтобы можно было сыграть такие интервалы на наших инструментах, внутри октавы появляются и другие ноты.&lt;/p&gt;
&lt;p&gt;Вот только незадача — у музыкантов и математиков никак не получалось выбрать &lt;b&gt;конечное&lt;/b&gt; (и желательно небольшое, конечно) количество нот и расположить их внутри октавы так, чтобы любая пара нот давала один из приятных интервалов, описанных выше, или составлялся из нескольких таких. То там, то сям что-нибудь не клеилось.&lt;/p&gt;
&lt;p&gt;Одной из первых успешных попыток решить эту задачу считают &lt;a href="https://ru.wikipedia.org/wiki/Пифагоров_строй"&gt;Пифагоров строй&lt;/a&gt;. Пифагор расположил семь нот внутри октавы со следующими соотношениями частот между парами соседних нот:&lt;/p&gt;
&lt;p&gt;$$&lt;br /&gt;
\frac{8}{9} \hspace{4em} \frac{8}{9} \hspace{4em} \frac{243}{256} \hspace{4em} \frac{8}{9} \hspace{4em} \frac{8}{9} \hspace{4em} \frac{8}{9} \hspace{4em} \frac{243}{256}&lt;br /&gt;
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;Обратите внимание — в этой последовательности встречается только два интервала — $\frac{8}{9}$, он побольше, и $\frac{243}{256}$, он поменьше (да, чем меньше число, тем больше интервал. Целая октава — это вообще $\frac{1}{2}$, как вы помните). Причём интервал $\frac{243}{256}$ встречается то через два больших интервала, то через три. Прямо как чёрные клавиши на фортепиано ;-)&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Понятно, кстати, откуда здесь взялась дробь $\frac{8}{9}$ — это разность между двумя главными (после октавы, конечно) интервалами: квинтой и квартой.&lt;/p&gt;
&lt;p&gt;$$\frac{2}{3} : \frac{3}{4} = \frac{8}{9}$$&lt;/p&gt;
&lt;p&gt;В Пифагоровом строе не всё гладко — во-первых, эти двести-сорок-три двести-пятьдесят-шестых, которые появились как число, которого не хватало в ряду, чтобы произведение чисел во всём ряду было равно $\frac{1}{2}$. Смотрите: $\left(\frac{243}{256}\right)^2 \times \left(\frac{8}{9}\right)^5 = \frac{3^{5 \times 2}}{2^{8 \times 2}} \times \frac{2^{3 \times 5}}{3 ^ {2 \times 5}} = \frac{1}{2}$.&lt;/p&gt;
&lt;p&gt;Во-вторых, фишкой пифагоровского строя было то, что от любой ноты можно было отложить не только октаву, но и чистую квинту, ведь $\frac{8}{9} \times \frac{8}{9} \times \frac{243}{256} \times \frac{8}{9} = \frac{1}{2}$. Исключение составляла только нота си, от неё квинта не откладывалась.&lt;/p&gt;
&lt;p&gt;Пифагор попытался решить эту проблему добавлением в строй ещё пяти нот, тем самым разбив каждый из интервалов, равных $\frac{8}{9}$, на два более мелких интервала. С математической точки зрения он построил замыкание множества частот относительно операции откладывания квинты (то есть умножения и деления на $\frac{2}{3}$). Квинта от ля — это ми, квинта от ми — это си, но уже следующей октавы. Чтобы «вернуть» си в нашу октавы, просто делим частоту на два и продолжаем.&lt;/p&gt;
&lt;h2&gt;Немножко истории&lt;/h2&gt;
&lt;p&gt;Вы не поверите, но эта система просуществовала &lt;b&gt;на протяжении 12 веков&lt;/b&gt;! Дольше, чем любая другая известная музыкальная система. Вот только музыкантов постоянно бесила так называемая &lt;a href="https://ru.wikipedia.org/wiki/Волчья_квинта"&gt;волчья квинта&lt;/a&gt;. Дело в том, что если в системе Пифагора отложить квинту 12 раз, то мы должны получить исходную ноту, просто на 7 октав выше. Но на самом деле мы получим  чуууть-чуть более высокую ноту, ведь $\left(\frac{3}{2}\right)^{12} \approx 129.746$, что чуть больше, чем $2^7=128$. Накопленную разницу называли &lt;i&gt;пифагорейской коммой&lt;/i&gt;, и чтобы избавиться от неё, частоту какой-нибудь одной ноты немного подкручивали. В итоге одна из квинт внутри октавы получалась короче остальных и звучала абсолютно отвратительно, будто волки воют...&lt;/p&gt;
&lt;p&gt;В итоге музыканты тех времён просто старались не играть смещённую ноту :-). Из-за этого было сложнее менять тональности у произведений, сложнее настраивать инструменты и тяжелее импровизировать. Неудивительно, что рано или поздно кто-то должен был придумать что-то ещё.&lt;/p&gt;
&lt;p&gt;Этим кем-то стал Андреас Веркмейстер. Он сформулировал задачу так. Первое: нужно сохранить в октаве двенадцать традиционно устоявшихся звуков. Всё-таки 12 веков музыкальной истории так просто на помойку не выкинешь. Второе: никакой коммы быть не должно. И третье: все соотношения между соседними частотами должны быть абсолютно равными. Вот это было поистине революционное решение!&lt;/p&gt;
&lt;p&gt;Математически Веркмейстер взял октаву с соотношением 1 к 2 и распределил её поровну между 12 нотами. Если две соседние ноты отличаются по своей частоте в $x$ раз, то $x^{12} = 2$, а значит, $x = \sqrt[^{12}]{2}$, вот и всё.&lt;/p&gt;
&lt;p&gt;Частота ноты до-диез — это частота до, умноженная на $\sqrt[^{12}]{2}$. Частота ноты ре, следующей после до-диеза, это частота до-диеза, умноженная ещё на $\sqrt[^{12}]{2}$. И так далее! Через 12 нот получается идеальная октава.&lt;/p&gt;
&lt;p&gt;Такие образом, Веркмейстер по сути равномерно распределил Пифагорову комму между всеми звуками внутри каждой октавы. Комма рассосалась и стала незаметной. Но досталось это счастье большой ценой: внутри октавы не осталось &lt;b&gt;ни одного чистого интервала&lt;/b&gt;. Даже квинта — интервал, тысячелетиями считавшийся незыблемым — стала чуть короче, теперь она равна не $\frac{2}{3}$, а $\frac{1}{\sqrt[^{12}]{2}^7}$, то есть примерно $0,66742$.&lt;/p&gt;
&lt;p&gt;Многих музыкантов поначалу возмутило предложение Веркмейстера. Однако через 30 лет почти все смирились с компромиссом, потому что разница между чистой настройкой и той, что предложил Веркмейстер, была едва уловимой, а достоинства нового строя постепенно стали очевидными. Исчезла волчья квинта. Стало возможным переходить из тональности в тональность и из мажора в минор как угодно. В ладу (например, в до-мажоре) остались те же семь основных звуков, но теперь лад мог начинаться с любой клавиши, хоть с белой, хоть с черной. Впервые делом доказал это великий Бах, написав цикл произведений для всех двадцати четырех тональностей — двенадцати минорных и двенадцати мажорных. До реформы Веркмейстера такое количество тональностей существовало лишь теоретически, а на практике было невыполнимо, ибо пришлось бы чуть не для каждой из них заново перестраивать инструмент.&lt;/p&gt;
&lt;h2&gt;Вместо заключения&lt;/h2&gt;
&lt;p&gt;Зачем я вам всё это рассказал? Во-первых, это красиво :-)&lt;/p&gt;
&lt;p&gt;Во-вторых, я сейчас всё чаще понимаю, почему раньше существовали только доктора философии вместо современных докторов музыки или докторов математических и физических наук. Смог бы человек без понимания математики или физики придумать ноты? И, может, стоит нашим детям давать побольше кросс-предметных тем, чтобы они понимали, что ни математика, ни музыка, ни любые другие науки не существуют изолированно, друг без друга?&lt;/p&gt;
&lt;h2&gt;Бонус!&lt;/h2&gt;
&lt;p&gt;Первая струна классически настроенной гитары — это ми первой октавы. После этого поста, надеюсь, вы знаете, насколько легко сыграть на гитаре другое ми — ми второй октавы. Достаточно просто пережать первую струну посередине и дёрнуть за неё. Длина колеблющейся струны уменьшится в два раза, частота колебаний от этого увеличится в два раза, а, значит, нота перенесётся ровно на октаву вверх.&lt;/p&gt;
</description>
</item>

<item>
<title>Заметка пятая. Разбор задания Crypto Backdoor с Google CTF 2017</title>
<guid isPermaLink="false">5</guid>
<link>https://andgein.ru/blog/all/5-crypto-backdoor-writeup/</link>
<pubDate>Sat, 24 Jun 2017 13:10:53 +0100</pubDate>
<author></author>
<comments>https://andgein.ru/blog/all/5-crypto-backdoor-writeup/</comments>
<description>
&lt;p&gt;Это заметка о том, как мы с Костей Плотниковым решали задание на ассиметричную криптографию с Google CTF, который прошёл неделю назад. Она кишит кодом на питоне, несложными терминами из теории групп и математическими выкладками. Смело пропускайте, если боитесь чего-нибудь из этого.&lt;/p&gt;
&lt;script type="text/x-mathjax-config"&gt;
MathJax.Hub.Config({
  tex2jax: {
     inlineMath: [['$','$'], ['\\(','\\)']]
  },
  "HTML-CSS": {
     linebreaks: { automatic: true, width: "75% container" }
   }, 
  "SVG": {
     linebreaks: { automatic: true, width: "75% container" }
   } 
});
&lt;/script&gt;
&lt;script async src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_CHTML'&gt;&lt;/script&gt;
&lt;p&gt;Формулировка как всегда бесконечно расплывчата:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This public-key cryptosystem has a flaw. Can you exploit it? &lt;a href="/files/blog/5/crypto_backdoor.py"&gt;crypto_backdoor.py&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Костя попробовал меня ввести в курс дела, когда я присоединился к нему. Он рассказал, что в скрипте реализовано что-то вроде &lt;a href="https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%BB%D0%B8%D0%BF%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F"&gt;эллиптической криптографии&lt;/a&gt;. Работает она так: сначала на плоскости рисуется специальная &lt;a href="https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%BB%D0%B8%D0%BF%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D1%80%D0%B8%D0%B2%D0%B0%D1%8F"&gt;кривая&lt;/a&gt;, а затем для каждой пары точек на ней определяется операция сложения. Сумма двух точек с кривой тоже лежит на кривой за исключением случая, когда получается особое значение — ноль. После этого естественным образом определяется умножение точки на натуральное число.&lt;/p&gt;
&lt;p&gt;В эллиптической криптографии Боб, желающий получать зашифрованные сообщения от Алисы, выбирает секретное число $N$ и точку на эллиптической кривой $g$. Последняя называется генератором и сообщается всем желающим, а вот секретное число становится закрытым ключом Боба. Открытым ключом в этом случае называется произведение генератора и закрытого ключа; $B = Ng$.&lt;/p&gt;
&lt;p&gt;Собственно, на мысли об эллиптических кривых Костю натолкнули наличие в скрипте точки-генератора и двух открытых ключей:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Modulus
p = 606341371901192354470259703076328716992246317693812238045286463
# g is the generator point.
g = (160057538006753370699321703048317480466874572114764155861735009, 255466303302648575056527135374882065819706963269525464635673824)
# Alice&amp;#039;s public key A:
A = (460868776123995205521652669050817772789692922946697572502806062, 263320455545743566732526866838203345604600592515673506653173727)
# Bob&amp;#039;s public key B:
B = (270400597838364567126384881699673470955074338456296574231734133, 526337866156590745463188427547342121612334530789375115287956485)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Модуль $p$ здесь тоже неслучаен — в эллиптической криптографии как раз рассматриваются кривые над полем $\mathbb{Z}_p$. Позже, правда, мы пришли к выводу, что эллиптическая криптография тут совсем ни при чём... Но сначала мы внимательно изучили операцию сложения двух точек:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;def add(a, b, p):
  if a == -1:
    return b
  if b == -1:
    return a
  x1, y1 = a
  x2, y2 = b
  x3 = ((x1*x2 - x1*y2 - x2*y1 + 2*y1*y2) * modinv(x1 + x2 - y1 - y2 - 1, p)) % p
  y3 = ((y1*y2) * modinv(x1 + x2 - y1 - y2 - 1, p)) % p
  return (x3, y3)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Нейтральный элемент (он же &lt;i&gt;ноль&lt;/i&gt;) обозначен как $-1$, поэтому первые четыре строки функции очевидны. Функция $modinv(x, p)$ находит обратный элемент к $x$ в кольце $\mathbb{Z}_p$ с помощью расширенного алгоритма Евклида. Значит, сумма точек $(x_1, y_1)$ и $(x_2, y_2)$ это точка&lt;br /&gt;
$$\left(\frac{x_1x_2 – x_1y_2 – x_2y_1 + 2y_1y_2}{x_1+x_2-y_1-y_2-1}, \frac{y_1y_2}{x_1+x_2-y_1-y_2-1}\right)$$&lt;/p&gt;
&lt;p&gt;Дробь означает целочисленное деление в кольце $\mathbb{Z}_p$.&lt;/p&gt;
&lt;h2&gt;Упрощаем сложение&lt;/h2&gt;
&lt;p&gt;Математик во мне захотел разобраться с этой операцией. Больше всего смущали одинаковые знаменатели и сложный числитель первой координаты. Стало проще, когда я переписал числитель как $(x_1-y_1)(x_2-y_2)+y_1y_2$, а знаменатель как $(x_1-y_1) + (x_2-y_2)$. Давайте перейдём из системы координат $(x, y)$ в систему $(t, y)$, где $t = x-y$. Обратный переход тоже очень простой: $x = t + y$. Если переписать операцию сложения в новой системе координат, то получится&lt;/p&gt;
&lt;p&gt;$$(t_1, y_1) + (t_2, y_2) = \left(\frac{t_1t_2+y_1y_2}{t_1+t_2-1} – \frac{y_1y_2}{t_1+t_2-1}, \frac{y_1y_2}{t_1+t_2-1}\right) = \left(\frac{t_1t_2}{t_1+t_2-1}, \frac{y_1y_2}{t_1+t_2-1}\right)$$&lt;/p&gt;
&lt;p&gt;Получившаяся формула в некотором смысле даже симметрична. Это дало нам оптимизм на несколько следующих часов.&lt;/p&gt;
&lt;h2&gt;Мастер-секрет&lt;/h2&gt;
&lt;p&gt;Однако в скрипте само по себе сложение нигде не используются. Зато используется умножение точки на число:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;from secret_data import aliceSecret, bobSecret, flag

assert A == mul(aliceSecret, g, p)
assert B == mul(bobSecret, g, p)

aliceMS = mul(aliceSecret, B, p)
bobMS = mul(bobSecret, A, p)
assert aliceMS == bobMS
masterSecret = aliceMS[0]*aliceMS[1]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Настало время разобраться, что вообще происходит в скрипте и что нужно найти.&lt;/p&gt;
&lt;p&gt;$aliceSecret$ — это натуральное число, закрытый ключ Алисы, он умножается на известный нам генератор, и в результате получается известный нам открытый ключ Алисы. Аналогичное проделывается с ключами Боба. После этого открытый ключ Боба умножается на закрытый ключ Алисы, получая точку $aliceMS = aliceSecret \times bobSecret \times g$. Симметричная операция вычисляет $bobMS = bobSecret \times aliceSecret \times g$. Очевидно, что эти две точки должны совпасть, что и проверяется последним assert’ом. Мастер-секретом объявляется произведение координат этой общей точки. Этот мастер-секрет и надо найти, так как в конце скрипта он ксорится с флагом:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;def encrypt(message, key):
  return message ^ key

length = len(flag)
encrypted_message = encrypt(I(flag), masterSecret)
print &amp;quot;length = %d, encrypted_message = %d&amp;quot; % (length, encrypted_message)
# length = 31, encrypted_message = 137737300119926924583874978524079282469973134128061924568175107915062758827931077214500356470551826348226759580545095568667325&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Умножение в новых координатах&lt;/h2&gt;
&lt;p&gt;Раз для подсчёта мастер-секрета используется умножение, то вернёмся к нашим формулам и выясним, как точка в новых координатах $(t, y)$ умножается на число $k$. Переберём несколько маленьких коэффициентов:&lt;/p&gt;
&lt;p&gt;$$2(t, y) = (t, y) + (t, y) = \left(\frac{t^2}{2t-1}, \frac{y^2}{2t-1}\right)$$&lt;/p&gt;
&lt;p&gt;$$3(t, y) = 2(t, y) + (t, y) = \left(\frac{t^2}{2t-1}, \frac{y^2}{2t-1}\right) + (t, y) =&lt;br /&gt;
\left(\frac{\frac{t^3}{2t-1}}{\frac{t^2}{2t-1} + t – 1}, \frac{{\frac{y^3}{2t-1}}}{\frac{t^2}{2t-1} + t – 1}\right) =&lt;br /&gt;
\left(\frac{t^3}{3t^2-3t+1}, \frac{y^3}{3t^2-3t+1}\right)$$&lt;/p&gt;
&lt;p&gt;$$4(t, y) = 2(t, y) + 2(t, y) = \left(\frac{t^2}{2t-1}, \frac{y^2}{2t-1}\right) + \left(\frac{t^2}{2t-1}, \frac{y^2}{2t-1}\right)  =&lt;br /&gt;
\left(\frac{\frac{t^4}{(2t-1)^2}}{\frac{2t^2}{2t-1} – 1}, \frac{\frac{y^4}{(2t-1)^2}}{\frac{2t^2}{2t-1} – 1}\right) =&lt;br /&gt;
\left(\frac{\frac{t^4}{2t-1}}{2t^2-2t+1}, \frac{\frac{y^4}{2t-1}}{2t^2-2t+1}\right) =&lt;br /&gt;
\left(\frac{t^4}{4t^3-6t^2+4t-1}, \frac{y^4}{4t^3-6t^2+4t-1}\right) $$&lt;/p&gt;
&lt;p&gt;Умножать дальше становилось всё сложнее, поэтому пора найти закономерность. В числителях всё время получается $t^k$ и $y^k$, а в знаменателях видны биномиальные коэффициенты. Смотрите, $4t^3-6t^2+4t-1$ похоже на $t^4 + (4t^3-6t^2+4t-1)$, что в свою очередь равно $(t + 1)^4$. Так у нас появилась гипотеза, что знаменатель равен $(t+1)^k – t^k$.&lt;/p&gt;
&lt;p&gt;Итоговую формулу&lt;/p&gt;
&lt;p&gt;$$k \times (t, y) = \left(\frac{t^k}{(t+1)^k – t^k}, \frac{y^k}{(t+1)^k – t^k}\right)$$&lt;/p&gt;
&lt;p&gt;теперь можно доказать по индукции по $k$. Делать я этого, конечно же, не буду.&lt;/p&gt;
&lt;h2&gt;Решение&lt;/h2&gt;
&lt;p&gt;Задача будет решена, если мы узнаем закрытый ключ Алисы или Боба. В случае с Бобом нам достаточно найти такое $k \in \mathbb{Z}_p$, что $kg = B$. В наших новых координатах и формулах это выглядит так:&lt;/p&gt;
&lt;p&gt;$$\left(\frac{g_t^k}{(g_t+1)^k – g_t^k}, \frac{g_y^k}{(g_t+1)^k – g_t^k}\right) = (B_t, B_y)$$&lt;/p&gt;
&lt;p&gt;где $(g_t, g_y)$ — координаты генератора $g$ в системе $(t, y)$, а $(B_t, B_y)$ — аналогичные координаты точки $B$. Взяв из этого равенства первую координату, получаем:&lt;/p&gt;
&lt;p&gt;$$ \frac{g_t^k}{(g_t+1)^k – g_t^k} = B_t$$&lt;/p&gt;
&lt;p&gt;$$g_t^k = B_t ((g_t+1)^k – g_t^k)$$&lt;/p&gt;
&lt;p&gt;$$g_t^k (1 + B_t) = B_t (g_t+1)^k$$&lt;/p&gt;
&lt;p&gt;$$\left(\frac{g_t}{g_t+1}\right)^k = \frac{B_t}{1 + B_t}$$&lt;/p&gt;
&lt;p&gt;Чтобы найти искомое $k$, достаточно вычислить логарифм в кольце $\mathbb{Z}_p$, то есть решить задачу &lt;a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BB%D0%BE%D0%B3%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"&gt;дискретного локарифмирования&lt;/a&gt;. Здесь мы с Костей приуныли, потому что поняли, что зашли в тупик. Дискретное логарифмирование — задача, которую нельзя решить за нормальное время.&lt;/p&gt;
&lt;p&gt;Только через час Костя догадался проверить данный нам модуль $p$ на простоту. Совершенно неожиданно он оказался составным:&lt;/p&gt;
&lt;p&gt;$$p = 961236149 \times 951236179 \times 941236273 \times 911236121 \times 931235651 \times 921236161 \times 901236131$$&lt;/p&gt;
&lt;p&gt;Наверняка все знают, как посчитать дискретный логарифм по непростому основанию. А мы не знаем. Так что мы взяли бумажку и стали придумывать алгоритм.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;Когда-то Асанов рассказывал байку, что студенты УПИ обычно знают способ решить задачу, а студенты матмеха не знают. Зато студенты матмеха могут придумать решение. Кажется, теперь я понял эту байку.&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Дискретный логарифм по составному основанию&lt;/h2&gt;
&lt;p&gt;Пусть мы нашли дискретный логарифм от $b$ по основанию $a$ в кольцах $\mathbb{Z}_p$ и $\mathbb{Z}_q$. То есть мы нашли такие $n$ и $m$, что&lt;/p&gt;
&lt;p&gt;$$a^n \equiv b \pmod{p}$$&lt;br /&gt;
$$a^m \equiv b \pmod{q}$$&lt;/p&gt;
&lt;p&gt;Теперь мы хотим решить задачу в кольце $\mathbb{Z}_{pq}$, то есть найти такое $k$, что $a^k \equiv b \pmod{pq}$. Порядком числа $a$ в кольце называется такое минимальное натуральное $z$, что $a^z = 1$. Пусть число $a$ имеет порядки $u$ и $v$ в кольцах $\mathbb{Z}_p$ и $\mathbb{Z}_q$ соответственно. Тогда $b \equiv a^n \equiv a^{n + u} \equiv a^{n+2u} \equiv a^{n+3u} \equiv \dots \pmod{p}$ и $b \equiv a^m \equiv a^{m + v} \equiv a^{m+2v} \equiv a^{m+3v} \equiv \dots \pmod{q}$. Если мы найдём число, которое можно выразить и как $n + ?u$, и как $m + ?v$, то оно станет ответом задачи дискретного логарифмирования по модулю $pq$.&lt;/p&gt;
&lt;p&gt;Ну а найти такое число — дело техники и расширенного алгоритма Евклида. Если $n + ?u = m + ?v$, то $?u – ?v = m – n$. Если $m-n$ не делится на $НОД(u, v)$, то решения нет, иначе расширенный алгоритм Евклида решит это &lt;a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BE%D1%84%D0%B0%D0%BD%D1%82%D0%BE%D0%B2%D0%BE_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5#.D0.9B.D0.B8.D0.BD.D0.B5.D0.B9.D0.BD.D1.8B.D0.B5_.D0.B4.D0.B8.D0.BE.D1.84.D0.B0.D0.BD.D1.82.D0.BE.D0.B2.D1.8B_.D1.83.D1.80.D0.B0.D0.B2.D0.BD.D0.B5.D0.BD.D0.B8.D1.8F"&gt;линейное диофантово уравнение&lt;/a&gt;, и всё станет хорошо.&lt;/p&gt;
&lt;p&gt;Так как данный в задании модуль $p$ мы разложили на простые множители $p_1 \times p_2 \times \dots \times p_7$, которые к тому же получились не очень большими, то мы можем решить задачу дискретного логарифмирования в каждом из $\mathbb{Z}_{p_i}$. Соединить семь чисел в один большой ответ поможет описанный только что алгоритм.&lt;/p&gt;
&lt;h2&gt;Как решить дискретный логарифм для  $p_i$&lt;/h2&gt;
&lt;p&gt;Простые делители модуля $p$ были не очень большими, но и не настолько маленькими, чтобы дискретный логарифм можно было найти простым перебором. К счастью, есть алгоритм &lt;i&gt;Baby Steps Giant Steps&lt;/i&gt;, который позволяет сделать это намного быстрее — за $O(\sqrt{n})$. Его мы и реализовали. Да, мы думали о том, что Baby Steps Giant Steps уже реализован в куче библиотек, но лично меня это только раззадоривает — так интересно ведь всё сделать самому.&lt;/p&gt;
&lt;h2&gt;Как найти порядок элемента в кольце&lt;/h2&gt;
&lt;p&gt;На часах было уже около часа ночи, а мне предстояло запрограммировать на питоне поиск порядка элемента в кольце $\mathbb{Z}_p$. Теорема Эйлера шептала, что $x^{\phi(p)} \equiv 1 \pmod{p}$, но $\phi(p)$ могло оказаться не минимальным числом с таким свойством. Значит, искомый порядок — это делитель $\phi(p)$. Но делителей слишком много, чтобы перебирать их все. Так что пришла пора узнать более быстрый способ находить порядок элемента. На помощь пришла &lt;a href="http://cacr.uwaterloo.ca/hac/about/chap4.pdf"&gt;пдфка из интернета&lt;/a&gt;, в которой есть чудесный алгоритм 4.79, я реализовал его и научился быстро находить порядок элемента в кольце, зная разложение на простые множители у $\phi(p)$.&lt;/p&gt;
&lt;h2&gt;Заключение&lt;/h2&gt;
&lt;p&gt;Применив всю магию сверху, мы нашли закрытый ключ Боба $bobSecret$. Умножив его на открытый ключ Алисы, мы нашли мастер-секрет, который и выдал нам флаг:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Master secret found: (254828745614253797280016043417264027645246572307317271091197847, 540509273347153402828726537667691800163306365090607497812000946)
Flag: CTF{Anyone-can-make-bad-crypto}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если вкратце повторить всё наше решение, то оно перестаёт казаться страшным и длинным:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;переходим в систему координат $(t, y)$,&lt;/li&gt;
&lt;li&gt;вычисляем $a = \frac{g_t}{g_t+1}$ и $b = \frac{B_t}{1 + B_t}$,&lt;/li&gt;
&lt;li&gt;решаем задачу дискретного логарифма $a^{?} = b$ в кольце $\mathbb{Z}_p$, зная разложение $p$ на простые множители,&lt;/li&gt;
&lt;li&gt;умножаем полученный ответ на открытый ключ Алисы $A$, это и есть мастер-секрет,&lt;/li&gt;
&lt;li&gt;переходим обратно в координаты $(x, y)$, перемножаем координаты мастер-секрета, расшифровываем флаг.&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>


</channel>
</rss>