3808 - ADFGVX

From Bitnami MediaWiki

ADFGVX[edit | edit source]

Cifrul ADFGVX este un cifru ce folosește o matrice 6x6 care conţine literele alfabetului englez si cifre. Cifrul functioneaza asa: se citeste matricea, un mesajul si o cheie. In matrice, linia 1 si coloana 1 au codul A, linia 2 si coloana 2 au codul D, linia 3 si coloana 3 au codul F, linia 4 si coloana 4 au codul G, linia 5 si coloana 5 au codul V, iar linia 6 si coloana 6 au codul X. Fiecare litera din mesaj este inlocuita cu un codul liniei si coloanei pe care se afla in matrice. literele codurilor obtinute sunt puse intr-o matrice care are atatea coloane cate caractere are cheia(ultima linie a noii matrici poate fi incompleta). coloanele noii matrici au codul literei din cheie de pe pozitia egala cu numarul de ordine al coloanei. coloanele sunt sortate in functie de ordinea alfabetica al literei pe care o au asociata. In final se afiseaza matricea noua parcursa pe coloane (pentru a fi mai clar, literele se afiseaza fara spatii intre ele, iar cand se trece pe o noua coloana, se va pune un spatiu).

Cerința[edit | edit source]

Vi se ofera un numar c si matricea pentru criptare.Pentru c=1, vi se ofera un mesaj si o cheie si trebuie sa criptati mesajul. Pentru c=2, vi se ofera mesajul criptat si o cheie si trebuie sa decriptati mesajul.h1.

Date de intrare[edit | edit source]

Fișierul de intrare adfgvxin.txt conține pe prima linie numărul c, iar pe urmatoarele linii matricea, mesajul si cheia.

Date de ieșire[edit | edit source]

Fișierul de ieșire adfgvxout.txt va conține pe prima linie mesajul criptat sau decriptat, in functie de c.

Restricții și precizări[edit | edit source]

  • 1 ≤ lungimea mesajului necriptat ≤ 1000000
  • 1≤c≤2
  • cheia va avea numai litere distincte h1.

Exemplul 1[edit | edit source]

adfgvxin.txt
1
NA1C3H
8TB2OM
E5WRPD
4F6G7I
9J0KLQ
SUVXYZ
ATTACKAT1200AM PRIVACY
adfgvx.out
Datele introduse corespund restricțiilor impuse.
DGDD DAGD DGAF ADDF DADV DVFA ADVX

Exemplul 2[edit | edit source]

adfgvxin.txt
2
NA1C3H
8TB2OM
E5WRPD
4F6G7I
9J0KLQ
SUVXYZ
DGDD DAGD DGAF ADDF DADV DVFA ADVX PRIVACY
adfgvx.out
Datele introduse corespund restricțiilor impuse.
ATTACKAT1200AM

Explicatie[edit | edit source]

codul literelor va fi: AD,DD,DD,AD,AG,VG,AD,DD,AF,DG,VF,VF,AD,DX. Matricea noua va arata astfel:

P R I V A C Y

A D D D D D A

D A G V G A D

D D A F D G V

F V F A D D X

Dupa ce sortam coloanele, matricea va arata astfel:

A C I P R V Y

D D D A D D A

G A G D A V D

D G A D D F V

D D F F V A X

Exemplul 3[edit | edit source]

adfgvxin.txt
2
NA1C3H
8TB2OM
E5WRPD
4F6G7I
9J0KLQ
PRIVACY
DGDD DAGD DGAF ADDF DADV DVFA ADVX
adfgvx.out
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 3808 - ADFGVX

def validare(matrice_validare, mesaj_validare): # functia de validare a datelor de intrare

   if len(mesaj_validare) > 1000000:
       raise ValueError
   for linie in matrice_validare:
       if len(linie) != 6:    # fiecare linie trebuie sa aiba 6 caractere
           raise ValueError
   fisier_iesire.write("Datele introduse corespund restrictiilor impuse.\n")


def codificare(matrice_codificare, mesaj_codificare): # functia de rezolvare

   codificat = ""
   for litera in mesaj_codificare:
       for i in range(6):
           for j in range(6):
               if matrice_codificare[i][j] == litera:
                   codificat += "ADFGVX"[i] + "ADFGVX"[j]
   return codificat


if __name__ == '__main__':

   fisier_intrare = open("adfgvxin.txt", "r")         # declararea fisierelor
   fisier_iesire = open("adfgvxout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)
   try:
       cerinta = int(fisier_intrare.readline())
       matrice = [list(fisier_intrare.readline().strip()) for _ in range(6)]
       cheie = fisier_intrare.readline().strip()
       mesaj = fisier_intrare.readline().strip()
       validare(matrice, mesaj)                 # apelul functiei de validare
       if cerinta == 1:
           fisier_iesire.write(codificare(matrice, mesaj))               # apelul functiei de rezolvare
   except ValueError:
       fisier_iesire.write("Datele introduse nu corespund restrictiilor impuse.")
   except IndexError:
       fisier_iesire.write("Datele introduse nu corespund restrictiilor impuse.")

</syntaxhighlight>