Cifrul Vigenère

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 10 iunie 2020; verificările necesită 18 modificări .

Cifrul Vigenère ( fr.  Chiffre de Vigenère ) este o metodă de criptare polialfabetică a textului literal folosind un cuvânt cheie. [unu]

Această metodă este o formă simplă de substituție polialfabetică. Cifrul Vigenère a fost inventat de multe ori. Această metodă a fost descrisă pentru prima dată de Giovan Battista Bellaso ( italianul  Giovan Battista Bellaso ) în cartea La cifra del. Sig. Giovan Battista Bellas® în 1553 [2] , dar în secolul al XIX-lea a primit numele de Blaise Vigenère [3] , un diplomat francez. Metoda este simplu de înțeles și implementat, dar este inaccesibilă metodelor simple de criptoanaliza . [patru]

Deși cifrul este ușor de înțeles și implementat, timp de trei secole a rezistat tuturor încercărilor de a-l sparge; care și-a câștigat denumirea de le chiffre indéchiffrable ( fr. unsolved  cipher ). Mulți oameni au încercat să implementeze scheme de criptare care sunt în esență cifruri Vigenère. [5]

Istorie

În 1466, Leon Alberti , celebrul arhitect și filozof, a înaintat biroului papal un tratat despre cifruri. Tratatul discută diferite metode de criptare, inclusiv mascarea textului simplu într-un text auxiliar. Lucrarea se încheie cu propriul cifru, pe care l-a numit „un cifr potrivit pentru regi”. A fost un cifru polialfabetic implementat ca un disc de cifru. Concluzia este că acest cifru folosește mai multe substituții în conformitate cu cheia. Alberti a inventat ulterior codul de descifrare. Această invenție a fost cu mult înaintea timpului său, deoarece acest tip de cifru a început să fie folosit în țările europene abia 400 de ani mai târziu. [6]

În 1518, a fost făcut un nou pas în dezvoltarea criptografiei odată cu apariția în Germania a primei cărți tipărite despre criptografie. Starețul Johann Trithemius, stareț al mănăstirii din Würzburg, a scris cartea „Poligrafie”, care descrie o serie de cifruri. Unul dintre ei folosește „ tabelul Tritemius ” (acum „tabelul Vigenère”) și dezvoltă ideea de substituție polialfabetică. Sistemul de criptare este următorul: prima literă a textului sursă este criptată de prima linie, a doua de a doua și așa mai departe. După utilizarea ultimei rânduri, următoarea literă este din nou criptată pe prima linie. Nu există nicio cheie în cifrul Trithemius, secretul este metoda de criptare în sine. [patru]

Următorul pas în dezvoltarea metodei de criptare propusă de Trithemius a fost făcut de italianul Giovanni Belazo. În 1553, a fost publicată broșura sa Cifra a signorului Belazo. În acest cifr, cheia este așa-numita parolă - o frază sau un cuvânt. Parola a fost scrisă periodic peste literele de text simplu. Litera parolei, deasupra literei corespunzătoare a textului simplu, a indicat numărul rândului din tabelul Trithemius, conform căruia trebuie efectuată înlocuirea (criptarea) acestei litere. [patru]

Ulterior, ideile lui Trithemius și Belazo au fost dezvoltate de compatriotul lui Belazo, Giovanni Battista Porta . El a propus să renunțe la ordinea alfabetică a literelor din prima linie a tabelului Trithemius și să înlocuiască această ordine cu una arbitrară, care este cheia cifrului. Rândurile tabelului erau încă deplasate ciclic. În cartea sa Despre corespondența secretă (publicată în 1563 [6] ), Porta a propus un cifru bigram și a oferit, de asemenea, o descriere a unui dispozitiv mecanic de disc care implementează o înlocuire a bigramelor. [patru]

La mijlocul secolului al XVI-lea, cartea lui G. Cardano „Despre subtilități” a apărut în Italia cu adaosul „Despre diverse lucruri”. Acolo s-au reflectat noi idei de criptografie: utilizarea unei părți a textului simplu transmis ca o cheie de cifră (ideea „cheii de sine”) și o nouă metodă de criptare care a rămas în istorie ca „ Zarele Cardano ”. [patru]

Ambasadorul Franței la Roma , Blaise de Vigenère , făcând cunoștință cu lucrările lui Trithemius, Belazo, Cardano, Porta, Alberti, a devenit și el interesat de criptografie. În 1585, el a scris un Tratat despre Cifre, care prezintă elementele de bază ale criptografiei. În această lucrare, el remarcă: „Toate lucrurile din lume sunt un cifr. Toată natura este doar un cifr și o scrisoare secretă.” Această idee a fost repetată ulterior de Blaise Pascal  , unul dintre fondatorii teoriei probabilității, iar în secolul XX de Norbert Wiener  , „părintele ciberneticii”. [patru]

De fapt, Vigenère a combinat abordările lui Trithemius, Bellazeau, Port cu criptarea textelor simple, practic fără a introduce nimic original în ele. În vremea noastră, „cifrul Vigenère”, constând în continuarea periodică a cuvântului cheie pe masa lui Trithemius, a înlocuit numele predecesorilor săi. [4] David Kahn , în cartea sa The Codebreakers, dezaproba acest lucru, scriind că istoria „a ignorat un fapt important și a numit cifrul după Vigenère, în ciuda faptului că nu a făcut nimic pentru a-l crea” [7] .

Cifrul Vigenère avea reputația de a fi excepțional de rezistent la crăpare „manuală”. Faimosul scriitor și matematician Charles Lutwidge Dodgson ( Lewis Carroll ) a numit cifrul Vigenère de nescăpat în articolul său The Alphabetical Cipher .  The Alphabet Cipher , publicat într-o revistă pentru copii în 1868. În 1917, Scientific American s-a referit și la cifrul Vigenère ca fiind indestructibil. [8] Această noțiune a fost respinsă după ce Kasiski a spart complet cifrul în secolul al XIX-lea, deși se știe că cifrul a fost spart de unii criptoanalisti experimentați încă din secolul al XVI-lea. [7]

Cifrul Vigenère este suficient de simplu pentru a fi folosit pe teren, mai ales dacă se folosesc discuri de cifrat. De exemplu, „confederații” au folosit un disc de cupru pentru cifrul Vigenère în timpul războiului civil . Mesajele Confederate erau departe de a fi secrete, iar mesajele erau sparte regulat de adversarii lor. În timpul războiului, comandamentul confederat s-a bazat pe trei fraze cheie: „Manchester Bluff”, „Victoria completă” și – pe măsură ce războiul se apropia de sfârșit – „Vino răzbunare”. [7]

Gilbert Vernam a încercat să îmbunătățească cifrul spart (a fost numit cifru Vernam-Vigenère în 1918), dar, în ciuda îmbunătățirilor sale, cifrul a rămas vulnerabil la criptoanaliza . Cu toate acestea, munca lui Vernam a dus în cele din urmă la cifra Vernam , care este într-adevăr imposibil de spart. [9]

