Vigenère titkosítás

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. június 10-én felülvizsgált verziótól ; az ellenőrzések 18 szerkesztést igényelnek .

A Vigenère-rejtjel ( fr.  Chiffre de Vigenère ) a szó szerinti szöveg polialfabetikus titkosításának módszere kulcsszó használatával. [egy]

Ez a módszer a többalfabetikus helyettesítés egyszerű formája. A Vigenère-rejtjelet sokszor feltalálták. Ezt a módszert először Giovan Battista Bellaso ( olasz  Giovan Battista Bellaso ) írta le a La cifra del. Sig. Giovan Battista Bellas® 1553-ban [2] , de a 19. században Blaise Vigenère [3] francia diplomata nevet kapta . A módszer könnyen érthető és megvalósítható, de az egyszerű kriptográfiai módszerek számára nem érhető el . [négy]

Bár a titkosítást könnyű megérteni és megvalósítani, három évszázadon át kiállt minden feltörési kísérletet; amely kiérdemelte a le chiffre indéchiffrable ( fr.  megoldatlan titkosítás ) nevet. Sokan próbáltak olyan titkosítási sémákat megvalósítani, amelyek lényegében Vigenère titkosítások. [5]

Történelem

1466-ban Leon Alberti , a híres építész és filozófus egy értekezést nyújtott be a titkosírásokról a pápai hivatalnak. A dolgozat a titkosítás különféle módszereit tárgyalja, beleértve a közszöveg elfedését néhány segédszövegben. A munka a saját rejtjellel zárul, amelyet „királyok számára alkalmas titkosírásnak” nevezett. Ez egy többalfabetikus rejtjel, amelyet rejtjellemezként valósítottak meg. A lényeg az, hogy ez a rejtjel több helyettesítést használ a kulcsnak megfelelően. Alberti később feltalálta a megfejtő kódot. Ez a találmány messze megelőzte korát, mivel ezt a típusú titkosítást csak 400 évvel később kezdték használni az európai országokban. [6]

1518-ban új lépést tettek a kriptográfia fejlődésében, amikor Németországban megjelent az első nyomtatott kriptográfiával foglalkozó könyv. Johann Trithemius apát, a würzburgi kolostor apátja írta a „Poligráfia” című könyvet, amely számos titkosítást ismertet. Az egyik a „ Tritemius-táblát ” (ma „Vigenère-tábla”) használja, és a többalfabetikus helyettesítés ötletét fejleszti. A titkosítási rendszer a következő: a forrásszöveg első betűjét az első sor, a másodikat a második sor titkosítja, és így tovább. Az utolsó sor használata után a következő betű ismét titkosításra kerül az első sorban. A Trithemius-rejtjelben nincs kulcs, a titok maga a titkosítási módszer. [négy]

A Trithemius által javasolt titkosítási módszer fejlesztésének következő lépését az olasz Giovanni Belazo tette meg. 1553-ban jelent meg a Signor Belazo titkosírása című röpirata. Ebben a titkosításban a kulcs az úgynevezett jelszó - egy kifejezés vagy egy szó. A jelszót rendszeres időközönként az egyszerű szövegű betűk fölé írták. A jelszó betűje a nyílt szöveg megfelelő betűje felett a Trithemius táblázatban annak a sornak a számát jelezte, amely szerint ennek a betűnek a cseréjét (titkosítását) el kell végezni. [négy]

Ezt követően Trithemius és Belazo ötleteit Belazo honfitársa, Giovanni Battista Porta dolgozta ki . Azt javasolta, hogy hagyják el a betűk ábécé sorrendjét a Trithemius-tábla első sorában, és cseréljék ki ezt a sorrendet valamilyen tetszőlegesre, ami a rejtjelkulcs. A táblázat sorai továbbra is ciklikusan eltolódtak. A titkos levelezésről (1563-ban megjelent [6] ) című könyvében Porta egy bigram-rejtjelet javasolt, és egy mechanikus lemezeszköz leírását is bemutatta, amely a bigram cserét valósítja meg. [négy]

A 16. század közepén G. Cardano „A finomságokról” című könyve jelent meg Olaszországban „A különféle dolgokról” kiegészítéssel. Új kriptográfiai ötletek tükröződtek ott: magának a továbbított nyílt szöveg egy részének titkosítási kulcsként való felhasználása (az „önkulcs” ötlete), valamint egy új titkosítási módszer, amely a történelembe úgy vonult be, mint a „ Cardano rács ”. [négy]

A római francia nagykövet , Blaise de Vigenère , miután megismerkedett Trithemius, Belazo, Cardano, Porta, Alberti munkáival, szintén érdeklődni kezdett a kriptográfia iránt. 1585-ben írt egy Treatise-t a titkosításokról, amely felvázolja a titkosítás alapjait. Ebben a művében megjegyzi: „A világon minden rejtjel. Az egész természet csak egy rejtjel és egy titkos levél." Ezt a gondolatot később Blaise Pascal  , a valószínűségelmélet egyik megalapítója, majd a 20. században Norbert Wiener  , a "kibernetika atyja" is megismételte. [négy]

Valójában Vigenère Trithemius, Bellazeau, Port megközelítéseit ötvözte a sima szövegek titkosításával, lényegében anélkül, hogy bármi eredetit bevezetett volna ebbe. Korunkban a „Vigenère-rejtjel”, amely a kulcsszó időszakos folytatásából áll a Trithemius-táblázaton, kiszorította elődei nevét. [4] David Kahn The Codebreakers című könyvében helytelenítette ezt, és azt írta, hogy a történelem "figyelmen kívül hagyott egy fontos tényt, és a rejtjelt Vigenère-ről nevezte el, annak ellenére, hogy semmit sem tett a létrehozásáért" [7] .

A Vigenère-rejtjel rendkívül ellenálló volt a „kézi” repedésekkel szemben. A híres író és matematikus, Charles Lutwidge Dodgson ( Lewis Carroll ) feltörhetetlennek nevezte a Vigenère-rejtjelet Az alfabetikus rejtjel című cikkében .  Az ábécé titkosírása , amely egy gyermeklapban jelent meg 1868-ban. 1917-ben a Scientific American feltörhetetlenként emlegette a Vigenère-rejtjelet. [8] Ezt az elképzelést megcáfolták, miután Kasiski a 19. században teljesen feltörte a rejtjelet, bár a rejtjelt néhány tapasztalt kriptoanalitikus már a 16. században feltörte. [7]

A Vigenère rejtjelező elég egyszerű ahhoz, hogy terepen is használható legyen, különösen, ha rejtjellemezeket használnak. Például a „Konföderáció” a polgárháború során rézrejtjellemezt használt a Vigenère-rejtjelhez . A konföderációs üzenetek távolról sem voltak titkosak, és az üzeneteket rendszeresen feltörték ellenfeleik. A háború alatt a Konföderációs parancsnokság három kulcsmondatra támaszkodott: "Manchester Bluff", "Teljes győzelem" és - ahogy a háború a végéhez közeledett - "Gyere megtorlás". [7]

