This is an old revision of the document!


Laboratorul 02 - Shift and Vigenère Ciphers

Prezentarea PowerPoint pentru acest laborator poate fi găsită aici.

Pentru acest laborator, vom avea nevoie de scheletul de cod care se găsește aici: lab2_sketch.zip. Puteți lucra acest laborator folosind și platforma Google Colab, accesând acest link.

Conținutul arhivei:

  • utils.py: funcțiile de formatare din laboratorul anterior;
  • caesar.py: implementarea funcțiilor de criptare și decriptare folosind Cifrul Cezar, din laboratorul anterior;
  • msg_ex1.txt: textele care trebuie decriptate pentru exercițiul 1;
  • msg_ex2.txt: textele care trebuie decriptate pentru exercițiul 2;
  • msg_ex3.txt: textele care trebuie decriptate pentru exercițiul 3;
  • ex1.py: scheletul de cod pentru exercițiul 1;
  • ex2.py: scheletul de cod pentru exercițiul 2;
  • ex3.py: scheletul de cod pentru exercițiul 3.

Va trebui să completați cu soluțiile voastre acolo unde apare TODO, în fișierele ex1.py, ex2.py, și ex3.py.

Exercițiul 1 (2p)

Alice îi trimite lui Bob următoarele ciphertexte:

LDPWKHORUGBRXUJRG
XNTRGZKKGZUDMNNSGDQFNCRADENQDLD
DTZXMFQQSTYRFPJDTZWXJQKFSDLWFAJSNRFLJ
SIOMBUFFHINNUEYNBYHUGYIZNBYFILXSIOLAIXCHPUCH
ERZRZOREGURFNOONGUQNLGBXRRCVGUBYL
CJIJPMTJPMAVOCZMVIYTJPMHJOCZM
DTZXMFQQSTYRZWIJW
ZPVTIBMMOPUDPNNJUBEVMUFSZ
FVBZOHSSUVAZALHS
KAGETMXXZAFSUHQRMXEQFQEFUYAZKMSMUZEFKAGDZQUSTNAGD
MCIGVOZZBCHRSGWFSOBMHVWBUHVOHPSZCBUGHCMCIFBSWUVPCIF

Charlie reușește să intercepteze ciphertextele și își dă seama că cifrul folosit pentru criptare este Shift Cipher (fiecare mesaj posibil criptat cu o cheie diferită). Puteți decripta mesajele?

Charlie știe de asemenea ca plaintextul este în limba engleză și constă în litere ale alfabetului englez (A-Z), numai majusculă și fără semne de punctuație.

Hint: Ce au în comun toate textele în clar? Răspunsul este YOU.

Se pare că al cincilea string este diferit. Puteți să găsiți o modalitate de a-l decripta?

Exercițiul 2 (4p)

Alice îi trimite lui Bob un alt ciphertext, dar mai lung de această dată…

Descărcați mesajul

Charlie trebuie de asemenea să decripteze acest mesaj. Unii colegi i-au spus că este criptat folosind cifrul substituției (engl. substitution cipher), și din nou textele în clar constau doar în litere ale alfabetului englez de la A la Z (toate majusculă, fără punctuație). Încercați să-l ajutați pe Charlie să decripteze acest mesaj.

Hint: Folosiți mecanismul analizei bazate pe frecvența literelor, care a fost discutată la curs. Vedeți că frecvența fiecărei litere nu se mapează precis. Cu alte cuvinte, cele mai frecvente două litere se potrivesc cu tabelul dat la curs, dar altele sunt amestecate. Cu toate acestea, Charlie știe că cele mai frecvente bi-grame sunt următoarele (de la cel mai frecvent la cel mai puțin frecvent):

TH, HE, IN, OR, HA, ET, AN, EA, IS, OU, HI, ER, ST, RE, ND

Folosind această informație, puteți spune despre ce este vorba în textul cifrat?

Hint: Puteți folosi sort_dictionary care deja este definit în scheletul laboratorului.

Exercițiul 3 (4p)

Charlie reușește să intercepteze o ultimă comunicație care se pare a fi cea mai importantă, deci este decisiv ca el să o decripteze. Cu toate acestea, de data aceasta Alice a folosit cifrul Vigenere, cu o cheie despre care Charlie știe ca are 7 caractere.

Ciphertextul este în fișierul atașat. Încercați metoda multiplicării probabilitătilor așa cum a fost explicat la curs și vedeți dacă puteți decripta ciphertextul. Puteți găsi mai multe detalii despre această metodă aici.

Acestea sunt frecvențele cunoscute ale textului în clar:

{'A': 0.07048643054277828,
'C': 0.01577161913523459,
'B': 0.012074517019319227,
'E': 0.13185372585096597,
'D': 0.043393514259429625,
'G': 0.01952621895124195,
'F': 0.023867295308187673,
'I': 0.06153403863845446,
'H': 0.08655128794848206,
'K': 0.007566697332106716,
'J': 0.0017594296228150873,
'M': 0.029657313707451703,
'L': 0.04609015639374425,
'O': 0.07679967801287949,
'N': 0.060217341306347746,
'Q': 0.0006382244710211592,
'P': 0.014357175712971482,
'S': 0.05892939282428703,
'R': 0.05765294388224471,
'U': 0.02749540018399264,
'T': 0.09984475620975161,
'W': 0.01892824287028519,
'V': 0.011148804047838086,
'Y': 0.023045078196872126,
'X': 0.0005289788408463661,
'Z': 0.00028173873045078196}

Bonus: Exercițiul 4 (2p)

La curs am spus că One Time Pad este maleabil (i.e. putem schimba cu ușurință criptarea unui text în clar prin simpla schimbare a ciphertextului). De asemenea, am discutat cum CRC este o idee proastă de design pentru protocolul WEP, din cauza proprietății de linearitate.

Vi se dă următorul ciphertext, în hexazecimal:

021e0e061d1694c9

care corespunde concatenării mesajelor “floare” și CRC-16 asociat mesajului (în hexa este “8E31”) obținut folosind acest website: http://www.lammertbies.nl/comm/info/crc-calculation.html

Dacă trebuie să modificăm ciphertextul astfel încât o decriptare corectă să ducă la “albina” în loc de “floare”, iar calcularea CRC-16 să rămână corectă, care este modificarea pe care trebuie să o realizăm?

Afișați noul ciphertext după modificările necesare, și arătați că în mod corect duce la plaintextul “albina” și un CRC-16 calculat corect.

Poate găsiți acest început de script util:

ex4_draft.py
from utils import *
 
 
def main():
    # Plaintexts
    s1 = "floare"
    s2 = "albina"
    G = ""  # To find
 
    # Obtain crc of s1
    # See this site:
    # http://www.lammertbies.nl/comm/info/crc-calculation.html
    x1 = str_2_hex(s1)
    x2 = str_2_hex(s2)
    print("x1: " + x1)
    crc1 = "8E31"  # CRC-16 of x1
 
    # Compute delta (xor) of x1 and x2:
    xd = hexxor(x1, x2)
    print("xd: " + xd)
 
    # TODO:
 
 
if __name__ == "__main__":
    main()

Folosiți proprietatea pentru CRC-16 cum că CRC(m XOR d) = CRC(m) XOR CRC(d).

Dacă d = 'floare' XOR 'albina', iar C = [C1 | C2] = [m XOR G1 | CRC(m) XOR G2], atunci C1' = C1 XOR d.

ic/labs/02.1696765547.txt.gz · Last modified: 2023/10/08 14:45 by razvan.smadu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0