Descriere

În cifrul Caesar, fiecare literă a alfabetului este deplasată cu mai multe poziții; de exemplu, într-un cifru Caesar, cu o deplasare de +3, A ar deveni D, B ar deveni E și așa mai departe. Cifrul Vigenère constă dintr-o secvență de mai multe cifruri Caesar cu valori diferite de schimbare. Pentru criptare, se poate folosi un tabel de alfabet numit tabula recta sau pătratul (tabelul) al lui Vigenère. În ceea ce privește alfabetul latin, tabelul Vigenère este alcătuit din rânduri a câte 26 de caractere fiecare, fiecare rând următoare fiind deplasată cu mai multe poziții. Astfel, există 26 de cifruri Caesar diferite în tabel. Fiecare etapă de criptare folosește alfabete diferite, selectate în funcție de caracterul cuvântului cheie. De exemplu, să presupunem că textul sursă arată astfel:

ATAACKATAWN

Persoana care trimite mesajul scrie cuvântul cheie (" LEMON ") într-o buclă până când lungimea acestuia se potrivește cu lungimea textului original:

LEMONLEMONLE

Primul caracter al textului simplu ("A") este criptat cu secvența L, care este primul caracter al cheii. Primul caracter al textului cifrat ("L") se află la intersecția rândului L și coloanei A din tabloul Vigenère. În mod similar, pentru al doilea caracter al textului sursă, se utilizează al doilea caracter al tastei; adică al doilea caracter al textului cifrat ("X") este obținut la intersecția rândului E și coloanei T. Restul textului simplu este criptat într-un mod similar.

Text original: ATTACKATDAWN Cheie: LEMONLEMONLE Text cifrat: LXFOPVEFRNHR

Decriptarea se realizează astfel: găsim în tabelul Vigenère linia corespunzătoare primului caracter al cuvântului cheie; în acest șir găsim primul caracter al textului cifrat. Coloana în care se află acest caracter corespunde primului caracter al textului sursă. Următoarele caractere criptate sunt decriptate într-un mod similar.

Dacă  este numărul de litere din alfabet,  este numărul literei de text simplu,  este numărul literei cheie din alfabet, atunci cifrul Vigenère poate fi scris după cum urmează:

Și decriptare:

[zece]

Într-un computer, o astfel de operație corespunde adăugării codurilor ASCII ale caracterelor mesajului și cheii modulo some. Se pare că dacă tabelul este mai complex decât deplasarea ciclică a rândurilor, atunci cifrul va deveni mai fiabil. Acest lucru este adevărat dacă este schimbat mai des, de exemplu, de la cuvânt la cuvânt. Dar compilarea unor astfel de tabele, care sunt pătrate latine, în care orice literă apare o dată pe rând sau pe coloană, este laborioasă și ar trebui făcută numai pe computer. Pentru un cifru polialfabetic manual, se bazează doar pe lungimea și complexitatea cheii, folosind tabelul dat, care nu poate fi ținut secret, iar acest lucru simplifică criptarea și decriptarea. [unsprezece]

Aplicație

În secolul al XIX-lea, așa-numita metodă de criptare pad a devenit răspândită. A fost folosit de revoluționari populiști , spioni, etc. Cifrul folosește expresii preluate din limbă ca cheie de criptare. De exemplu, expresia: „14 iulie – ziua de naștere a Mariei”. Dacă folosim numerotarea literelor alfabetului englez acceptată pentru exemple, atunci Marysbirthday înseamnă . Pentru a cripta expresia Iamgoing ↔ , textul mod26 este adăugat la cheie, care este fraza înregistrată. Se dovedește

↔ UADEGJV X.

După cum puteți vedea, în acest caz, acesta este un joc obișnuit . Criptograful francez Vigenère a sugerat folosirea acestui tip de cheie chiar și în cazurile în care textul este mai lung decât cheia, impunându-l de câte ori este necesar. În acest caz, nu este deloc necesar ca cheia să fie obținută dintr-o frază cu sens. În plus, este chiar nedorit, deoarece semnificația poate ajuta la spargerea cifrului. Luați, de exemplu, textul:

UN FUM DE PATRIE MAME E DULCE PENTRU NOI SI PLACUT ↔ si cheie: .

Criptarea este obținută prin gama mod26:

Deci, cifrul Vigenère este obținut ca o combinație repetată de schimburi. În general, acest cifru nu păstrează frecvența apariției literelor și, din acest motiv, nu poate fi supus direct analizei statistice.

Criptanaliză

Cifrul Vigenère „ estompează ” caracteristicile de frecvență ale apariției caracterelor în text, dar rămân unele caracteristici ale apariției caracterelor în text. Principalul dezavantaj al cifrului Vigenère este că cheia acestuia este repetată. Prin urmare, o simplă criptoanaliza a unui cifr poate fi construită în doi pași:

  1. Căutare lungime cheie. Este posibil să se analizeze distribuția frecvențelor în textul cifrat cu decimare diferită. Adică, luați un text care include fiecare a 2-a literă a textului cifrat, apoi fiecare a 3-a etc. De îndată ce distribuția frecvenței literelor diferă foarte mult de uniformă (de exemplu, în entropie), atunci putem vorbi despre lungimea cheii găsite. .
  2. Criptanaliză. Un set de l cifruri Caesar (unde l  este lungimea cheii găsite), care individual sunt ușor de spart.

Testele Friedman și Kasiska pot ajuta la determinarea lungimii cheii.

Testul Kasiska și modul în care determină lungimea cheii

Charles Babbage a fost primul care a dezvoltat un algoritm de atac pentru cifrul Vigenère în 1854. Impulsul dezvoltării algoritmului a fost un schimb de scrisori cu John H. B. Thwaites. El a pretins că a creat un nou cifr și l-a transmis Jurnalului Societății de Arte; Când Babbage a arătat că cifrul Thwaites era doar un caz special al cifrului Vigenère, Thwaites i-a cerut să-l spargă. Babbage a descifrat textul, care s-a dovedit a fi poemul „Viziunea păcatului” de Alfred Tennyson , criptat cu cuvântul cheie Emily - numele soției poetului. Dar nu și-a publicat descoperirea. Prin urmare, acest algoritm este numit după Friedrich Wilhelm Kasiska , un ofițer al armatei prusac care, independent de Babbage, a dezvoltat același algoritm în 1863. Și abia în secolul al XX-lea, când oamenii de știință au studiat notițele lui Babbage, au apărut informații despre primul inventator al acestui algoritm. [12]

În primul rând, definim noțiunea de indice de coincidență a unui text dat. Textul să fie considerat corespunzător alfabetului format din litere. Să fie  lungimea acestui text. Notați prin numărul de apariții ale literei cu numărul din text . Apoi indexul de potrivire a textului este definit ca

.