Gilbert Vernam megpróbálta javítani a feltört titkosítást (1918-ban Vernam-Vigenère titkosításnak nevezték), de a fejlesztései ellenére a rejtjel továbbra is sebezhető volt a kriptoanalízissel szemben . Vernam munkája azonban végül a Vernam titkosítást eredményezte , amelyet valóban lehetetlen feltörni. [9]

Leírás

A Caesar-rejtjelben az ábécé minden betűje több pozícióval eltolódik; például egy Caesar-rejtjelben +3-as eltolással A-ból D, B-ből E lesz, és így tovább. A Vigenère-rejtjel több különböző eltolási értékkel rendelkező Caesar-rejtjel sorozatából áll. A titkosításhoz a tabula recta vagy a Vigenère-négyzet (táblázat) nevű ábécé táblázat használható. A latin ábécé tekintetében a Vigenère táblázat egyenként 26 karakterből álló sorokból áll, és minden következő sor több pozícióval el van tolva. Így a táblázatban 26 különböző Caesar-rejtjel található. A titkosítás minden szakaszában különböző ábécéket használnak, amelyeket a kulcsszó karakterétől függően választanak ki. Tegyük fel például, hogy a forrásszöveg így néz ki:

ATTACKATDAWN

Az üzenetet küldő személy egy ciklusban írja a kulcsszót (" LEMON "), amíg annak hossza megegyezik az eredeti szöveg hosszával:

CITROMOSZ

A nyílt szöveg első karaktere ("A") az L szekvenciával van titkosítva, amely a kulcs első karaktere. A rejtjelezett szöveg első karaktere ("L") a Vigenère-tabló L sorának és A oszlopának metszéspontjában található. Hasonlóképpen, a forrásszöveg második karakteréhez a kulcs második karakterét használjuk; azaz a titkosított szöveg második karakterét ("X") az E sor és a T oszlop metszéspontjában kapjuk. A nyílt szöveg többi része hasonló módon titkosítva van.

Eredeti szöveg: ATTACKATDAWN Kulcs: CITROMOS Rejtjelezett szöveg: LXFOPVEFRNHR

A visszafejtés a következőképpen történik: a Vigenère táblában megtaláljuk a kulcsszó első karakterének megfelelő sort; ebben a karakterláncban találjuk a rejtjelezett szöveg első karakterét. Az oszlop, amelyben ez a karakter található, megfelel a forrásszöveg első karakterének. A következő rejtjelezett karakterek visszafejtése hasonló módon történik.

Ha  az ábécé betűinek  száma, az egyszerű szöveg betűjének  száma, az ábécé kulcsbetűjének száma, akkor a Vigenère-rejtjel a következőképpen írható:

És a visszafejtés:

[tíz]

Számítógépben egy ilyen művelet megfelel az üzenetkarakterek ASCII-kódjainak és a modulo billentyűnek. Úgy tűnik, hogy ha a táblázat összetettebb, mint a sorok ciklikus eltolása, akkor a titkosítás megbízhatóbb lesz. Ez akkor igaz, ha gyakrabban változtatja, például szóról szóra. De az ilyen, latin négyzetekből álló táblázatok összeállítása, ahol bármely betű egyszer előfordul egy sorban vagy oszlopban, fáradságos, és csak számítógépen szabad elvégezni. A kézi többalfabetikus titkosításnál csak a kulcs hosszára és összetettségére hagyatkoznak, az adott táblázatot használva, amit nem lehet titokban tartani, és ez leegyszerűsíti a titkosítást és a visszafejtést. [tizenegy]

Alkalmazás

A 19. században elterjedt az úgynevezett pad titkosítási módszer. Ezt használták populista forradalmárok , kémek stb. A titkosítás a nyelvből vett kifejezéseket használja titkosítási kulcsként. Például a következő mondat: "július 14. - Mária születésnapja." Ha az angol ábécé betűinek elfogadott számozását használjuk példának, akkor a Marysbirthday jelentése . Az Iamgoing ↔ kifejezés titkosításához a mod26 hozzáadásra kerül a szöveghez a kulccsal, amely a rögzített kifejezés. Kiderül

↔ UADEGJV X.

Mint látható, ebben az esetben ez egy közönséges játék . A francia kriptográfus, Vigenère javasolta az ilyen típusú kulcsok használatát olyan esetekben is, amikor a szöveg hosszabb, mint a kulcs, annyiszor kényszerítve ki, ahányszor szükséges. Ebben az esetben egyáltalán nem szükséges, hogy a kulcsot egy értelmes kifejezésből kapjuk. Sőt, még nem is kívánatos, hiszen az értelmesség segítheti a rejtjelfejtőt. Vegyük például a szöveget:

NEKÜNK ÉDES ÉS KELLEMES A SZÁNYA FÜST ↔ és kulcs: .

A titkosítást a gamma mod26 biztosítja:

Tehát a Vigenère-rejtjel az eltolások ismétlődő kombinációjaként jön létre. Általában ez a rejtjel nem őrzi meg a betűk előfordulásának gyakoriságát , és emiatt nem lehet közvetlenül statisztikai elemzésnek alávetni.

Kriptanalízis

A Vigenère-rejtjel "elmossa" a karakterek szövegbeli megjelenésének gyakorisági jellemzőit, de a karakterek szövegbeli megjelenésének néhány jellemzője megmarad. A Vigenère-rejtjel fő hátránya, hogy a kulcsa ismétlődik. Ezért egy rejtjel egyszerű kriptográfiai elemzése két lépésben építhető fel:

  1. Kulcshossz keresés. Lehetőség van a frekvenciák eloszlásának elemzésére a rejtjelezett szövegben különböző tizedeléssel. Vagyis vegyünk egy olyan szöveget, amely a rejtjelezett szöveg minden 2. betűjét tartalmazza, majd minden 3. betűt stb. Amint a betűgyakoriságok eloszlása ​​nagymértékben eltér az egyenletestől (például entrópiában), akkor beszélhetünk a megtalált kulcshosszról. .
  2. Rejtjel megfejtés. l Caesar-rejtjel készlete (ahol l  a megtalált kulcshossz), amelyek egyenként könnyen feltörhetők.

A Friedman és Kasiska tesztek segíthetnek meghatározni a kulcs hosszát.

A Kasiska teszt és hogyan határozza meg a kulcs hosszát

Charles Babbage volt az első, aki támadási algoritmust fejlesztett ki a Vigenère-rejtjelhez 1854-ben. Az algoritmus kidolgozásának lendületét a John H. B. Thwaites-szel folytatott levélváltás adta. Azt állította, hogy új titkosítást készített, és benyújtotta a Művészeti Társaság folyóiratának; Amikor Babbage megmutatta, hogy a Thwaites-rejtjel csak egy speciális esete a Vigenère-rejtjelnek, Thwaites megkérte, hogy törje fel. Babbage megfejtette a szöveget, amelyről kiderült, hogy Alfred Tennyson "A bűn látomása" című verse , az Emily kulcsszóval - a költő feleségének nevével - titkosítva. De felfedezését nem tette közzé. Ezért ezt az algoritmust Friedrich Wilhelm Kasiska porosz katonatisztről nevezték el, aki Babbage-től függetlenül dolgozta ki ugyanazt az algoritmust 1863-ban. És csak a 20. században, amikor a tudósok tanulmányozták Babbage feljegyzéseit, megjelentek információk az algoritmus első feltalálójáról. [12]

