diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..76da001 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/** diff --git a/functions.py b/functions.py new file mode 100644 index 0000000..8484385 --- /dev/null +++ b/functions.py @@ -0,0 +1,25 @@ +# coding: utf-8 + +from re import sub +from unidecode import unidecode + + +def readFile(filename): + data = None + dataFile = str() + + with open(filename, 'r') as f: + data = f.readlines() + + for d in data: + u = unidecode(d.lower(), 'utf-8') + dataFile += sub(r'[^a-z]', '', u) + + return dataFile + +def countLetters(text): + # Get number of letters + totalLetters = 0 + for letter in text: + totalLetters += 1 + return totalLetters diff --git a/ic.py b/ic.py index d722dca..2898427 100644 --- a/ic.py +++ b/ic.py @@ -1,8 +1,7 @@ # coding: utf-8 from argparse import ArgumentParser -from unidecode import unidecode -from re import sub +from functions import readFile, countLetters def checkArguments(): @@ -14,18 +13,10 @@ def main(): args = checkArguments() # Read file - dataFile = str() - with open(args.filename, 'r') as f: - data = f.readlines() - - for d in data: - u = unidecode(d.lower(), 'utf-8') - dataFile += sub(r'[^a-z]', '', u) + dataFile = readFile(args.filename) # Get number of letters - totalLetters = 0 - for letter in dataFile: - totalLetters += 1 + totalLetters = countLetters(dataFile) counts = [] diff --git a/main.py b/main.py index 81843e5..545c9cd 100644 --- a/main.py +++ b/main.py @@ -3,107 +3,101 @@ from argparse import ArgumentParser import matplotlib.pyplot as plt from lorem import text as loremtext +from functions import readFile def checkArguments(): - args = ArgumentParser(description='Cryptanalyst') - args.add_argument('-f', '--filename', help='Text to analyze') - args.add_argument('-s', '--stats', help='Statistics', action='store_true') - args.add_argument('-d', '--decrypt', help='Decrypt Caesar text', action='store_true') - return args.parse_args() - -def readCipherText(filename): - """ - This read the file passed in argument and return the data of it - """ - file = [] - with open(filename, 'r') as f: - data = f.readlines() - - for entry in data: - file.append(entry.strip()) - - return file + args = ArgumentParser(description='Cryptanalyst') + args.add_argument('-f', '--filename', help='Text to analyze') + args.add_argument('-s', '--stats', help='Statistics', action='store_true') + args.add_argument('-d', '--decrypt', help='Decrypt Caesar text', action='store_true') + return args.parse_args() def stats(file=None): - """ - This function get a stats of all letter occurrence in a text - """ - if file is None: - text = loremtext() - else: - text = file + """ + This function get a stats of all letter occurrence in a text + """ + if file is None: + dataFile = loremtext() + else: + dataFile = file - lettersOccurence = {} - letterUpperToAscii = ord('A') # Get the ASCII code - for i in range (0, 26): - lettersOccurence[chr(i + letterUpperToAscii)] = 0 + #dataFile = str() + #for d in text: + # u = unidecode(d.lower(), 'utf-8') + # dataFile += sub(r'[^a-z]', '', u) - for line in text: - for letter in line: - letter = letter.upper() - if letter in lettersOccurence: - lettersOccurence[letter] = lettersOccurence[letter] + 1 + lettersOccurence = [] - x = [chr(letter + 65) for letter in range(0, 26)] - y = [lettersOccurence[tmp] for tmp in lettersOccurence] + # Init our tab + for i in range (0, 26): + lettersOccurence.append(0) - largeur = 0.5 - plt.bar(x, y, largeur) - plt.show() + letterToAscii = ord('a') # Get the ASCII code + for letter in dataFile: + l = ord(letter) - letterToAscii + if l >= 0 and l <= 26: + lettersOccurence[l] += 1 + + x = [chr(letter + 65) for letter in range(0, 26)] + y = [tmp for tmp in lettersOccurence] + + largeur = 0.5 + plt.bar(x, y, largeur) + plt.show() def decryptCaesarText(cipherFile): - """ - This function breach the caesar ciphertext with all key - """ - if cipherFile is None: - return + """ + This function breach the caesar ciphertext with all key + """ + if cipherFile is None: + return - letterAToAscii = ord('A') # Get the ASCII code - letterZToAscii = ord('Z') # Get the ASCII code - letteraToAscii = ord('a') # Get the ASCII code - letterzToAscii = ord('z') # Get the ASCII code - for key in range (0, 26): - foo = [] - for line in cipherFile: - newLine = str() - for letter in line: - letter = letter.upper() - letterAscii = ord(letter) - if letterAscii >= letterAToAscii and letterAscii <= letterZToAscii: - newLetter = getNewLetter(letterAscii, letterAToAscii, key) - elif letterAscii >= letteraToAscii and letterAscii <= letterzToAscii: - newLetter = getNewLetter(letteraToAscii, key) - else: - newLetter = letter + letterAToAscii = ord('A') # Get the ASCII code + letterZToAscii = ord('Z') # Get the ASCII code + letteraToAscii = ord('a') # Get the ASCII code + letterzToAscii = ord('z') # Get the ASCII code + for key in range (0, 26): + foo = [] + for line in cipherFile: + newLine = str() + for letter in line: + letter = letter.upper() + letterAscii = ord(letter) + if letterAscii >= letterAToAscii and letterAscii <= letterZToAscii: + newLetter = getNewLetter(letterAscii, letterAToAscii, key) + elif letterAscii >= letteraToAscii and letterAscii <= letterzToAscii: + newLetter = getNewLetter(letteraToAscii, key) + else: + newLetter = letter - newLine = newLine + newLetter + newLine = newLine + newLetter - foo.append(newLine) + foo.append(newLine) - print(f"key: {key}") - print(foo) + print(f"key: {key}") + print(foo) def getNewLetter(letterAscii, letterToAscii, key): - """ - This function return the new letter and we substract with the key. - The function return the new letter into a char - """ - letterAscii = letterAscii - letterToAscii - res = ((letterAscii - key) % 26) + letterToAscii - return chr(res) + """ + This function return the new letter and we substract with the key. + The function return the new letter into a char + """ + letterAscii = letterAscii - letterToAscii + res = ((letterAscii - key) % 26) + letterToAscii + return chr(res) def main(): - args = checkArguments() - cipherFile = None + args = checkArguments() + cipherFile = None - if args.filename: - cipherFile = readCipherText(args.filename) + if args.filename: + cipherFile = readFile(args.filename) - if args.stats: - stats(cipherFile) - if args.decrypt: - decryptCaesarText(cipherFile) + if args.stats: + stats(cipherFile) + if args.decrypt: + decryptCaesarText(cipherFile) if __name__ == "__main__": - main() + main()