Update scripts

This commit is contained in:
Bucchino Geoffrey 2022-07-08 16:53:22 +02:00
parent 61e8de0483
commit f95807a90f
4 changed files with 104 additions and 93 deletions

1
.gitignore vendored Normal file

@ -0,0 +1 @@
__pycache__/**

25
functions.py Normal file

@ -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

15
ic.py

@ -1,8 +1,7 @@
# coding: utf-8 # coding: utf-8
from argparse import ArgumentParser from argparse import ArgumentParser
from unidecode import unidecode from functions import readFile, countLetters
from re import sub
def checkArguments(): def checkArguments():
@ -14,18 +13,10 @@ def main():
args = checkArguments() args = checkArguments()
# Read file # Read file
dataFile = str() dataFile = readFile(args.filename)
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)
# Get number of letters # Get number of letters
totalLetters = 0 totalLetters = countLetters(dataFile)
for letter in dataFile:
totalLetters += 1
counts = [] counts = []

156
main.py

@ -3,107 +3,101 @@
from argparse import ArgumentParser from argparse import ArgumentParser
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from lorem import text as loremtext from lorem import text as loremtext
from functions import readFile
def checkArguments(): def checkArguments():
args = ArgumentParser(description='Cryptanalyst') args = ArgumentParser(description='Cryptanalyst')
args.add_argument('-f', '--filename', help='Text to analyze') args.add_argument('-f', '--filename', help='Text to analyze')
args.add_argument('-s', '--stats', help='Statistics', action='store_true') args.add_argument('-s', '--stats', help='Statistics', action='store_true')
args.add_argument('-d', '--decrypt', help='Decrypt Caesar text', action='store_true') args.add_argument('-d', '--decrypt', help='Decrypt Caesar text', action='store_true')
return args.parse_args() 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
def stats(file=None): def stats(file=None):
""" """
This function get a stats of all letter occurrence in a text This function get a stats of all letter occurrence in a text
""" """
if file is None: if file is None:
text = loremtext() dataFile = loremtext()
else: else:
text = file dataFile = file
lettersOccurence = {} #dataFile = str()
letterUpperToAscii = ord('A') # Get the ASCII code #for d in text:
for i in range (0, 26): # u = unidecode(d.lower(), 'utf-8')
lettersOccurence[chr(i + letterUpperToAscii)] = 0 # dataFile += sub(r'[^a-z]', '', u)
for line in text: lettersOccurence = []
for letter in line:
letter = letter.upper()
if letter in lettersOccurence:
lettersOccurence[letter] = lettersOccurence[letter] + 1
x = [chr(letter + 65) for letter in range(0, 26)] # Init our tab
y = [lettersOccurence[tmp] for tmp in lettersOccurence] for i in range (0, 26):
lettersOccurence.append(0)
largeur = 0.5 letterToAscii = ord('a') # Get the ASCII code
plt.bar(x, y, largeur) for letter in dataFile:
plt.show() 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): def decryptCaesarText(cipherFile):
""" """
This function breach the caesar ciphertext with all key This function breach the caesar ciphertext with all key
""" """
if cipherFile is None: if cipherFile is None:
return return
letterAToAscii = ord('A') # Get the ASCII code letterAToAscii = ord('A') # Get the ASCII code
letterZToAscii = ord('Z') # Get the ASCII code letterZToAscii = ord('Z') # Get the ASCII code
letteraToAscii = ord('a') # Get the ASCII code letteraToAscii = ord('a') # Get the ASCII code
letterzToAscii = ord('z') # Get the ASCII code letterzToAscii = ord('z') # Get the ASCII code
for key in range (0, 26): for key in range (0, 26):
foo = [] foo = []
for line in cipherFile: for line in cipherFile:
newLine = str() newLine = str()
for letter in line: for letter in line:
letter = letter.upper() letter = letter.upper()
letterAscii = ord(letter) letterAscii = ord(letter)
if letterAscii >= letterAToAscii and letterAscii <= letterZToAscii: if letterAscii >= letterAToAscii and letterAscii <= letterZToAscii:
newLetter = getNewLetter(letterAscii, letterAToAscii, key) newLetter = getNewLetter(letterAscii, letterAToAscii, key)
elif letterAscii >= letteraToAscii and letterAscii <= letterzToAscii: elif letterAscii >= letteraToAscii and letterAscii <= letterzToAscii:
newLetter = getNewLetter(letteraToAscii, key) newLetter = getNewLetter(letteraToAscii, key)
else: else:
newLetter = letter newLetter = letter
newLine = newLine + newLetter newLine = newLine + newLetter
foo.append(newLine) foo.append(newLine)
print(f"key: {key}") print(f"key: {key}")
print(foo) print(foo)
def getNewLetter(letterAscii, letterToAscii, key): def getNewLetter(letterAscii, letterToAscii, key):
""" """
This function return the new letter and we substract with the key. This function return the new letter and we substract with the key.
The function return the new letter into a char The function return the new letter into a char
""" """
letterAscii = letterAscii - letterToAscii letterAscii = letterAscii - letterToAscii
res = ((letterAscii - key) % 26) + letterToAscii res = ((letterAscii - key) % 26) + letterToAscii
return chr(res) return chr(res)
def main(): def main():
args = checkArguments() args = checkArguments()
cipherFile = None cipherFile = None
if args.filename: if args.filename:
cipherFile = readCipherText(args.filename) cipherFile = readFile(args.filename)
if args.stats: if args.stats:
stats(cipherFile) stats(cipherFile)
if args.decrypt: if args.decrypt:
decryptCaesarText(cipherFile) decryptCaesarText(cipherFile)
if __name__ == "__main__": if __name__ == "__main__":
main() main()