Először definiáljuk egy adott szöveg egybeesési indexének fogalmát. Tekintsük a szöveget a betűkből álló ábécének megfelelőnek . Legyen  ennek a szövegnek a hossza. Jelölje a betű előfordulások számával a szövegben szereplő számmal . Ezután a szövegegyezési indexet a következőképpen határozzuk meg

.

Empirikusan igazolták, hogy a hosszú, értelmes angol szövegek, például a Mellville-i Moby Dick egyezési indexe körülbelül 0,065. Ebben az esetben természetesen csak az angol ábécé 26 betűje marad a szövegben. Ugyanakkor egy teljesen véletlenszerű, meglehetősen hosszú, 26 betűből álló szöveg, amelyben minden betű megközelítőleg ugyanannyiszor fordul elő, 0,038. Megfigyelhető, hogy minél „értelmesebb” a szöveg, annál magasabb az egybeesési indexe. Ez a körülmény csak segít a kulcshossz kiszámításában a Vigenère-rejtjelben.

Legyen  az eredeti szöveg, amelyben  benne van a betűje, és  a Vigenère-rejtjel. Ha normál eltolást alkalmazunk, vagyis a kulcshosszt , akkor az egyenlőségnek érvényesülnie kell , mivel csak a betűk száma változik, az előfordulásuk száma nem. Mivel  ez egy értelmes szöveg (feltételezve), a , értéke megközelítőleg megegyezik az adott nyelv standard értékével. Ezért a közönséges angol nyelv egy példája . Természetesen nem valószínű, hogy a Vigenère-rejtjelet általános esetben egy 1 hosszúságú kulccsal kapjuk meg. Ezért a következő egyezési indexeket szekvenciálisan számítjuk ki: -ig .






Ez azt jelezheti, hogy a kulcs hossza , bár lehet, hogy hamis nyomvonal.

Valójában, ha a kulcs hossza egyenlő -val , akkor a szöveget a műszakból kapjuk , ezért tárolja a -t, a szöveg pedig értelmes szöveg véletlenszerű mintája, ezért meg kell őriznie statisztikai jellemzőit, különösen a meccsindex.

Ha valamelyik nyelv egyezési indexe ismeretlen, akkor a Kasiski-teszt használata is lehetséges. Nem kell összehasonlítani az egybeesési indexek kapott értékeit a standard értékkel, hanem figyelni kell, amikor ez az index meredeken növekszik. Ez a kulcs megtalált hosszát jelezheti. Természetesen értelmes és egyben elég hosszú szövegek megfejtéséről van szó. A formális nyelvek jelentéstartalmának fogalma azonban nem könnyű fogalom.

A Kasiski teszt másik alkalmazása annak ellenőrzése, hogy a titkosítás során talált betűk gyakorisága megmarad-e. Legyen  a rejtjelezett szöveg, és a titkosítási algoritmus ismeretlen. Ha ismert, hogy a normál angol ábécét használták, és az érték közel 0,065, akkor ez arra utal, hogy frekvenciamegőrző titkosítást használtak. Lehetséges, hogy ez egy egyszerű helyettesítő titkosítás. Abban a helyzetben, amikor az érték messze van 0,065-től, feltételezhető, hogy olyan titkosítást használtak, amely nem őrizte meg a gyakoriságot, vagy a szöveg értelmetlen volt, vagy más ábécét használtak stb. Egyszóval kiderült, hogy valami rossz, és mélyebb elemzésre van szükség.

Térjünk vissza a Vigenère-rejtjelhez. Határozzuk meg helyesen a kulcshosszt, amely egyenlő . Most meg kell találnia magát a kulcsot.

Egy nyelv szabványos betűgyakorisága szerint felépített hisztogramnak megvannak a maga megkülönböztető jegyei. Ezek magyarázata az angol nyelv rendkívül egyenetlen betűhasználata. Ez az egyenetlenség éppen lehetővé teszi a frekvenciaelemzés hatékony alkalmazását.

Először is az A, E, H, I, N, O, R, S, T betűknek megfelelő „csúcsok”, valamint a J, Q, X, Z betűknek megfelelő „csonkok” hívják fel a figyelmet. mellette még egy egész trió is van: R, S, T. Mindez együtt egészen konkrét megkönnyebbülést ad.

Ha 4-es eltolást használunk, a kép ciklikusan változik. 4 egységgel ciklikus domborműtolás van. Ha nem ismeri az elmozdulás nagyságát, akkor józan ész által vezérelve nem nehéz visszaállítani.

Forgógépek

A Vigenère-rejtjel javítható, ha tetszőleges helyettesítések kombinációját tekintjük ismétlődő kulcsnak: . Ez azt jelenti, hogy a forrásszöveg mértékegységei egységekre lesznek konvertálva stb.

Egy ilyen rejtjel feltörésekor, mint a Vigenère-rejtjel esetében, először meg kell határozni a kulcs hosszát . Ezt a Kasiski-teszttel ugyanúgy megtehetjük, mint a leírt esetben. Továbbá frekvenciaanalízis alkalmazható a helyettesítések meghatározására.

Frekvenciaelemzés

Ha a kulcs hossza ismert, a rejtjelezett szöveg több oszlopba írható, amelyek mindegyike a kulcs egy karakterének felel meg. Minden oszlop az eredeti szövegből áll, amely Caesar-rejtjellel van titkosítva ; a Caesar-rejtjel kulcsa csak egy karaktere az ebben az oszlopban használt Vigenère-rejtjel kulcsának. A Caesar-rejtjel feltöréséhez hasonló technikák használatával a rejtjelezett szöveg visszafejthető. Kasiska tesztjének egy továbbfejlesztése, amelyet Kirchhoff-módszerként ismernek, és összehasonlítja a karakterek előfordulási gyakoriságát az oszlopokban a karakterek előfordulási gyakoriságával a forrásszövegben, hogy megtalálja az adott oszlop kulcskarakterét. Ha a kulcsban szereplő összes karakter ismert, a kriptoanalizátor könnyen megfejtheti a titkosított szöveget a nyílt szövegből. A Kirchhoff-féle módszer nem alkalmazható, ha a Vigenère-táblázatot a szokásos ábécé sorrend használata helyett kódolják, bár a Kasiska-teszt és az illesztési tesztek továbbra is használhatók a kulcshossz meghatározására ebben az esetben. [13]

Említések az irodalomban

1881-ben Jules Verne megírta a Jangada című regényt . Ebben a regényben a szerző a Vigenère-rejtjelet használta a dokumentum titkosításához. Rejtjelezett szövegként a szerző a következő dokumentumot használja:

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

A történet során a hősök megtalálják ennek az iratnak a megfejtett szó töredékét: ORTEGA A hősök sejtették, hogy ez a név jelentheti a dokumentum végén található aláírást. Így jön ki:

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