S-a verificat empiric că indicele de potrivire al textelor engleze lungi și semnificative, cum ar fi Moby Dick al lui Mellville , este de aproximativ 0,065. În acest caz, desigur, în text au rămas doar 26 de litere ale alfabetului englez. În același timp, un text absolut aleatoriu, destul de lung, de 26 de litere, în care toate literele apar aproximativ de același număr de ori, este egal cu 0,038. Se observă că cu cât textul este mai „înțeles”, cu atât este mai mare indicele său de coincidență. Această circumstanță ajută doar la calcularea lungimii cheii în cifrul Vigenère.

Fie  textul original, în care  este a sa litera și  este cifrul său Vigenère. Dacă se aplică o schimbare normală, adică lungimea tastei , atunci egalitatea trebuie să fie valabilă , deoarece numai numerele de litere sunt modificate, dar nu și numărul de apariții ale acestora. Deoarece  este un text semnificativ (prin presupunere), valoarea lui , va fi aproximativ egală cu valoarea standard a , pentru limba dată. Prin urmare, este luat în considerare un exemplu de engleză obișnuită . Desigur, este puțin probabil ca cifrul Vigenère să fie obținut în cazul general cu o cheie de lungime 1. Prin urmare, următorii indici de potrivire sunt calculați secvenţial: până la .






Acest lucru poate indica faptul că lungimea cheii este , deși poate fi un traseu fals.

Într-adevăr, dacă lungimea cheii este egală cu , atunci textul va fi obținut din schimbare, prin urmare, va stoca , iar textul , la rândul său, este un eșantion aleatoriu de text semnificativ, prin urmare, trebuie să-și păstreze caracteristicile statistice, în special, indicele de potrivire.

Dacă indexul de potrivire al unei anumite limbi este necunoscut, atunci este posibil și utilizarea testului Kasiski. Este necesar să nu comparați valorile primite ale indicilor de coincidență cu valoarea standard, ci să urmăriți când acest indice crește brusc. Acest lucru poate semnala o lungime a cheii găsite. Desigur, vorbim despre descifrarea textelor semnificative și în același timp destul de lungi. Cu toate acestea, conceptul de semnificație pentru limbile formale nu este un concept ușor.

O altă aplicație a testului Kasiski este de a verifica dacă frecvențele literelor întâlnite în criptare sunt păstrate. Fie  textul cifrat, iar algoritmul de criptare este necunoscut. Dacă se știe că s-a folosit alfabetul englez normal și valoarea este aproape de 0,065, atunci acest lucru sugerează că a fost folosit un cifr care păstrează frecvența. Este posibil ca acesta să fie un simplu cifr de substituție. Într-o situație în care valoarea este departe de 0,065, se poate presupune că a fost folosit un cifr care nu a păstrat frecvența, sau textul a fost lipsit de sens, sau a fost folosit un alfabet diferit etc. Într-un cuvânt, ceva s-a dovedit a fi greșit și este nevoie de o analiză mai profundă.

Să revenim la cifrul Vigenère. Să definim corect lungimea cheii egală cu . Acum trebuie să găsiți cheia în sine.

O histogramă construită conform frecvențelor standard ale literelor dintr-o limbă are propriile sale caracteristici distinctive. Ele se explică prin utilizarea extrem de neuniformă a literelor în limba engleză. Această neuniformitate face posibilă aplicarea eficientă a analizei de frecvență.

În primul rând, „vârfurile” corespunzătoare literelor A, E, H, I, N, O, R, S, T și „cioturile” corespunzătoare lui J, Q, X, Z atrag atenția”. alături, există chiar și un întreg trio: R, S, T. Toate împreună oferă o ușurare foarte specifică.

Dacă se folosește o schimbare de 4, atunci imaginea se schimbă ciclic. Există o schimbare ciclică de relief cu 4 unități. Dacă nu cunoașteți amploarea schimbării, atunci nu este dificil să o restabiliți, ghidat de bunul simț.

Mașini rotative

Este posibil să se îmbunătățească cifrul Vigenère luând în considerare o combinație de substituții arbitrare ca o cheie repetată: . Aceasta înseamnă că unitățile textului sursă sunt convertite în unități , respectiv în etc.

Când spargeți un astfel de cifr, ca în cazul cifrului Vigenère, trebuie mai întâi să determinați lungimea cheii . Acest lucru se poate face folosind testul Kasiski în același mod ca în cazul descris. În plus , analiza frecvenței poate fi aplicată pentru a determina substituțiile.

Analiza de frecvență

Odată ce lungimea cheii este cunoscută, textul cifrat poate fi scris în mai multe coloane, fiecare corespunzând unui caracter al cheii. Fiecare coloană constă din textul original, care este criptat cu un cifru Caesar ; cheia pentru cifrul Caesar este doar un caracter al cheii pentru cifrul Vigenère, care este folosit în această coloană. Folosind tehnici similare cu cele de spargere a cifrului Caesar, textul cifrat poate fi decriptat. O îmbunătățire a testului lui Kasiska, cunoscută sub numele de metoda Kirchhoff, compară frecvența de apariție a caracterelor în coloane cu frecvența de apariție a caracterelor din textul sursă pentru a găsi caracterul cheie pentru acea coloană. Când toate caracterele din cheie sunt cunoscute, criptoanalistul poate descifra cu ușurință textul cifrat din textul simplu. Metoda lui Kirchhoff nu este aplicabilă atunci când tabelul Vigenère este amestecat în loc de a utiliza secvența alfabetică obișnuită, deși testul Kasiska și testele de potrivire pot fi încă folosite pentru a determina lungimea cheii pentru acest caz. [13]

Mențiuni în literatură

În 1881, Jules Verne a scris romanul Jangada . În acest roman, autorul a folosit cifrul Vigenère pentru a cripta documentul. Ca text cifrat, autorul folosește următorul document:

SGUCHPVELLZIRTEPNDNFGINBORGYUGLCHD KOTKHZHGUUMZDHRЪSGSYUDTPЪARVYGGISCHVCH EECSTOUZHVSEVHAHYAFBBETFZSEFTHZHZBZ ЪGFBSCHKHRPZhTZVTZJYTGOYBNTFFEOICHT TEGIIOKZPTFLEUGSFIPTMOFOXHMGBT JFYGUCHOYUNFNSHZGELLSHRUDENKOLGGNSBK SSEUPNFTSEEEGGSJNOYIONRSITKTSEDB UBTETLOTBFTSSBYPMPZTZHPTUFKDG

Pe parcursul povestirii, eroii găsesc un fragment din cuvântul descifrat pentru acest document: ORTEGA Eroii au ghicit că acest nume ar putea însemna semnătura de la sfârșitul documentului. Astfel iese:

O R T E G A T U V K D G

Prin urmare, cheia este 432513. Cunoscând cheia, puteți traduce cu ușurință acest document:

CAUZA REALĂ A FURTULUI DE DIAMANTE SGUCHPVELL ZIRTEPND NFGIN BORGYUG ȘI UCIREA SOLDAȚILOR DE PROTECȚIE ÎN NOAPTEA PE L CHDKOTKHZHG UUMZDH RЪSGSYu D TPIA RV A DOUAZEȘI ȘI IANUARIE MIE YGGISCHVCHE ETSSTUZH VSEVHA HYAFBBB OPT SUTE DOUAZEȘEȘEEA ETFZSEFTKh ZHZBZЪGFB SCHIKHHRIP ZHTZV NU JOAM DACOSTA, NEGOCIT LA TJ YTGO YBNTFFFE OIKHTTEGIIIOKZP TFL VORBIT PENTRU MOARTE, IAR EU, NEFERICIT EUGSFIPTM O FOKSHM G B TJFYGUCHOYUN ANGAJAT DEPARTAMENTUL DE DIAMANT FNSHZGALL SCHRUDENKOLG GNSBCSSEU JUDETUL; DA EU SUNT UNUL, ÎN CE ŞI SEMNATURILE PNFTSEE EG G SZHNO ȘI YIO N RSITKTS RĂZBOI ÎN NUMELE MEU ADEVĂRAT, EDBUB TETLO TBFTSSBUYP MPZTZHP ORTEGA TUFKDG

Opțiuni

Există multe alte pătrate memorabile care pot fi folosite ca bază pentru un sistem polialfabetic, în același mod ca și pătratul Vigenère. Una dintre cele mai faimoase este Piața Beaufort . Liniile sale sunt liniile pătratului Vigenère, scrise în ordine inversă. Este numit după amiralul Sir Francis Beaufort  , inventatorul scalei vitezei vântului. Dacă în pătratul Vigenère primul rând și coloana indică rânduri și, respectiv, coloane, atunci în pătratul Beaufort, primul rând și ultima coloană servesc acestor scopuri. [paisprezece]

Varianta cheie de rulare a cifrului Vigenère a fost odată indestructibil. Această versiune folosește ca cheie un bloc de text de lungime egală cu textul original. Deoarece cheia este egală ca lungime cu mesajul, metodele propuse de Friedman și Kasiski nu funcționează (pentru că cheia nu se repetă). În 1920, Friedman a fost primul care a descoperit dezavantajele acestei opțiuni. Problema cu cheia de rulare a cifrului Vigenère este că criptoanalistul are informații statistice despre cheie (în condițiile în care blocul de text este scris într-o limbă cunoscută) și această informație va fi reflectată în textul cifrat. Dacă cheia este într-adevăr aleatorie, lungimea ei este egală cu lungimea mesajului și a fost folosită o singură dată, atunci cifrul Vigenère va fi teoretic indestructibil, de fapt, această opțiune va fi deja cifrul Vernam-Vigenère, pentru care absolut puterea criptografică a fost dovedită.

În ciuda puterii aparente a cifrului Vigenère, acesta nu a fost utilizat pe scară largă în Europa. Mai obișnuit a fost cifrul Gronsfeld , creat de contele Gronsfeld, identic cu cifrul Vigenère, cu excepția faptului că a folosit doar 10 alfabete diferite (corespunzând cifrelor de la 0 la 9). Avantajul cifrului Gronsfeld este că nu se folosește un cuvânt ca cheie, ci o secvență digitală care se repetă până când devine egală cu lungimea mesajului criptat. Cifrul Gronsfeld a fost utilizat pe scară largă în Germania și Europa, în ciuda deficiențelor sale.

Implementare

JavaScript

