07.07.2023 Views

Implementing-cryptography-using-python

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

136 Chapter 4 ■ Cryptographic Math and Frequency Analysis

normal_freqs = {'a': 0.080642499002080981, 'c': 0.026892340312538593, 'b':

0.015373768624831691, 'e': 0.12886234260657689, 'd': 0.043286671390026357, 'g':

0.019625534749730816, 'f': 0.024484713711692099, 'i': 0.06905550211598431, 'h':

0.060987267963718068, 'k': 0.0062521823678781188, 'j': 0.0011176940633901926, 'm':

0.025009719347800208, 'l': 0.041016761327711163, 'o': 0.073783151266212627, 'n':

0.069849754102356679, 'q': 0.0010648594165322703, 'p': 0.017031440203182008, 's':

0.063817324270355996, 'r': 0.06156572691936394, 'u': 0.027856851020401599, 't':

0.090246649949305979, 'w': 0.021192261444145363, 'v': 0.010257964235274787, 'y':

0.01806326249861108, 'x': 0.0016941732664605912, 'z': 0.0009695838238376564}

lowerMessage = message.lower()

sampling = lowerMessage[keyPos::keyLength]

for ascii in range(ord('a'), ord('a')+26):

frequency[chr(ascii)] = float(sampling.count(chr(ascii)))/

len(sampling)

sum_freqs_squared = 0.0

for ltr in frequency:

sum_freqs_squared += frequency[ltr]*frequency[ltr]

for possible_key in range(1, 26):

sum_f_sqr = 0.0

for ltr in normal_freqs:

caesar_guess = shiftBy(ltr, possible_key)

freqCalc = normal_freqs[ltr]*frequency[caesar_guess]

sum_f_sqr += freqCalc

engValue = abs(sum_f_sqr - .065)

if engValue < tolerance:

allKeys.append(possible_key)

return allKeys

def getKey(encrypted, kl, dictionary):

keys = []

testKey = []

defaultKey = []

for i in range (0,kl):

keyPos = findKeyPos(encrypted,16,i)

answerLen = len(keyPos)

answerIndex = 0

if answerLen > 1:

defaultKey = keys[:]

testKey = keys[:]

defaultKey.append(keyPos[0])

decrypted = decryptIndex(defaultKey,encrypted)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!