Ezért a kulcs 432513. A kulcs ismeretében könnyen lefordíthatja ezt a dokumentumot:

A GYÉMÁNTLOVÁS VALÓDI OKA SGUCHPVELL ZIRTEPND NFGIN BORGYUG ÉS A VÉDELEM Katonáinak meggyilkolása ÉJSZAKÁBAN L CHDKOTKHZHG UUMZDH RЪSGSYu D TPIA RV JANUÁR EZER HUSZONKETEDIKE YGGISCHVCHE ETSSTUZH VSEVHA HYAFBBB NYOLCSZÁZHUSZONHATODIK ETFZSEFTKh ZHZBZЪGFB SCHIKHHRIP ZHTZV NEM JOAM DACOSTA, UNFAIR AT TJ YTGO YBNTFFFE OIKHTEGIIIOKZP TFL HALÁLRA BESZÉLTEM, ÉS ÉN BOLDOGTALAN EUGSFIPTM O FOKSHM G B TJFYGUCHOYUN GYÉMÁNT OSZTÁLY ALKALMAZOTTA FNSHZGALL SCHRUDENKOLG GNSBCSSEU MEGYE; IGEN, EGY VAGYOK, MIBEN ÉS ALÁÍRÁSOKBAN PNFTSEE EG G SZHNO ÉS YIO N RSITKTS HÁBORÚ AZ IGAZI NEVEMBEN, EDBUB TETLO TBFTSSBUYP MPZTZHP ORTEGA TUFKDG

Opciók

Sok más emlékezetes négyzet van, amelyek ugyanúgy használhatók többalfabetikus rendszer alapjául, mint a Vigenère tér. Az egyik leghíresebb a Beaufort tér . Vonalai a Vigenère tér vonalai, fordított sorrendben írva. Nevét Sir Francis Beaufort admirálisról  , a szélsebesség-skálát feltalálóról kapta. Ha a Vigenère-négyzetben az első sor és oszlop rendre sorokra, illetve oszlopokra mutat, akkor a Beaufort-négyzetben az első sor és az utolsó oszlop ezt a célt szolgálja. [tizennégy]

A Vigenère-rejtjel futókulcsos változata egykor feltörhetetlen volt. Ez a verzió az eredeti szöveggel megegyező hosszúságú szövegblokkot használ kulcsként. Mivel a kulcs hossza egyenlő az üzenettel, a Friedman és Kasiski által javasolt módszerek nem működnek (mivel a kulcs nem ismétlődik). 1920-ban Friedman volt az első, aki felfedezte ennek a lehetőségnek a hátrányait. A Vigenère-rejtjel futtató kulcsával az a probléma, hogy a kriptoanalizátor statisztikai információval rendelkezik a kulcsról (feltéve, hogy a szövegblokk ismert nyelven íródott), és ez az információ megjelenik a rejtjelezett szövegben. Ha a kulcs valóban véletlenszerű, hossza megegyezik az üzenet hosszával, és egyszer használták, akkor a Vigenère-rejtjel elméletileg feltörhetetlen lesz, sőt ez az opció már a Vernam-Vigenère titkosítás lesz, amihez abszolút kriptográfiai erőssége bizonyított.

A Vigenère-rejtjel látszólagos erőssége ellenére nem használták széles körben Európában. Elterjedtebb volt a Gronsfeld-rejtjel , amelyet Gronsfeld gróf készített, és megegyezett a Vigenère-rejtjellel, kivéve, hogy csak 10 különböző ábécét használt (a 0-tól 9-ig terjedő számjegyeknek felel meg). A Gronsfeld-rejtjel előnye, hogy nem egy szót használnak kulcsként, hanem egy digitális sorozatot, amelyet addig ismételnek, amíg egyenlővé nem válik a titkosított üzenet hosszával. A Gronsfeld-rejtjelet hiányosságai ellenére széles körben használták Németországban és Európában.

Megvalósítás

JavaScript

