Vigenere — расчет индекса совпадений

Скрипт подсчитывает индекс совпадений в зависимости от сдвига, для определения длины ключа по методу Фридмана.
В функцию передаем значения первого значения сдвига (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()

Continue reading «Vigenere — расчет индекса совпадений»