Codul //Puteți copia și lipi tot acest cod în consola browserului dvs. var a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; //Șir alfabet var m = "ATTACKATDAWN" ; //Mesajul var k = "LEMON" ; //Cheie funcția Vizhener ( m , k , mode ){ //(criptare/decriptare) pentru „Gronsfeld” + „Vizhener” + „Beaufort” + „Shifted Atbash” //m - mesaj sau text cifrat (poate fi, de asemenea, o cheie dacă Beaufort cipher ), //k - cheie (sau mesaj/text cifrat dacă cifră Beaufort), //mod - mod: // Criptare: "criptare" (implicit), // Decriptare: "decriptare" (mod === "decriptare" ), // Criptare-decriptare în funcție de tabelul atbash deplasat: (mode==='shifted_atbash') // Extrageți cifre din cheia de criptare Gronsfeld: „gronsfeld” sau „gronsfeld_encrypt”, „gronsfeld decrypt”. var maxlength = Math . max ( m . lungime , k . lungime ); var r = '' ; //Rezultat gol pentru ( i = 0 ; i < maxlength ; i ++ ){ //criptare/decriptare //Vizhener - criptare/decriptare o forumulă (criptare - implicit; decriptare - când (mod === 'decriptare') ) var mi = a . indexOf ( m [ ( ( i >= m . lungime ) ? i % m . lungime : i ) ] ); //fit message/ciphertext - to key (dacă mai puțin) var ki_s = k [ ( ( i >= k . length ) ? i % k . length : i ) ]; //adaptați cheia la mesaj/text cifrat (dacă este scurt) var ki = ( typeof mode !== 'undefined' && mode . indexOf ( 'gronsfeld' ) !== - 1 ) ? parseInt ( ki_s ) : a . indexOf ( ki_s ); //scăderea în timpul decriptării sau adunării. ki = ( ( tip de mod !== 'nedefinit' && mod . indexOf ( 'decriptare' ) !== - 1 ) ? ( - ki ) : ki ); c = a [ ( ( ( a . lungime + ( mi + ki ) ) % a . lungime ) ] ; //simbol conform tabelului Vigenère. c = ( mod === 'shifted_atbash' ) ? a [ a . lungime - 1 - a . indexOf ( c )] : c ; // Caracter sau caracter Atbash. r += c ; //Adăugați un caracter la rezultat. } return r ; // returnează șirul rezultat } //Teste: //unu. Cifrul Gronsfeld. (O versiune trunchiată a cifrului Vigenère). //Parametri: m - mesaj/text cifrat, k - cheie (numai cifre), mod - consolă „criptare/decriptare” . jurnal ( '\n\n1. Cifrul Gronsfeld (versiunea defrișată a cifrului Vigenère cu cheie digitală):' , '\n' + 'm = ' , 'GRONSFELD' , '-mesaj ' , '\n' + 'k = ' , '2015' , '- key' , '\n' + 'Gronsfeld cipher - encryption: ' , Vizhener ( 'GRONSFELD' , '2015' , 'gronsfeld' ) //produce IRPSUFFQF - cifrul Gronsfeld , '\n ' + 'Gronsfeld cipher - decrypt: ' , Vizhener ( Vizhener ( 'GRONSFELD' , '2015' , 'gronsfeld' ), '2015' , 'gronsfeld decrypt' ) //va produce GRONSFELD - din cifrul Gronsfeld , '\ n' + 'Comparați cu mesajul: ' , "( decriptat === m )" , ( Vizhener ( Vizhener ( 'GRONSFELD' , '2015' , 'gronsfeld' ), '2015' , 'gronsfeld_decrypt' ) === ' GRONSFELD' ) // m?true ); //2. De asemenea, în loc de cifre, în cifrul Gronsfeld, este posibil să se indice și litere. //Apoi, cifrul Gronsfeld va fi un cifr Vigenère obișnuit, dar cu o limită de caractere pe cheie. //De exemplu, cu toate cifrele posibile în cheia „0123456789”, cheia poate fi doar din literele „ABCDEFGHIJ” //O puteți obține astfel: var Gronsfeld_key = '2015' ; var Vizhener_key = Gronsfeld_key . împărțit ( '' ). map ( function ( x ){ return a [ parseInt ( x )]}). unire ( '' ); //CABF //Și invers: var Gronsfeld_key2 = Vizhener_key . împărțit ( '' ). map ( function ( x ){ return a . indexOf ( x )}). unire ( '' ); //2015 //Iată-le, în consolă: console . log ( '\n2. Conversia cheii Gronsfeld în cheia Vizhener:' , '\nCheia_Gronsfeld' , Cheia_Gronsfeld , '\n' + 'la cheia_Vizhener' , Cheia_Vizhener , '\n' + 'și înapoi:' , Cheia_Gronsfeld2 ); //3. Apoi criptarea-decriptarea cifrului Gronsfeld este o lucrare cu cifrul Vigenère: console . log ( "\n3. Cifrul Gronsfeld - cu cheia Vigenère, conform tabelului Vizhener:" , '\n' + 'm = ' , 'GRONSFELD' , ' - mesaj' , '\n' + 'k = ' , Vizhener_key , '- key' , '\n' + 'Gronsfeld cipher - encryption: ' , Vizhener ( 'GRONSFELD' , Vizhener_key ) //produce IRPSUFFQF - Cifrul Beaufort , '\n' + 'Cifrul Gronsfeld - decriptare:' , Vizhener ( Vizhener ( 'GRONSFELD' , Vizhener_key ), Vizhener_key , 'decrypt' ) //Oferă GRONSFELD - din cifrul Beaufort. , '\n' + 'Comparație cu mesajul: ' , "( decriptat === m )" , ( Vizhener ( Vizhener ( 'GRONSFELD' , Vizhener_key ), Vizhener_key , 'decrypt' ) === 'GRONSFELD' ) //'GRONSFELD'? adevărat ); //patru. Cifrare Vigenère (versiunea completă): //Parametri: m - mesaj/text cifrat, k - cheie, mod - consola "criptare"/"decriptare" . jurnal ( '\n4. Cifrul Vigenère (versiunea completă):' , '\n' + 'm = ' , m , '- mesaj' , '\n' + 'k = ' , k , '- cheie' , ' \n' + 'Cifrul Vigenère - criptare: ' , Vizhener ( m , k ) //produce LXFOPVEFRNHR - cifrul Vigenère , '\n' + 'Cifrul Vigenère - decriptare: ' , Vizhener ( Vizhener ( m , k ), k , 'decrypt' ) //va da ATTACKATDAWN - de la Vizhener cipher , '\n' + 'Comparație cu mesajul: ' , "( decrypted === m )" , ( Vizhener ( Vizhener ( m , k , 'encrypt' ), k , 'decriptare' ) === m ) //m?true ); //5. Cifrul Beaufort - prin cifrul Vigenère (există un alt tabel și text cifrat - a mutat atbash de-a lungul liniilor). //Parametri: m - cheie, k - mesaj/text cifrat, mod - 'decriptare' (doar decriptare) //Particularitatea cifrului Beaufort este că decriptarea este re-criptarea textului cifrat - cu aceeași cheie. //Adica aceeasi operatie. consola . log ( "\n5. Cifrul Beaufort (în tabel - atbash linie cu linie):" , '\n' + 'm = ' , m , ' - mesaj' , '\n' + 'k = ' , k , '- cheie' , '\n' + 'Cifrul Beaufort - Criptare tabel Vigenère: ' , Vizhener ( k , m , 'decriptare' ) //produce LLTOLBETLNPR - Cifr Beaufort , '\n' + 'Cifrul Beaufort - Decriptare tabel Vigenère :' , Vizhener ( k , Vizhener ( k , m , 'decriptare' ), 'decriptare' ) //dați ATTACKATDAWN - din cifrul Beaufort. , '\n' + 'Comparație cu mesajul: ' , "( decriptat === m )" , ( Vizhener ( k , Vizhener ( k , m , 'decriptare' ), 'decriptare' ) === m ) //m? adevărat ); //6. Deplasat atbash - prin cifrul Vigenère (există un alt tabel și text cifrat - atbash, deplasat în rânduri în coloane). //Parametri: m sau k - mesaj/text cifrat și cheie (sau invers), mod - 'shifted_atbash'(doar criptare + atbash la rezultat) //Nu numai că este aceeași operațiune (decriptare - există criptarea textului cifrat ) ), dar este și comutativă. //Adica, aici, literele a n-a (ale mesajului/textului cifrat) si cheia - pot fi schimbate, dand acelasi rezultat. //Tocmai acesta este, atbash-ul deplasat - care se apropie de cifrul Vernam, //pentru că atunci când se decriptează cu cifrul Vernam, operația XOR nu contează unde sunt octeții de cheie și unde sunt octeții de text cifrat. consola . log ( "\n6. Atbash mutat (în tabelul atbash, deplasat atât rândurile, cât și coloanele):" , '\n' + 'm = ' , m , ' - mesaj' , '\n' + 'k = ' , k , '- key' , '\n' + 'Shifted atbash - Vigener table encryption: ' , Vizhener ( m , k , 'shifted_atbash' ) //Oferă OCULKEVUIMSI - shifted atbash cipher. , 'Test de comutativitate de înlocuire: ' , Vizhener ( k , m , ' shifted_atbash ' ) // Același, indiferent unde este cheia și unde este mesajul. , ' \n' + ' Atbash mutat - decriptare folosind tabelul Vizhener : / _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /La fel, indiferent unde este cheia, dar unde este textul cifrat. , '\n' + 'Comparație cu mesajul: ' , "( decriptat === m )" , ( Vizhener ( k , Vizhener ( k , m , 'shifted_atbash ' ) , ' shifted_atbash ' ) === m ) // m ? _ _ _ _ _ _ _ _ _ ifted_atbash' ) === Vizhener ( k , m , 'shifted_atbash' )) && ( Vizhener ( Vizhener ( k , m , 'shifted_atbash' ), k , 'shifted_atbash' ) === Vizhener ( k , Vizhener ( k , m , 'shifted_atbash' ), 'shifted_atbash' ) ) ) //Comutativitate? adevărat );

Delphi 10