A kód //Ezt a kódot kimásolhatja és beillesztheti a böngésző konzoljába. var a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; //Alphabet string var m = "ATTACKATDAWN" ; //Üzenet var k = "LEMON" ; //Kulcs function Vizhener ( m , k , mode ){ //(titkosítás/dekódolás) for "Gronsfeld" + "Vizhener" + "Beaufort" + "Shifted Atbash" //m - üzenet vagy titkosított szöveg (kulcs is lehet, ha a Beaufort titkosítás ), //k - kulcs (vagy üzenet/titkosszöveg, ha Beaufort titkosítás), //mode - mode: // Titkosítás: "titkosítás" (alapértelmezett), // Dekódolás: "decrypt" (mód === 'decrypt' ), // Titkosítás-visszafejtés az eltolt atbash tábla szerint: (mode==='shifted_atbash') // Számjegyek kivonása a Gronsfeld titkosítási kulcsból: "gronsfeld" vagy "gronsfeld_encrypt", "gronsfeld decrypt". var maxlength = Math . max ( m . hossz , k . hossz ); var r = '' ; //Üres eredmény erre: ( i = 0 ; i < maxlength ; i ++ ){ //titkosítás/ decrypt //Vizhener - egy fórum titkosítása/dekódolása (titkosítás - alapértelmezés szerint; decrypt - when (mód === 'decrypt' ) var mi = a . indexOf ( m [ ( ( i >= m . hossz ) ? i % m . hossz : i ) ] ); //üzenet/titkosított szöveg - kulcshoz illesztése (ha kevesebb) var ki_s = k [ ( ( i >= k . hossz ) ? i % k . hossz : i ) ]; //a kulcs illesztése az üzenethez/titkosított szöveghez (ha rövid) var ki = ( typeof mode !== 'undefined' && mode . indexOf ( 'gronsfeld' ) !== - 1 ) ? parseInt ( ki_s ) : a . indexOf ( ki_s ); //kivonás a dekódolás során, vagy összeadás. ki = ( ( typeof mode !== 'undefined' && mode . indexOf ( 'decrypt' ) !== - 1 ) ? ( - ki ) : ki ); c = a [ ( ( ( a . hossz + ( mi + ki ) ) % a . hossz ) ) ]; //szimbólum a Vigenère táblázat szerint. c = ( mód === 'shifted_atbash' ) ? a [ a . hossza - 1 - a . indexOf ( c )] : c ; // Atbash karakter vagy karakter. r += c ; //Karakter hozzáadása az eredményhez. } return r ; //return result string } //Tesztek: //egy. Gronsfeld titkosítás. (A Vigenère-rejtjel csonka változata). //Paraméterek: m - üzenet/titkosított szöveg, k - kulcs (csak számjegyek), mód - "titkosítás/visszafejtés" konzol . log ( '\n\n1. Gronsfeld-rejtjel (A Vigenère-rejtjel kivágott változata digitális kulccsal):' , '\n' + 'm =' , 'GRONSFELD' , ' - üzenet' , '\n' + 'k = ' , '2015' , '- kulcs' , '\n' + ' Gronsfeld rejtjel - titkosítás: ' , Vizhener ( 'GRONSFELD' , '2015' , 'gronsfeld' ) //előállítja a Grons' IRPSUFFQF - feld rejtjelét ' + 'Gronsfeld titkosítás - decrypt: ' , Vizhener ( Vizhener ( 'GRONSFELD' , '2015' , 'gronsfeld' ), '2015' , 'gronsfeld decrypt' ) //GRONSFELD - et fog előállítani - a Grons \ feld titkosításból n' + 'Összehasonlítás a következővel: ' , "( visszafejtve === m )" , ( Vizhener ( Vizhener ( 'GRONSFELD' , '2015' , 'gronsfeld' ), '2015' , 'gronsfeld_decrypt' ) === ' GRONSFELD' ) // m?true ); //2. Ezenkívül a Gronsfeld-rejtjelben számok helyett betűket is jelezhetünk. //Ezután a Gronsfeld-rejtjel normál Vigenère-rejtjel lesz, de kulcsonkénti karakterkorláttal. //Például a "0123456789" kulcs összes lehetséges számjegyével a kulcs csak az "ABCDEFGHIJ" betűkből származhat //Ezt így kaphatja meg: var Gronsfeld_key = '2015' ; var Vizhener_key = Gronsfeld_key . felosztás ( '' ). map ( függvény ( x ){ return a [ parseInt ( x )]}). csatlakozás ( '' ); //CABF //És fordítva: var Gronsfeld_key2 = Vizhener_key . felosztás ( '' ). map ( függvény ( x ){ return a . indexOf ( x )}). csatlakozás ( '' ); //2015 //Itt vannak, a konzolban: konzol . log ( '\n2. Gronsfeld kulcs konvertálása Vizhener kulcsra:' , '\nGronsfeld_key' , Gronsfeld_key , '\n' + 'Vizhener_key' , Vizhener_key , '\n' + 'és vissza:' , Gronsfeld_key2 ); //3. Ezután a Gronsfeld-rejtjel titkosítása-fejtése a Vigenère-rejtjellel végzett munka: konzol . log ( "\n3. Gronsfeld titkosítás - Vigenère kulccsal, Vizhener táblázat szerint:" , '\n' + 'm = ' , 'GRONSFELD' , ' - üzenet' , '\n' + 'k = ' , Vizhener_key , '- kulcs' , '\n' + 'Gronsfeld rejtjel - titkosítás: ' , Vizhener ( 'GRONSFELD' , Vizhener_key ) //előállítja az IRPSUFFQF - Beaufort titkosítást , '\n' + 'Gronsfeld rejtjel: ' - dekódolás Vizhener ( 'GRONSFELD' , Vizhener_key ), Vizhener_key , 'decrypt' ) //GRONSFELD-t ad - Beaufort-rejtjelből. , '\n' + 'Összehasonlítás az üzenettel: ' , "( visszafejtve === m )" , ( Vizhener ( Vizhener ( 'GRONSFELD' , Vizhener_key ), Vizhener_key , 'decrypt' ) === 'GRONSFELD' ) //'GRONSFELD'? true ); //négy. Vigenère titkosítás (teljes verzió): //Paraméterek: m - üzenet/titkosított szöveg, k - kulcs, mód - "titkosítás"/"dekódolás" konzol . log ( '\n4. Vigenère titkosítás (teljes verzió):' , '\n' + 'm = ' , m , ' - üzenet' , '\n' + 'k = ' , k , '- kulcs' , ' \n' + 'Vigenère titkosítás - titkosítás: ' , Vizhener ( m , k ) //LXFOPVEFRNHR - Vigenère titkosítást készít , '\n' + 'Vigenère titkosítás - dekódolás: ' , Vizhener ( Vizhener ( m , k ), k , 'decrypt' ) //adja az ATTACKATDAWN - from Vizhener titkosítás , '\n' + 'Összehasonlítás az üzenettel: ' , "( visszafejtve === m )" , ( Vizhener ( Vizhener ( m , k , 'titkosítás' ), k , 'dekódolás' ) === m ) //m?true ); //5. A Beaufort-rejtjel - a Vigenère-rejtjelen keresztül (van egy másik táblázat és rejtjelezett szöveg is - a vonalak mentén eltolva atbash). //Paraméterek: m - kulcs, k - üzenet/titkosított szöveg, mód - 'decrypt' (csak dekódolás) //A Beaufort-rejtjel sajátossága, hogy a dekódolás a rejtjelezett szöveg újratitkosítása - ugyanazzal a kulccsal. //Azaz ugyanaz a művelet. konzol . log ( "\n5. Beaufort titkosítás (a táblázatban - atbash soronként):" , '\n' + 'm = ' , m , ' - üzenet' , '\n' + 'k = ' , k , '- kulcs' , '\n' + 'Beaufort titkosítás - Vigenère tábla titkosítása: ' , Vizhener ( k , m , 'decrypt' ) //előállítja az LLTOLBETLNPR - Beaufort titkosítást , '\n' + 'Beaufort titkosítás - Vigenère tábla dekódolása :' , Vizhener ( k , Vizhener ( k , m , 'decrypt' ), 'decrypt' ) //adja ATTACKATDAWN - Beaufort titkosításból. , '\n' + 'Összehasonlítás az üzenettel: ' , "( visszafejtve === m )" , ( Vizhener ( k , Vizhener ( k , m , 'visszafejteni' ), 'visszafejteni' ) === m ) //m? igaz ); 6. Az atbash eltolása - a Vigenère titkosításon keresztül (van egy másik táblázat és rejtjelezett szöveg is - atbash, sorokban eltolva oszlopokban). //Paraméterek: m vagy k - üzenet/titkosított szöveg és kulcs (vagy fordítva), mód - 'shifted_atbash' (csak titkosítás + atbash az eredményhez) //Nem csak ugyanaz a művelet (dekódolás - van a titkosított szöveg titkosítása ), de ez is kommutatív. //Azaz itt az n-edik betű (az üzenet/titkosszöveg) és a kulcs - felcserélhető, ugyanazt az eredményt adva. //Éppen ez, a shifted atbash - közelíti meg a Vernam-rejtjelet, //mert a Vernam-rejtjellel való visszafejtésnél az XOR műveletnek nem mindegy, hogy hol vannak a kulcsbájtok és hol vannak a rejtjelezett szövegbájtok. konzol . log ( "\n6. Eltolódott az atbash (az atbash táblában, sorok és oszlopok is eltolva):" , '\n' + 'm = ' , m , ' - message' , '\n' + 'k = ' , k , '- kulcs' , '\n' + 'Shifted atbash - Vigener tábla titkosítása: ' , Vizhener ( m , k , 'shifted_atbash' ) //OCULKEVUIMSI - shifted atbash titkosítást ad. , ' Csere kommutativitás teszt: ener ' ( k , m , ' shifted_atbash' ) // Ugyanaz, függetlenül attól, hogy hol van a kulcs és hol van az üzenet. , ' \n' + ' Shifted atbash - visszafejtés a Vizhener táblával : / _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /Ugyanaz, mindegy, hogy hol van a kulcs, de hol van a titkosított szöveg. , '\n' + 'Összehasonlítás az üzenettel:' , "( visszafejtve === 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' ) ) ) //Kommutativitás? igaz );

