Vigenere — расчет индекса совпадений
| Апрель 3rd, 2011Скрипт подсчитывает индекс совпадений в зависимости от сдвига, для определения длины ключа по методу Фридмана.
В функцию передаем значения первого значения сдвига (k) и общее количество последующих сдвигов текста (seq).
Для примера в скрипт введено значение четвертой части Kryptos’a (K4), если принять во внимание что для ее шифровки использовался метод Виженера — то длина ключа, скорее всего, будет равна 7.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #!/usr/bin/env python # coding: utf-8 # dev: Dominus <dominus[at]k0derz[dot]ru> # site: http://k0derz.ru/ def shifts(text, k=1, seq=1): print '|---------------|---------------|-----------------------|' print '|\tShift\t|\tCount\t|\tPercent, % \t|' print '|---------------|---------------|-----------------------|' for items in range(seq): text_len = len(text) a_count = [0 for x in range(text_len)] delta = 0 for index in range(text_len): if index < text_len - k: index2 = index+k a_count[index] = text[index2] else: a_count[index] = text[delta] delta = delta + 1 counter = 0 for inx in range(text_len): if text[inx] == a_count[inx]: counter = counter + 1 print '|\t%d\t|\t%d\t|\t%f\t|' % (k, counter, counter*100.0/text_len) k = k + 1 print '|---------------|---------------|-----------------------|' def main(): text = 'OBKRUOXOGHULBSOLIFBBWFLRVQQPRNGKSSOTWTQSJQSSEKZZWATJKLUDIAWINFBNYPVTTMZFPKWGDKZXTJCDIGKUHUAUEKCAR' shifts(text, 1, 17) if __name__ == '__main__': main() |