Codul program Vigenere ; folosește System . SysUtils , Winapi . ferestre ; const cmGronsfeld : Byte = 1 ; cmShiftedAtbash : Byte = 2 ; cmDecrypt : Byte = 4 ; YesNo : matrice [ Boolean ] de șir = ( 'nu' , 'yes' ) ; jurnal var : TStringBuilder ; funcția VigenereCrypt ( m , k : șir ; mod : Byte = 0 ) : șir ; const a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; //Șir alfabet var maxLength , i , mi , ki , ix : Integer ; r , ki_s , c : șir ; gronsfeld , shiftedAtbash , decriptare : Boolean ; începe //(criptare/decriptare) pentru „Gronsfeld” + „Vigenere” + „Beaufort” + „Shifted Atbash” //m - mesaj sau text cifrat (poate fi cheie dacă cifrul Beaufort), //k - cheie (sau mesaj/ text cifrat dacă cifră Beaufort), //mod - mod: // Criptare: „criptare” (implicit), // Decriptare: „decriptare” (mod === „decriptare”), // Criptare-decriptare prin tabelul atbash mutat: (mod = cmShiftedAtbash) // Extrageți cifre din cheia de criptare Gronsfeld: „gronsfeld” sau „gronsfeld_encrypt”, „gronsfeld decrypt”. Lungime max := m . lungime ; dacă k . Lungime > maxLength apoi maxLength := k . lungime ; Rezultat := '' ; //Rezultat gol gronsfeld := ( mod și cmGronsfeld ) > 0 ; shiftedAtbash := ( mod și cmShiftedAtbash ) > 0 ; decriptare := ( mod și cmDecrypt ) > 0 ; for i := 0 to maxlength - 1 do begin //criptare/decriptare //Vigenere - criptare/decriptare o forumulă (criptare - în mod implicit; decriptare - când (cmDecrypt este în modul) ) //adaptați mesajul/text cifrat - la cheie (dacă mai mic) dacă i >= m . lungime apoi ix := i mod m . Lungime else ix := i ; mi := a . IndexOf ( m [ ix + 1 ]) ; dacă i >= k . lungime apoi ix := i mod k . Lungime else ix := i ; ki_s := k [ ix + 1 ] ; //adaptați cheia la mesaj/text cifrat (dacă este scurt) dacă gronsfeld atunci ki := ki_s . ToInteger () else ki := a . IndexOf ( ki_s ) ; //scăderea în timpul decriptării sau adunării. if decrypt then ki := ki * - 1 ; c := a [(( a . Lungimea + mi + ki ) mod a . Lungimea ) + 1 ] ; //simbol conform tabelului Vigenère. dacă shiftedAtbash atunci c := a [ a . lungime - a . IndexOf ( c )] ; // Caracter sau caracter Atbash. Rezultat := Rezultat + c ; //Adăugați un caracter la rezultat. sfârşitul ; sfârşitul ; funcția GronsfeldToVigenere ( GfKey : șir ) : șir ; const a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; //Șir alfabet var i : Integer ; începe Rezultatul := '' ; pentru i := 1 la Lungime ( GfKey ) do Result := Result + a [ StrToInt ( GfKey [ i ]) + 1 ] ; sfârşitul ; funcția VigenereToGronsfeld ( VgKey : șir ) : șir ; const a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; //Șir alfabet var i : Integer ; începe Rezultatul := '' ; for i := 1 to Length ( VgKey ) do Result := Result + IntToStr ( a . indexOf ( VgKey [ i ])) ; //2015 sfârşit ; procedura GronsfeldTest () ; const MSG = 'GRONSFELD' ; CHEIE = '2015' ; TXT = '1. Cifrul Gronsfeld (Versiunea defrișată a cifrului Vigenère cu cheie digitală):' #13#10 + 'Mesaj:' #9 '"%s"' #13#10 + 'Cheie:' #9#9 '"%s"' # 13#10 + 'Criptare:' #9 '"%s" (ar trebui să fie "IRPSUFFQF")' #13#10 + 'Decriptare:' #9 '"%s" (ar trebui să fie "%s")' # 13 #10 + „Potrivire:” #9 „%s” #13#10 ; var criptat , decriptat : string ; începe //1. Cifrul Gronsfeld. (O versiune trunchiată a cifrului Vigenère). //Parametri: m - mesaj/text cifrat, k - cheie (numai numere), mod - "criptare/decriptare" criptat := VigenereCrypt ( MSG , KEY , cmGronsfeld ) ; //oferă IRPSUFFQF - Gronsfeld cipher decriptat := VigenereCrypt ( criptat , KEY , cmGronsfeld sau cmDecrypt ) ; //da GRONSFELD - din cifrul Gronsfeld jurnal . AppendFormat ( TXT , [ MSG , KEY , criptat , decriptat , MSG , YesNo [ decriptat = MSG ]]) ; sfârşitul ; procedura VigenereToGronsfeldTest () ; const GKEY = '2015' ; TXT = #13# 10'2. Conversia cheii Gronsfeld în cheia Vigenère:' #13#10 + 'Cheia Gronsfeld: "%s" >>> Cheia Vigenère: "%s" și înapoi: "%s"' #13#10 ; var GronsfeldKey2 : șir ; VigenereKey : șir _ începe //2. De asemenea, în loc de cifre, în cifrul Gronsfeld, este posibil să se indice și litere. //Apoi, cifrul Gronsfeld va fi un cifr Vigenère obișnuit, dar cu o limită de caractere pe cheie. //De exemplu, cu toate cifrele posibile în cheia „0123456789”, cheia poate fi doar din literele „ABCDEFGHIJ” //O puteți obține astfel: VigenereKey := GronsfeldToVigenere ( GKEY ) ; //CABF //Și invers: GronsfeldKey2 := VigenereToGronsfeld ( VigenereKey ) ; //2015 jurnal . AppendFormat ( TXT , [ GKEY , VigenereKey , GronsfeldKey2 ]) ; sfârşitul ; procedura GronsfeldAsVigenereTest () ; const MSG = 'GRONSFELD' ; CHEIE = 'CABF' ; TXT = #13# 10'3. Cifrul Gronsfeld - cu cheie Vigenère, conform tabelului Vigenère:' #13#10 + 'Mesaj:' #9 '"%s"' #13#10 + 'Cheie:' #9#9 '"%s"' # 13 #10 + 'Criptare:' #9 '"%s" (ar trebui să fie "IRPSUFFQF")' #13#10 + 'Decriptare:' #9 '"%s" (ar trebui să fie "%s")' #13 # 10 + „Potrivire:” #9 „%s” #13#10 ; var criptat , decriptat : string ; începe //3. Apoi, criptarea-decriptarea cifrului Gronsfeld este o lucrare cu cifrul Vigenère: criptat := VigenereCrypt ( MSG , KEY ) ; //oferă IRPSUFFQF - Cifrul Beaufort decriptat := VigenereCrypt ( criptat , KEY , cmDecrypt ) ; //da GRONSFELD - din cifrul Beaufort. jurnal . AppendFormat ( TXT , [ MSG , KEY , criptat , decriptat , MSG , YesNo [ decriptat = MSG ]]) ; sfârşitul ; procedura VigenereFullTest () ; const MSG = 'ATTACKATDAWN' ; //Mesaj KEY = 'LEMON' ; //Tasta TXT = #13#10 '4. Cifrul Vigenère (versiunea completă):' #13#10 + 'Mesaj:' #9 '"%s"' #13#10 + 'Cheie:' #9#9 '"%s"' #13#10 + ' Criptare:' #9 '"%s" (ar trebui să fie "LXFOPVEFRNHR")' #13#10 + 'Decriptare:' #9 '"%s" (ar trebui să fie "%s")' #13#10 + „Potrivire :' #9 '%s' #13#10 ; var criptat , decriptat : string ; începe //4. Cifrul Vigenère (versiunea completă): //Parametri: m - mesaj/text cifrat, k - cheie, mod - "criptare"/"decriptare" criptat := VigenereCrypt ( MSG , KEY ) ; //da LXFOPVEFRNHR - Cifrul Vigenere decriptat := VigenereCrypt ( criptat , KEY , cmDecrypt ) ; //da ATTACKATDAWN - din cifrul Vigenère jurnal . AppendFormat ( TXT , [ MSG , KEY , criptat , decriptat , MSG , YesNo [ decriptat = MSG ]]) ; sfârşitul ; procedura BeaufortTest () ; const MSG = 'ATTACKATDAWN' ; //Mesaj KEY = 'LEMON' ; //Tasta TXT = #13#10 '5. Cifrul Beaufort (în tabel - atbash linie cu linie):' #13#10 + 'Mesaj:' #9 '"%s"' #13#10 + 'Cheie:' #9#9 '"%s"' #13 #10 + „Cifrul Vigenère al lui Beaufort:” #13#10 + „Criptare:” #9 „%s” (ar trebui să fie „LLTOLBETLNPR”)’ #13#10 + „Decriptare:” #9 „%s” „ (ar trebui să fie „%s”)’ #13#10 + „Potrivire:” #9 „%s” #13#10 ; var criptat , decriptat : string ; începe //5. Cifrul Beaufort - prin cifrul Vigenère (există un alt tabel și text cifrat - a mutat atbash de-a lungul liniilor). //Parametri: m - cheie, k - mesaj/text cifrat, mod - 'decriptare' (doar decriptare) //Particularitatea cifrului Beaufort este că decriptarea este re-criptarea textului cifrat - cu aceeași cheie. //Adica aceeasi operatie. criptat := VigenereCrypt ( KEY , MSG , cmDecrypt ) ; //oferă LLTOLBETLNPR - Cifrul Beaufort decriptat := VigenereCrypt ( CHEIE , criptat , cmDecrypt ) ; //da ATTACKATDAWN - din cifrul Beaufort. jurnal . AppendFormat ( TXT , [ MSG , KEY , criptat , decriptat , MSG , YesNo [ decriptat = MSG ]]) ; sfârşitul ; procedura ShiftedAtbashTest () ; const MSG = 'ATTACKATDAWN' ; //Mesaj KEY = 'LEMON' ; //Tasta TXT = #13#10 '6. S-a mutat atbash (în tabelul atbash, s-a deplasat ambele rânduri și coloane):' #13#10 + 'Mesaj:' #9 '"%s"' #13#10 + 'Tasta:' #9#9 '"% s "' #13#10 + 'Atbash mutat - Criptare tabel Vigenère:' #9 '"%s" (ar trebui să fie "OCULKEVUIMSI")' #13#10 + 'Test de comutativitate de înlocuire:' #9 '"%s " ( ar trebui să fie „OCULKEVUIMSI”)’ #13#10 + „Atbash deplasat - Decriptare Vigenère:’ #9 „%s” (ar trebui să fie „ATTACKATDAWN”)’ #13#10 + „Test de comutativitate de înlocuire:” #9 "" %s"' #13#10 + 'Comparație cu mesajul:' #9 '%s' #13#10 + 'Comutativitatea înlocuirii:' #9 '%s' ; var csaMK , csaKM , csaKMK , csaKKM : șir ; începe //6. Deplasat atbash - prin cifrul Vigenère (există un alt tabel și text cifrat - atbash, deplasat în rânduri în coloane). //Parametri: m sau k - mesaj/text cifrat și cheie (sau invers), mod - cmShiftedAtbash (doar criptare + atbash la rezultat) //Nu numai că este aceeași operațiune (decriptare - există criptarea textului cifrat), dar la Mai mult, este și comutativă. //Adica, aici, literele a n-a (ale mesajului/textului cifrat) si cheia - pot fi schimbate, dand acelasi rezultat. //Tocmai acesta este, atbash-ul deplasat - care se apropie de cifrul Vernam, //pentru că atunci când se decriptează cu cifrul Vernam, operația XOR nu contează unde sunt octeții de cheie și unde sunt octeții de text cifrat. csaMK := VigenereCrypt ( MSG , KEY , cmShiftedAtbash ) ; //oferă OCULKEVUIMSI - cifrul atbash deplasat. csaKM := VigenereCrypt ( KEY , MSG , cmShiftedAtbash ) ; //La fel, nu contează unde este cheia, ci unde este mesajul. csaKMK := VigenereCrypt ( csaKM , KEY , cmShiftedAtbash ) ; // dă ATTACKATDAWN - din cifrul atbash mutat. csaKKM := VigenereCrypt ( KEY , csaKM , cmShiftedAtbash ) ; //La fel, nu contează unde este cheia, ci unde este textul cifrat. jurnal . AppendFormat ( TXT , [ MSG , KEY , csaMK , csaKM , csaKMK , csaKKM , YesNo [ csaKKM = MSG ] , YesNo [( csaMK = csaKM ) și ( csaKMK = csaKKM )]]) ; sfârşitul ; începe jurnalul := TStringBuilder . creați () ; încercați //Teste: GronsfeldTest () ; VigenereToGronsfeldTest () ; GronsfeldAsVigenereTest () ; VigenereFullTest () ; BeaufortTest () ; ShiftedAtbashTest () ; MessageBoxW ( GetDesktopWindow () , PWideChar ( log . ToString ()) , 'Vigenère' , 0 ) ; in sfarsit log . gratuit () ; sfârşitul ; sfârşitul .