Delphi 10

A kód program Vigenere ; rendszert használja . SysUtils , Winapi . Windows ; const cmGronsfeld : Byte = 1 ; cmShiftedAtbash : Byte = 2 ; cmDecrypt : Byte = 4 ; YesNo : array [ Boolean ] of string = ( 'nem' , 'igen' ) ; var log : TStringBuilder ; függvény VigenereCrypt ( m , k : string ; mód : Byte = 0 ) : string ; const a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; //ábécé karakterlánca var maxLength , i , mi , ki , ix : Integer ; r , ki_s , c : string ; gronsfeld , shiftedAtbash , dekódolás : Boolean ; begin //(titkosítás/dekódolás) for "Gronsfeld" + "Vigenere" + "Beaufort" + "Shifted Atbash" //m - üzenet vagy rejtjelezett szöveg (kulcs lehet, ha Beaufort titkosítás), //k - kulcs (vagy üzenet/ titkosított szöveg, ha Beaufort titkosítás), //mode - mode: // Titkosítás: "titkosítás" (alapértelmezett), // Decrypt: "decrypt" (mode === 'decrypt'), // Titkosítás-visszafejtés eltolt atbash táblával: (mode = cmShiftedAtbash) // Számjegyek kivonása a Gronsfeld-rejtjelkulcsból: "gronsfeld" vagy "gronsfeld_encrypt", "gronsfeld decrypt". maxHossz := m . Hosszúság ; ha k . Hossz > maxLength majd maxLength := k . Hosszúság ; Eredmény := '' ; //Üres eredmény gronsfeld := ( mód és cmGronsfeld ) > 0 ; shiftedAtbash := ( mód és cmShiftedAtbash ) > 0 ; decrypt := ( mód és cmDecrypt ) > 0 ; for i := 0 to maxlength - 1 do begin //titkosítás/dekódolás //Vigenere - egy forumula titkosítása/dekódolása (titkosítás - alapértelmezés szerint; dekódolás - amikor (a cmDecrypt módban van) ) //üzenet/titkosszöveg illesztése - a kulcshoz (ha kevesebb) ha i >= m . hossz akkor ix := i mod m . Hossz else ix := i ; mi := a . IndexOf ( m [ ix + 1 ]) ; ha i >= k . hossz akkor ix := i mod k . Hossz else ix := i ; ki_s := k [ ix + 1 ] ; //illessze be a kulcsot az üzenetbe/rejtjelezett szövegbe (ha rövid) if gronsfeld then ki := ki_s . ToInteger () else ki := a . IndexOf ( ki_s ) ; //kivonás a dekódolás során, vagy összeadás. ha decrypt then ki := ki * - 1 ; c := a [(( a . Length + mi + ki ) mod a . Length ) + 1 ] ; //szimbólum a Vigenère táblázat szerint. if shiftedAtbash then c := a [ a . hossza - a . IndexOf ( c )] ; // Atbash karakter vagy karakter. Eredmény := Eredmény + c ; //Karakter hozzáadása az eredményhez. vége ; vége ; függvény GronsfeldToVigenere ( GfKey : string ) : string ; const a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; //ábécé karakterlánca var i : Integer ; kezdődik Eredmény := '' ; for i := 1 to Length ( GfKey ) do Eredmény := Eredmény + a [ StrToInt ( GfKey [ i ] ) + 1 ] ; vége ; function VigenereToGronsfeld ( VgKey : string ) : string ; const a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; //ábécé karakterlánca var i : Integer ; kezdődik Eredmény := '' ; for i := 1 to Length ( VgKey ) do Result := Result + IntToStr ( a . indexOf ( VgKey [ i ])) ; //2015 vége ; eljárás GronsfeldTest () ; const MSG = 'GRONSFELD' ; KULCS = '2015' ; TXT = '1. Gronsfeld rejtjel (a Vigenère titkosítás csíkozott változata digitális kulccsal):' #13#10 + 'Üzenet:' #9 '"%s"' #13#10 + "Kulcs:' #9#9 '"%s"' # 13#10 + 'Titkosítás:' #9 '"%s" ("IRPSUFFQF" legyen)' #13#10 + 'Dekódolás:' #9 '"%s" ("%s")' # 13 #10 + 'Match:' #9 '%s' #13#10 ; var crypted , decrypted : string ; kezdés //1. Gronsfeld titkosítás. (A Vigenère-rejtjel csonka változata). //Paraméterek: m - üzenet/titkosított szöveg, k - kulcs (csak számok), mód - "titkosítás/visszafejtés" crypted := VigenereCrypt ( MSG , KEY , cmGronsfeld ) ; //ad IRPSUFFQF - Gronsfeld titkosítás decrypted := VigenereCrypt ( titkosítva , KEY , cmGronsfeld vagy cmDecrypt ) ; //GRONSFELD-et ad - a gronsfeldi titkosításból log . AppendFormat ( TXT , [ MSG , KEY , titkosítva , visszafejtve , MSG , YesNo [ decrypted = MSG ]] ) ; vége ; eljárás VigenereToGronsfeldTest () ; const GKEY = '2015' ; TXT = #13# 10'2. Gronsfeld kulcs konvertálása Vigenère kulcsra:' #13#10 + 'Gronsfeld kulcs: "%s" >>> Vigenère kulcs: "%s" és vissza: "%s"' #13#10 ; var GronsfeldKey2 : string ; VigenereKey : string _ kezdődik //2. Ezenkívül a Gronsfeld-rejtjelben számok helyett betűket is jelezhetünk. //Ezután a Gronsfeld-rejtjel normál Vigenère-rejtjel lesz, de kulcsonkénti karakterkorláttal. //Például a "0123456789" kulcs minden lehetséges számjegyével a kulcs csak az "ABCDEFGHIJ" betűkből származhat //Ezt így kaphatja meg: VigenereKey := GronsfeldToVigenere ( GKEY ) ; //CABF //És fordítva: GronsfeldKey2 := VigenereToGronsfeld ( VigenereKey ) ; //2015 log . AppendFormat ( TXT , [ GKEY , VigenereKey , GronsfeldKey2 ]) ; vége ; eljárás GronsfeldAsVigenereTest () ; const MSG = 'GRONSFELD' ; KEY = 'CABF' ; TXT = #13# 10'3. Gronsfeld titkosítás - Vigenère kulccsal, Vigenère táblázat szerint:' #13#10 + 'Üzenet:' #9 '"%s"' #13#10 + 'Kulcs:' #9#9 '"%s"' # 13 #10 + 'Titkosítás:' #9 '"%s" ("IRPSUFFQF" legyen)' #13#10 + 'Dekódolás:' #9 '"%s" ("%s")' #13 # 10 + 'Match:' #9 '%s' #13#10 ; var crypted , decrypted : string ; kezdődik //3. Ekkor a Gronsfeld-rejtjel titkosítása-fejtése a Vigenère-rejtjellel végzett munka: crypted := VigenereCrypt ( MSG , KEY ) ; //ad IRPSUFFQF - Beaufort titkosítás decrypted := VigenereCrypt ( titkosítva , KEY , cmDecrypt ) ; //adja GRONSFELD - a Beaufort-rejtjelből. log . AppendFormat ( TXT , [ MSG , KEY , titkosítva , visszafejtve , MSG , YesNo [ decrypted = MSG ]] ) ; vége ; eljárás VigenereFullTest () ; const MSG = 'ATTACKATDAWN' ; //Üzenet KEY = 'CITROL' ; // TXT kulcs = #13#10 '4. Vigenère titkosítás (teljes verzió):' #13#10 + 'Üzenet:' #9 '"%s"' #13#10 + "Kulcs:' #9#9 '"%s"' #13#10 + ' Titkosítás:' #9 '"%s" ("LXFOPVEFRNHR" legyen)' #13#10 + 'Dekódolás:' #9 '"%s" ("%s" legyen)' #13#10 + 'Egyezés :' #9 '%s' #13#10 ; var crypted , decrypted : string ; kezdődik //4. Vigenère titkosítás (teljes verzió): //Paraméterek: m - üzenet/titkosított szöveg, k - kulcs, mód - "titkosítás"/"dekódolás" crypted := VigenereCrypt ( MSG , KEY ) ; //adja LXFOPVEFRNHR - Vigenere titkosítás decrypted := VigenereCrypt ( titkosítva , KEY , cmDecrypt ) ; //ATTACKATDAWN-t ad - a Vigenère-rejtjelből log . AppendFormat ( TXT , [ MSG , KEY , titkosítva , visszafejtve , MSG , YesNo [ decrypted = MSG ]] ) ; vége ; eljárás BeaufortTest () ; const MSG = 'ATTACKATDAWN' ; //Üzenet KEY = 'CITROL' ; // TXT kulcs = #13#10 '5. Beaufort titkosítás (a táblázatban - atbash soronként):' #13#10 + 'Üzenet:' #9 '"%s"' #13#10 + 'Kulcs:' #9#9 '"%s"' #13 #10 + 'Beaufort's Vigenère titkosítás:' #13#10 + 'Titkosítás:' #9 '"%s" ("LLTOLBETLNPR" legyen)' #13#10 + "Dekódolás:' #9 '"%s " ("%s" legyen)' #13#10 + 'Egyezés:' #9 '%s' #13#10 ; var crypted , decrypted : string ; kezdődik //5. A Beaufort-rejtjel - a Vigenère-rejtjelen keresztül (van egy másik táblázat és rejtjelezett szöveg is - a vonalak mentén eltolva atbash). //Paraméterek: m - kulcs, k - üzenet/titkosított szöveg, mód - 'decrypt' (csak dekódolás) //A Beaufort-rejtjel sajátossága, hogy a dekódolás a rejtjelezett szöveg újratitkosítása - ugyanazzal a kulccsal. //Azaz ugyanaz a művelet. titkosítva := VigenereCrypt ( KEY , MSG , cmDecrypt ) ; //adja LLTOLBETLNPR - Beaufort titkosítás decrypted := VigenereCrypt ( KEY , crypted , cmDecrypt ) ; //ATTACKATDAWN-t ad - a Beaufort-rejtjelből. log . AppendFormat ( TXT , [ MSG , KEY , titkosítva , visszafejtve , MSG , YesNo [ decrypted = MSG ]] ) ; vége ; eljárás ShiftedAtbashTest () ; const MSG = 'ATTACKATDAWN' ; //Üzenet KEY = 'CITROL' ; // TXT kulcs = #13#10 '6. Az atbash eltolása (az atbash táblában, sorok és oszlopok is eltolva):' #13#10 + 'Üzenet:' #9 '"%s"' #13#10 + "Kulcs:' #9#9 '"% s "' #13#10 + "Shifted atbash - Vigenère tábla titkosítása:' #9 '"%s" ("OCULKEVUIMSI" legyen)' #13#10 + 'Csere kommutativitás teszt:' #9 '"%s" ( "OCULKEVUIMSI" legyen)' #13#10 + 'Shifted atbash - Vigenère dekódolás:' #9 '"%s" ("ATTACKATDAWN" legyen)' #13#10 + 'Csere kommutativitás teszt:' #9 '" %s"' #13#10 + 'Összehasonlítás az üzenettel:' #9 '%s' #13#10 + 'Csere kommutativitása:' #9 '%s' ; var csaMK , csaKM , csaKMK , csaKKM : string ; kezdődik //6. Az atbash eltolása - a Vigenère titkosításon keresztül (van egy másik táblázat és rejtjelezett szöveg is - atbash, sorokban eltolva oszlopokban). //Paraméterek: m vagy k - üzenet/titkosított szöveg és kulcs (vagy fordítva), mód - cmShiftedAtbash (csak titkosítás + atbash az eredményhez) //Nem csak ugyanaz a művelet (dekódolás - van a titkosított szöveg titkosítása), de to Sőt, kommutatív is. //Azaz itt az n-edik betű (az üzenet/titkosszöveg) és a kulcs - felcserélhető, ugyanazt az eredményt adva. //Éppen ez, a shifted atbash - közelíti meg a Vernam-rejtjelet, //mert a Vernam-rejtjellel való visszafejtésnél az XOR műveletnek nem mindegy, hogy hol vannak a kulcsbájtok és hol vannak a rejtjelezett szövegbájtok. csaMK := VigenereCrypt ( MSG , KEY , cmShiftedAtbash ) ; //adja OCULKEVUIMSI - shifted atbash cipher. csaKM := VigenereCrypt ( KEY , MSG , cmShiftedAtbash ) ; //Ugyanez, nem az számít, hogy hol van a kulcs, hanem az, hogy hol van az üzenet. csaKMK := VigenereCrypt ( csaKM , KEY , cmShiftedAtbash ) ; //ATTACKATDAWN-t ad - az eltolt atbash titkosításból. csaKKM := VigenereCrypt ( KEY , csaKM , cmShiftedAtbash ) ; //Ugyanez, nem az számít, hogy hol van a kulcs, hanem az, hogy hol a rejtjelezett szöveg. log . AppendFormat ( TXT , [ MSG , KEY , csaMK , csaKM , csaKMK , csaKKM , IgenNem [ csaKKM = MSG ] , IgenNem [( csaMK = csaKM ) és ( csaKMK = csaKKM )]]) ; vége ; start log := TStringBuilder . létrehozni () ; try //Tesztek: GronsfeldTest () ; VigenereToGronsfeldTest () ; GronsfeldAsVigenereTest () ; VigenereFullTest () ; BeaufortTest () ; ShiftedAtbashTest () ; MessageBoxW ( GetDesktopWindow () , PWideChar ( log . ToString ()) , 'Vigenère' , 0 ) ; végre log . ingyenes () ; vége ; vége .

