#c #encryption #cryptography #gsm
#c #шифрование #криптография #gsm
Вопрос:
Вот фрагмент кода, взятый из оригинальной «Педагогической реализации алгоритмов шифрования конфиденциальности голоса GSM A5/1 и A5/2 «Марка Брицено, Яна Голдберга и Дэвида Вагнера:
typedef unsigned char byte; typedef unsigned long word; typedef word bit; ... word R1, R2, R3; #ifdef A5_2 word R4; #endif /* A5_2 */ ... /* Generate an output bit from the current state. * You grab a bit from each register via the output generation taps; * then you XOR the resulting three bits. For A5/2, in addition to * the top bit of each of R1,R2,R3, also XOR in a majority function * of three particular bits of the register (one of them complemented) * to make it non-linear. Also, for A5/2, delay the output by one * clock cycle for some reason. */ bit getbit() { bit topbits = (((R1 gt;gt; 18) ^ (R2 gt;gt; 21) ^ (R3 gt;gt; 22)) amp; 0x01); #ifndef A5_2 return topbits; #else /* A5_2 */ static bit delaybit = 0; bit nowbit = delaybit; delaybit = ( topbits ^ majority(R1amp;0x8000, (~R1)amp;0x4000, R1amp;0x1000) ^ majority((~R2)amp;0x10000, R2amp;0x2000, R2amp;0x200) ^ majority(R3amp;0x40000, R3amp;0x10000, (~R3)amp;0x2000) ); return nowbit; #endif /* A5_2 */ }
Я уже несколько дней изучаю эту реализацию и понимаю, что происходит с точки зрения того, куда поступают данные и откуда они берутся (и какой цели они служат в алгоритме).
Единственное, чего я не понимаю, так это /*Also, for A5/2, delay the output by one clock cycle for some reason. */
.
Я не понимаю, как
static bit delaybit = 0; bit nowbit = delaybit; delaybit = (...); return nowbit;
выдает «отложенный» вывод.
т.е.. как delaybit
вообще происходит задержка? Зачем мы delaybit
вообще создавали, если мы возвращаемся nowbit
в другом месте кода, понятие задержки имеет смысл, поскольку регистры ( R1
, R2
, и R3
) синхронизируются с помощью специальных функций синхронизации. Я не вижу цели nowbit
и delayedbit
как двух отдельных сущностей в этой функции.
Разве нам не нужна была бы просто одна переменная? Смешивая его с опозданием на один такт, мы бы выполняли задержку.
Есть ли проблема с моим пониманием? Или, может быть, с кодом? Это широко распространенный файл, поэтому я ожидал бы найти публичную запись о таких проблемах с кодом, если бы они были.
Ответ №1:
«Хитрость» здесь:
static bit delaybit = 0;
Статическая переменная сохраняет свое значение между вызовами. В первый раз он устанавливается равным 0, и это значение возвращается. Затем вычисляется следующее значение, которое будет возвращено при следующем вызове.
На мой взгляд, слишком мило.
Комментарии:
1. На мой взгляд, слишком мило. Также чрезвычайно не поточно-безопасный/реентерабельный.
2. Итак, как я могу использовать это в своей собственной реализации? Должен ли я просто попросить функцию сохранить значение в некоторой переменной и «вернуть» его с опозданием на один вызов (т. Е. верните значение, которое мы получили во время предыдущего расчета, и сохраните «сегодняшний» расчет, чтобы вернуть его «завтра»? Потому что, как сказал @AndrewHenle, он не выглядит особенно пуленепробиваемым. Очевидно, что здесь не требуется суперэффективная реализация, просто полезный фрагмент примера кода
3. Вот чем я в итоге занялся. Было бы более эффективно создать класс для всего алгоритма, так как я использую C , но он работает, и это все, что мне нужно было сделать на данный момент.