Так что я пишу некоторый код, чтобы взломать надежный шифр, я в значительной степени там, если, однако, по какой-то причине цикл является хитрым в том смысле, что когда я запускаю код без внешнего цикла для k ключа, который яполучить правильные значения для Чи в квадрате.Однако, как только я поместил цикл в значения неверные, не уверен, что я сделал неправильно, некоторые рекомендации будут туз.
Наименьшее значение должно быть, когда k = 19.
Кодздесь:
import string
alphabet = string.ascii_lowercase
exp_values = [0.0815, 0.0137, 0.0221, 0.0458, 0.1261, 0.0186, 0.0236,0.0685,
0.0697, 0.0014, 0.0107, 0.0437, 0.0196, 0.0652, 0.0758, 0.014,
0.0019, 0.0502, 0.0605, 0.0993, 0.0322, 0.0078, 0.0249, 0.0013, 0.0211,
0.0007]
def chi_square(obs,exp):
sum = 0
for i in range(0,len(obs)):
sum = sum + ( obs[i]- exp[i] )**2 / exp[i]
return sum
plain = 'blxiiftelbmklwixafhxblipaxaxyvhtpuvrahwdnemvbmofytpxhzxmmwvpmxxxpnowxkhxuaxt'
for k in range(1,25):
ctext = ''
for i in plain:
x = ((ord(i) - 65) + k) % 26
ctext = ctext + chr(x + 65)
ctext = ctext.lower()
freqs = {}
# Get the count of each letter
for i in alphabet:
count = ctext.count(i)
if count == 0:
freqs[i] = 0
else:
freqs[i] = count
# Turn the frequency into probabilities
obs_values = []
for i in alphabet:
a = freqs.get(i)/len(ctext)
obs_values.append(a)
print('Key =', k,' ', chi_square(obs_values,exp_values))