Ruby

Codul clasa Crypto class CryptoError < StandardError ; sine ; final attr_reader :alphabet # acceptă o matrice arbitrară de caractere unice, poate fi una sau mai multe limbi, literele minuscule latine implicite def initialize ( alphabet = ( 'A' .. 'Z' ) . to_a ) @alphabet = alphabet check_alphabet end # c{j}=(m{j}+k{j}) mod {n} def encode ( key_str , text_srt ) key_arr = str_to_alphabet_index_arr ( key_str ) char_number_at_text = 0 str_to_alphabet_index_arr ( text_srt ) . injectează ( " " ) face | r , index_litera | encode_letter_index = ( letter_index + key_arr [ char_number_at_text % key_arr . size ] ) % alfabet . dimensiune char_number_at_text += 1 r + alphabet [ encode_letter_index ] end end # m{j}=(c{j} + n - k{j}) mod {n} def decode ( key_str , text_srt ) key_arr = str_to_alphabet_index_arr ( key_str ) char_number_at_text = 0 str_to_alphabet_index_arr ( text_srt ) . injectează ( " " ) face | r , index_litera | decode_letter_index = ( letter_index + alphabet . size - key_arr [ char_number_at_text % key_arr . size ] ) % alphabet . dimensiune char_number_at_text += 1 r + alphabet [ decode_letter_index ] end end privat def str_to_alphabet_index_arr ( str ) str . caractere . harta face | char | index = alfabet . index ( char ) dacă indexul index altfel ridică CryptoError , „literele ar trebui să fie la alfabet” sfârșit sfârșit sfârșit def check_alphabet raise CryptoError , „alphabet should be array” cu excepția cazului în alphabet . este_a? ( Array ) generează CryptoError , „literele ar trebui să fie șiruri de caractere” dacă alfabetul . orice? { | litere | ! scrisoarea . este_a? ( String ) } generează CryptoError , „alfabetul ar trebui să conțină cel puțin o literă” dacă alfabetul . dimensiunea < 1 crește CryptoError , „literele ar trebui să fie unice” dacă alfabet . unic . dimensiune != alfabet . mărirea mărimii CryptoError , „litera nu trebuie să fie goală” dacă este alfabet . orice? ( & :empty? ) generează CryptoError , „literele ar trebui să conțină doar un caracter” dacă alfabetul . orice? { | litere | scrisoarea . dimensiune != 1 } sfârşit capăt # exemple crypto = Crypto . cripto noua . codificare ( 'LEMON' , 'ATTACKATDAWN' ) # "LXFOPVEFRNHR" cripto . decoda ( 'LEMON' , 'LXFOPVEFRNHR' ) # "ATTACKATDAWN" cripto . codificare ( „LEMON” , „atac” ) # Crypto::CryptoError: literele ar trebui să fie la alfabet eng_crypto = Crypto . new (( 'A' .. 'I' ) . to_a ) rus_crypto . encode ( 'KVAS' , 'MAMAMYLARAMU' ) # "TSVMSTSELSЪVMD" rus_crypto . decodificare ( 'KVAS' , ' TSVMTSELSЪVMD' ) # "MAMAMYLARAMU"

