В качестве личной задачи я пытаюсь реализовать блочный шифр SIMON на Ruby. У меня возникают некоторые проблемы с поиском наилучшего способа работы с данными. Полный код, связанный с этим вопросом, находится по адресу: https://github.com/Rami114/Personal/blob/master/Simon/Simon.rb
SIMON требует операций XOR, сдвига и циклического сдвига, последняя из которых вынуждает меня работать с BigNums, чтобы я мог выполнять циклический сдвиг влево с помощью математики, а не более сложный/медленный двойной цикл на байтовых массивах.
Есть ли лучший способ преобразовать строку в BigNum и обратно.
String -> BigNum (где N равно 64, а pt — строка открытого текста)
pt = pt.chars.each_slice(N/8).map {|x| x.join.unpack('b*')[0].to_i(2)}.to_a
Поэтому я разбиваю строку на отдельные символы, разбиваю на массивы размером N (размер слова в SIMON) и распаковываю каждый набор в BigNum. Кажется, это работает нормально, и я могу преобразовать его обратно.
Теперь мой код SIMON в настоящее время не работает, но я думаю/надеюсь, что это больше математика, а не код. Обратное преобразование (где ct — массив больших чисел, представляющих зашифрованный текст):
ct.map { |x| [x.to_s(2).rjust(128,'0')].pack('b*') }.join
Кажется, мне нужно выровнять строку по правому краю, поскольку большие числа имеют неопределенную ширину, поэтому у меня нет начальных нулей. К сожалению, пакет требует, чтобы определенный with имел разумный вывод.
Является ли это допустимым методом преобразования? Есть ли способ лучше? Я не уверен ни в том, ни в другом, и надеюсь, что кто-то здесь может помочь.
E: Для @torimus реализация кругового сдвига, которую я использую (из ссылки выше)
def self.lcs (bytes, block_size, shift)
((bytes << shift) | (bytes >> (block_size - shift))) & ((1<< block_size)-1)
end
.rjust(64,'0')
во втором списке, или заполнение дополнительными нулями (которое я получаю, запуская строку из 64 символов через обе ваши строки кода) является частью алгоритма шифрования? - person Neil Slater   schedule 22.07.2013pt.scan( /.{#{N/8}}/ ).map { |x| x.unpack('b*')[0].to_i(2) }.to_a
. Это позволяет избежать создания, а затем присоединения к временному массиву за счет использования простого регулярного выражения - я не думаю, что это большое улучшение (или обязательно улучшение), хотя я ожидаю, что это будет немного быстрее, поэтому, возможно, стоит сравнить - person Neil Slater   schedule 22.07.2013