From 6f450e38e599ff661c37010cbe9438c8519fd4e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= Date: Mon, 21 Mar 2022 11:23:26 +0100 Subject: [PATCH] Final Update --- __pycache__/chiffrement_affine.cpython-38.pyc | Bin 4250 -> 4534 bytes __pycache__/crypt_and_decrypt.cpython-38.pyc | Bin 0 -> 2201 bytes __pycache__/find_key.cpython-38.pyc | Bin 0 -> 2599 bytes crypt_and_decrypt.py | 65 +++++++++++++++ find_key.py | 77 ++++++++++++++++++ jeudetest.py | 7 +- 6 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 __pycache__/crypt_and_decrypt.cpython-38.pyc create mode 100644 __pycache__/find_key.cpython-38.pyc create mode 100644 crypt_and_decrypt.py create mode 100644 find_key.py diff --git a/__pycache__/chiffrement_affine.cpython-38.pyc b/__pycache__/chiffrement_affine.cpython-38.pyc index 62dc4680508937c249b04da056a767fcfd3917df..b6a6652fcc0d3318f2b0ac85dcd4e27cc236a0d3 100644 GIT binary patch delta 364 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 None: + """ Créer le fichier si il n'existe pas + """ + try: + with open(filename, 'x') as f: + f.write('') + except FileExistsError: + return None + + +def cryptByteFile(filenameIn: str, keya: int, keyb: int, filenameOut = 'result') -> None: + """ Ecrit dans filenameOut, filenameIn crypté avec le chiffrement affine + """ + createFile(filenameOut) + fdin = open(filenameIn, "rb") + fdout = open(filenameOut, "wb") + data = fdin.read(1) + while data != b'': + fdout.write(chiffrementAffineByte(data, keya, keyb)) + data = fdin.read(1) + fdin.close() + fdout.close() + + +def chiffrementAffineByte(data: bytes, keya: int, keyb: int) -> bytes: + """ Renvoie le byte data crypté avec le chiffrement affine + """ + alphabet = [] + for i in range(256): + alphabet.append(i) + x = alphabet.index(int.from_bytes(data, "little")) + y = (keya*x+keyb)%256 + return bytes([alphabet[y]]) + +def inverse(a): + """ Renvoie l'inverse du module de a et x par 256 + """ + x = 0 + while (a*x%256 != 1): + x += 1 + return x + +def dechiffrementAffineByte(data: bytes, keya: int, keyb: int) -> bytes: + """ Renvoie le byte data décrypté avec le chiffrement affine + """ + alphabet = [] + for i in range(256): + alphabet.append(i) + x = alphabet.index(int.from_bytes(data, "little")) + y = (inverse(keya)*(x-keyb))%256 + return bytes([alphabet[y]]) + + +def decryptByteFile(filenameIn: str, keya: int, keyb: int, filenameOut = 'result') -> None: + """ Ecrit dans filenameOut, filenameIn décrypté avec le chiffrement affine + """ + createFile(filenameOut) + fdin = open(filenameIn, "rb") + fdout = open(filenameOut, "wb") + data = fdin.read(1) + while data != b'': + fdout.write(dechiffrementAffineByte(data, keya, keyb)) + data = fdin.read(1) + fdin.close() + fdout.close() \ No newline at end of file diff --git a/find_key.py b/find_key.py new file mode 100644 index 0000000..b9df4b0 --- /dev/null +++ b/find_key.py @@ -0,0 +1,77 @@ +from crypt_and_decrypt import * + +def byteFreq(filenameIn: str) -> dict: + """ byteDict est un dictionnaire tel que + * une clé est un octet + * la valeur associée est la fréquence de ce octet. + + Met à jour byteDict avec la liste de octets lbyte. + """ + lbyte = [] + byteDict = {} + fdin = open(filenameIn, "rb") + data = fdin.read(1) + while data != b'': + lbyte.append(data) + data = fdin.read(1) + for octet in lbyte: + if octet in byteDict: + freq = byteDict[octet] + 1 + else: + freq = 1 + byteDict[octet] = freq + return byteDict + + +def sortbyteFreq(byteFreq : dict) -> list: + """ Renvoie la liste de couples (octet, freq) de byteFreq. + Les couples sont triés par ordre décroissant de freq. + """ + byteList = [(octet, byteFreq[octet]) for octet in byteFreq] + k = 1 + while k < len(byteList): + i = k + while i > 0 and byteList[i - 1][1] < byteList[i][1]: + byteList[i - 1], byteList[i] = byteList[i], byteList[i - 1] + i = i - 1 + k = k + 1 + return byteList + + +def findKeywrite(data: bytes, dataout: bytes, filenameOut = 'result'): + """Ecrit dans filenameOut les couples de clé possible pour que data soit égale à dataout. + """ + createFile(filenameOut) + fdout = open(filenameOut, "w") + for keya in range(1, 256): + if keya % 2 != 0: + for keyb in range(1, 256): + i = dechiffrementAffineByte(data, keya, keyb) + if i == dataout: + fdout.write("keya: ") + fdout.write(str(keya)) + fdout.write(" ") + fdout.write("keyb: ") + fdout.write(str(keyb)) + fdout.write("\n") + +def findKeyList(data: bytes, dataout: bytes): + """Renvoie la liste des couples de clé possible pour que data soit égale à dataout. + """ + L = [] + for keya in range(1, 256): + if keya % 2 != 0: + for keyb in range(1, 256): + i = dechiffrementAffineByte(data, keya, keyb) + if i == dataout: + t = (keya, keyb) + L.append(t) + return L + +def comparKey(L: list, M: list) -> tuple: + """Compare les couples de clé valeur et renvoie le couple commun aux 2 listes M et L. + """ + for i in range(len(L)): + for y in range(len(M)): + if L[i] == M[y]: + return L[i] diff --git a/jeudetest.py b/jeudetest.py index 8d76197..a7ed512 100644 --- a/jeudetest.py +++ b/jeudetest.py @@ -1,12 +1,13 @@ -from chiffrement_affine import * +from crypt_and_decrypt import * +from find_key import * -print(sortbyteFreq(byteFreq("data"))) +#print(sortbyteFreq(byteFreq("data"))) #findKeywrite(b'\xaa', b'\x20', "keyoutspace") #findKeywrite(b'\x31', b'\x65', "keyoute") #print(findKeyList(b'\xaa', b'\x20')) -print(comparKey(findKeyList(b'\xaa', b'\x20'), findKeyList(b'\x31', b'\x65'))) +#print(comparKey(findKeyList(b'\xaa', b'\x20'), findKeyList(b'\x31', b'\x65'))) #cryptByteFile('tescrypt.txt', 1, 3, "resulttest2") #cryptByteFile('data', 1, 3, 'resultcryptdata') #cryptByteFile('monkey.jpg', 1, 3)