Ruby

A kód class Crypto class CryptoError < StandardError ; önmaga ; vége attr_reader :ábécé # egyedi karakterek tetszőleges tömbjét fogadja el, lehet egy vagy több nyelv, alapértelmezett latin kisbetűk def inicializálják ( alfabet = ( 'A' .. 'Z' ) . to_a ) @alphabet = ábécé 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 ) . injekció ( "" ) do | r , betű_index | encode_letter_index = ( betűindex + key_arr [ char_number_at_text % key_arr . size ] ) % ábécé . méret char_number_at_text += 1 r + ábécé [ encode_letter_index ] end end # m{j}=(c{j} + n - k{j}) mod {n} def dekód ( kulcs_str , szöveg_srt ) key_arr = str_to_alphabet_index_arr ( key_str ) char_number_at_text = 0 str_to_alphabet_index_arr ( text_srt ) . injekció ( "" ) do | r , betű_index | decode_letter_index = ( betűindex + ábécé . méret - kulcs_arr [ char_number_at_text % key_arr . size ] ) % ábécé . méret char_number_at_text += 1 r + ábécé [ decode_letter_index ] end end magán def str_to_alphabet_index_arr ( str ) str . karakterek . térkép do | char | index = ábécé . index ( char ) ha az index index else raise CryptoError , "betűk legyenek ábécé" végén end end def check_alphabet raise CryptoError , "az ábécé legyen tömb", kivéve , ha alfabet . egy? ( Array ) emelje ki a CryptoError értéket , a 'betűk legyenek karakterláncok' , ha ábécé . Bármi? { | betűk | ! levelet . egy? ( String ) } raise CryptoError , 'az ábécének legalább egy betűt kell tartalmaznia' , ha ábécé . méret < 1 emelje ki a CryptoError -t , a "betűknek egyedinek kell lenniük" , ha ábécé . egyedi . méret != ábécé . méret növelése CryptoError , "a betű ne legyen üres" , ha ábécé . Bármi? ( & :empty? ) emelje ki a CryptoError -t , 'a betűknek csak egy karaktert kell tartalmazniuk' , ha ábécé . Bármi? { | betűk | levelet . méret != 1 } vég vége # példák crypto = Crypto . új kripto . encode ( 'LEMON' , 'ATTACKATDAWN' ) # "LXFOPVEFRNHR" titkosítás . dekódolás ( 'LEMON' , 'LXFOPVEFRNHR' ) # "ATTACKATDAWN" kriptográfia . encode ( 'LEMON' , 'támadás' ) # Crypto::CryptoError: a betűknek ábécé szerint kell lenniük eng_crypto = Kripto . new (( 'A' .. 'I' ) . to_a ) rus_crypto . kódol ( 'KVAS' , 'MAMAMYLARAMU' ) # "TSVMSTSELSЪVMD" rus_crypto . dekódolás ( 'KVAS' , ' TSVMTSELSЪVMD' ) # "MAMAMYLARAMU"

