cryptanalysis/main.py
2022-06-22 21:27:56 +02:00

93 lines
2.2 KiB
Python

# coding: utf-8
from argparse import ArgumentParser
import matplotlib.pyplot as plt
from lorem import text as loremtext
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):
file = []
with open(filename, 'r') as f:
data = f.readlines()
for entry in data:
file.append(entry.strip())
return file
def main():
args = checkArguments()
cipherFile = None
if args.filename:
cipherFile = readCipherText(args.filename)
if args.stats:
stats(cipherFile)
if args.decrypt:
decryptCaesarText(cipherFile)
def stats(file=None):
if file is None:
text = loremtext()
else:
text = file
lettersOccurence = {}
letterUpperToAscii = ord('A') # Get the ASCII code
for i in range (0, 26):
lettersOccurence[chr(i + letterUpperToAscii)] = 0
for line in text:
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)]
y = [lettersOccurence[tmp] for tmp in lettersOccurence]
largeur = 0.5
plt.bar(x, y, largeur)
plt.show()
def decryptCaesarText(cipherFile):
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()
l = ord(letter)
if l >= letterAToAscii and l <= letterZToAscii:
l = l - letterAToAscii
res = ((l - key) % 26) + letterAToAscii
newLine = newLine + chr(res)
elif l >= letteraToAscii and l <= letterzToAscii:
l = l - letteraToAscii
res = ((l - key) % 26) + letteraToAscii
newLine = newLine + chr(res)
else:
newLine = newLine + letter
foo.append(newLine)
print(f"key: {key}")
print(foo)
if __name__ == "__main__":
main()