Note

  1. ^ Martin , Keith M. Criptografia de zi cu zi  . — Oxford University Press, 2012. — p. 142 p. — ISBN 978-0-19-162588-6 .
  2. Matematică discretă: algoritmi. Schiță istorică (link inaccesibil) . ploaie.ifmo.ru Preluat la 22 decembrie 2017. Arhivat din original la 21 decembrie 2017. 
  3. Serghei și Marina Bondarenko . Cifre din trecut: criptografia și misterele epocii pre-computer  (rusă) , 3DNews - Daily Digital Digest  (8 iulie 2015). Preluat la 22 decembrie 2017.
  4. ↑ 1 2 3 4 5 6 7 Babash A.V., Shankin G.P. Istoria criptografiei. Partea I. - M .: Helios ARV, 2002. - S. 240 p .. - ISBN 5854380439 .
  5. Smith, Laurence D. Substitution Ciphers // Criptography the Science of Secret Writing: The Science of Secret  Writing . - Dover Publications , 1943. - P. 81. - ISBN 0-486-20247-X .
  6. ↑ 1 2 Nosov V. A. Scurtă schiță istorică a dezvoltării criptografiei  (rusă)  // Universitatea din Moscova și dezvoltarea criptografiei în Rusia. Materialele conferinței de la Universitatea de Stat din Moscova .. - (17 octombrie 2002).
  7. ↑ 1 2 3 David, Kahn. The Codebreakers: The Story of Secret Writing. - Simon & Schuster, 1999. - ISBN 0-684-83130-9 .
  8. Knudsen, Lars R. Block Ciphers—un sondaj. - Londra: Springer, 1997. - ISBN 3-540-65474-7 .
  9. Stanislaw Jarecki. Privire de ansamblu Crypto, secret perfect, bloc unic  // Universitatea din California. — 2004.
  10. Richard A. Mollin. Coduri: Ghidul secretului din timpurile antice până la cele moderne. - Chapman și Hall/CRC, 2005. - 704 pagini p. — ISBN 9781584884705 .
  11. Jhelnikov V. Criptografia de la papirus la calculator - M .: ABF , 1996. - 336 p. — ISBN 978-5-87484-054-9
  12. Singh S. The Code Book: The Science of Secretary from Ancient Egypt to Quantum Cryptography. - New York City: Doubleday, 1999. - 416 p. Cu. - ISBN 978-1-85702-879-9 .
  13. Exercițiu de laborator: Vigenere, RSA, DES și protocoale de autentificare  // CS 415: Computer and Network Security. - 2006. Arhivat la 23 iulie 2011.
  14. Arto Salomaa. Criptografia cu cheie publică. — ISBN 3540528318 .

Literatură

  • Romankov V.A. Introducere în criptografie: curs de prelegeri, 2009. - 238 p. — ISBN 5777909825 .
  • Babash A. V., Shankin G. P. Istoria criptografiei. Partea I. - M .: Helios ARV, 2002. - 240 p. — ISBN 5854380439 .
  • Jhelnikov V. Criptografia de la papirus la computer - M .: ABF , 1996. - 336 p. — ISBN 978-5-87484-054-9
  • Arto Salomaa. Criptografia cu cheie publică. — ISBN 3540528318 .
  • N. Smart. Criptografie .. - Moscova: Technosfera, 2005. - 528 p. - ISBN 5-94836-043-1 .
  • Singh S. The Code Book , Histoire des codes secrets  (engleză) : The Science of Secrecy from Ancient Egypt to Quantum Cryptography, De l'Égypte des pharaons à l'ordinateur quantique - NYC : Doubleday , Knopf Doubleday Publishing Group , 1999. — 416 p.
  • Richard A. Mollin. Coduri: Ghidul secretului din timpurile antice până la cele moderne. - Chapman și Hall/CRC, 2005. - 704 pagini p. — ISBN 9781584884705 .
  • Martin, Keith M. Criptografia de zi cu zi. - Oxford University Press, 2012. - 142 p. — ISBN 978-0-19-162588-6
  • Knudsen, Lars R. Block Ciphers—un sondaj. - Londra: Springer, 1997. - ISBN 3-540-65474-7 .
  • Henk Ca van Tilborg. Enciclopedia Criptografiei și Securității. - Springer, 2005. - 115 p. — ISBN 038723473X .
  • Arto Salomaa. Criptografia cu cheie publică. — ISBN 3540528318 .

Link -uri