Jegyzetek

  1. ↑ Martin , Keith M. Mindennapi kriptográfia  . — Oxford University Press, 2012. — p. 142 p. — ISBN 978-0-19-162588-6 .
  2. Diszkrét matematika: Algoritmusok. Történelmi vázlat (elérhetetlen link) . rain.ifmo.ru Letöltve: 2017. december 22. Az eredetiből archiválva : 2017. december 21.. 
  3. Szergej és Marina Bondarenko . Rejtjelek a múltból: kriptográfia és a számítógép előtti kor rejtelmei  (orosz) , 3DNews - Daily Digital Digest  (2015. július 8.). Letöltve: 2017. december 22.
  4. ↑ 1 2 3 4 5 6 7 Babash A.V., Shankin G.P. A kriptográfia története. I. rész . - M .: Helios ARV, 2002. - S. 240 p .. - ISBN 5854380439 .
  5. Smith, Laurence D. Helyettesítő titkosítások // Titkosírás a titkos írás tudománya: A titkos  írás tudománya . - Dover Publications , 1943. - P. 81. - ISBN 0-486-20247-X .
  6. ↑ 1 2 Nosov V. A. A kriptográfia fejlődésének rövid történelmi vázlata  (orosz)  // Moszkvai Egyetem és a titkosírás fejlődése Oroszországban. A Moszkvai Állami Egyetemen megtartott konferencia anyagai .. - (2002. október 17.).
  7. ↑ 1 2 3 David, Kahn. A kódtörők: A titkos írás története. - Simon & Schuster, 1999. - ISBN 0-684-83130-9 .
  8. Knudsen, Lars R. Block Ciphers – felmérés. - London: Springer, 1997. - ISBN 3-540-65474-7 .
  9. Stanislaw Jarecki. Crypto Overview, Perfect Secrecy, One-time Pad  // University of California. – 2004.
  10. Richard A. Mollin. Kódok: Útmutató a titoktartáshoz az ókortól a modern időkig. - Chapman és Hall/CRC, 2005. - 704 oldal p. — ISBN 9781584884705 .
  11. Zselnikov V. Kriptográfia a papirusztól a számítógépig - M .: ABF , 1996. - 336 p. — ISBN 978-5-87484-054-9
  12. Singh S. A kódkönyv: A titoktartás tudománya az ókori Egyiptomtól a kvantumkriptográfiáig. - New York City: Doubleday, 1999. - 416 p. Val vel. - ISBN 978-1-85702-879-9 .
  13. Laboratóriumi gyakorlat: Vigenere, RSA, DES és hitelesítési protokollok  // CS 415: Computer and Network Security. - 2006. Archiválva : 2011. július 23.
  14. Arto Salomaa. Nyilvános kulcsú kriptográfia. — ISBN 3540528318 .

Irodalom

  • Romankov V.A. Bevezetés a kriptográfiába: előadások, 2009. - 238 p. — ISBN 5777909825 .
  • Babash A. V., Shankin G. P. A kriptográfia története. I. rész - M .: Helios ARV, 2002. - 240 p. — ISBN 5854380439 .
  • Zhelnikov V. Kriptográfia a papirusztól a számítógépig - M .: ABF , 1996. - 336 p. — ISBN 978-5-87484-054-9
  • Arto Salomaa. Nyilvános kulcsú kriptográfia. — ISBN 3540528318 .
  • N. Okos. Kriptográfia .. - Moszkva: Technosfera, 2005. - 528 p. - ISBN 5-94836-043-1 .
  • Singh S. The Code Book , Histoire des codes secrets  (angolul) : A titoktartás tudománya az ókori Egyiptomtól a kvantumkriptográfiáig, De l'Égypte des pharaons à l'ordinateur quantique - NYC : Doubleday , Knopf Doubleday Publishing Group9, —19 . 416 p.
  • Richard A. Mollin. Kódok: Útmutató a titoktartáshoz az ókortól a modern időkig. - Chapman és Hall/CRC, 2005. - 704 oldal p. — ISBN 9781584884705 .
  • Martin, Keith M. Mindennapi kriptográfia. - Oxford University Press, 2012. - 142 p. — ISBN 978-0-19-162588-6
  • Knudsen, Lars R. Block Ciphers – felmérés. - London: Springer, 1997. - ISBN 3-540-65474-7 .
  • Henk Ca van Tilborg. Encyclopedia of Cryptography and Security. - Springer, 2005. - 115 p. — ISBN 038723473X .
  • Arto Salomaa. Nyilvános kulcsú kriptográfia. — ISBN 3540528318 .

Linkek