В реализации A5/2 Брицено и др. они задерживают цикл LSFR без запуска функции тактового цикла. Может кто-нибудь помочь мне понять?

#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 , но он работает, и это все, что мне нужно было сделать на данный момент.