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ó:
![n](https://wikimedia.org/api/rest_v1/media/math/render/svg/a601995d55609f2d9f5e233e36fbe9ea26011b3b)
![{\displaystyle m_{j))](https://wikimedia.org/api/rest_v1/media/math/render/svg/14f2b12b1676ba2f42ad8d2c9ee6aa46e7667b73)
![{\displaystyle k_{j))](https://wikimedia.org/api/rest_v1/media/math/render/svg/05ddf2c6d7759ac955e001a7cfafb2abfca41b0b)
É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
![{\displaystyle {12,0,17,24,18,1,8,17,19,7,3,0,24}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3cc64a3fbc202a17408f660af5e690f88c9b3fe8)
![{\displaystyle {8,0,12,6,14,8,13,6}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/84c963c8e6ff7faf2ac2bc9d4cb7d49b813cb692)
![{\displaystyle {20,0,3,4,6,9,21,23}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8ef84e6fec5ddc06e02f1738dae0c1eef476d558)
↔ 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: .
![{\megjelenítési stílus {0,18,12,14,10,4,14,5,12,14,19,7,4,17,11,0,13,3,8,18,18,22,4, 4,19,5,14,17,20,18,0,13,3,15,11,4,0,18,0,13,19}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e1e2518c7a0f521e87f16ed2809564606aec8dd3)
A titkosítást a gamma mod26 biztosítja:
- Pt:
![{\megjelenítési stílus {0,18,12,14,10,4,14,5,12,14,19,7,4,17,11,0,13,3,8,18,))](https://wikimedia.org/api/rest_v1/media/math/render/svg/58378cb2f0772a6b00f5e3e6c2d6018face782d4)
- kulcs:
![{\megjelenítési stílus {17,9,3,8,17,9,3,8,17,9,3,8,17,9,3,8,17,9,3,8,))](https://wikimedia.org/api/rest_v1/media/math/render/svg/8ffc709183364d8ca904338136f3c571db567403)
- Ct:
![{\megjelenítési stílus {17,1,15,22,1,13,17,13,3,23,22,15,21,0,14,8,4,12,11,0,))](https://wikimedia.org/api/rest_v1/media/math/render/svg/abf6936d88f806cd3a32219c9151f879f3c00f8b)
- Pt:
![{\megjelenítési stílus {18,22,4,4,19,5,14,17,20,18,0,13,3,15,11,4,0,18,0,13,19,))](https://wikimedia.org/api/rest_v1/media/math/render/svg/d4e323c50cda680fe3c40243ad203fd6c5747560)
- kulcs:
![{\megjelenítési stílus {17,9,3,8,17,9,3,8,17,9,3,8,17,9,3,8,17,9,3,8,17,))](https://wikimedia.org/api/rest_v1/media/math/render/svg/4f71b1aad410e60f796aa6d96e1c715f021d2549)
- Ct:
![{\displaystyle {9,5,7,12,10,14,17,25,11,1,3,21,20,24,14,12,17,1,3,21,10.))](https://wikimedia.org/api/rest_v1/media/math/render/svg/4af7f56322c4cfc56e2fe664366ef17d078fdf87)
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:
- 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. .
- 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
![{\displaystyle {(ci)))](https://wikimedia.org/api/rest_v1/media/math/render/svg/71c084c6ddc2b964ce9175779e9c60c63d14344e)
![{m}](https://wikimedia.org/api/rest_v1/media/math/render/svg/989d8ed6300d470470571f438bbe51f0693fb7b2)
![{n}](https://wikimedia.org/api/rest_v1/media/math/render/svg/70b6881107a598c20a60e72fe82bc41a4a1f7f4c)
![{\displaystyle {l=|m|}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b9a73c7e3dfe14f36a7137dc54fb44cdc2fb2186)
![{\megjelenítési stílus {l_{i))}](https://wikimedia.org/api/rest_v1/media/math/render/svg/531ddc20c327469085d57219606fbb82b70ad835)
![{\megjelenítési stílus {i))](https://wikimedia.org/api/rest_v1/media/math/render/svg/a51a9f4406a3037984ff353c247eb5731fc36cd9)
![{m}](https://wikimedia.org/api/rest_v1/media/math/render/svg/989d8ed6300d470470571f438bbe51f0693fb7b2)
![{m}](https://wikimedia.org/api/rest_v1/media/math/render/svg/989d8ed6300d470470571f438bbe51f0693fb7b2)
.
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 .
![{\displaystyle m=m_{1}m_{2}m_{3}\ldots }](https://wikimedia.org/api/rest_v1/media/math/render/svg/d17e06c72e82d1d845112f5f5fdbbaa33c5d40de)
![m_i](https://wikimedia.org/api/rest_v1/media/math/render/svg/95ec8e804f69706d3f5ad235f4f983220c8df7c2)
![én](https://wikimedia.org/api/rest_v1/media/math/render/svg/add78d8608ad86e54951b8c8bd6c8d8416533d20)
![{\displaystyle c=c_{1}c_{2}c_{3}\ldots }](https://wikimedia.org/api/rest_v1/media/math/render/svg/f3d23a13984b5aa97c2c2060e8f6b7879a4b1c74)
![{\displaystyle |k|=1}](https://wikimedia.org/api/rest_v1/media/math/render/svg/58828d64566d51ea357f6460d68cdeab4f3f22c0)
![{\displaystyle ci(m)=ci(c)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d4f4b7ead187cc558da81a5ba8bc2e1e15287535)
![m](https://wikimedia.org/api/rest_v1/media/math/render/svg/0a07d98bb302f3856cbabc47b2b9016692e3f7bc)
![{\displaystyle ci(c)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/084dbd3ae1ec1919ff4a8bceff353900dc335b70)
![{\displaystyle ci}](https://wikimedia.org/api/rest_v1/media/math/render/svg/285b3c1b304888e3b854c931849ecf541aa9a0cb)
![{\displaystyle ci(c)\simeq 0,065}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1c96851f9397504ce91334e0da107af9be02e92f)
![{\displaystyle ci(c_{1}c_{2}c_{3}\ldots )=d_{1))](https://wikimedia.org/api/rest_v1/media/math/render/svg/9b79c99b7fbc83d5a8bdcbf68f489fe959944e99)
![{\displaystyle ci(c_{1}c_{3}c_{5}\ldots )=d_{2},}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c0f0a84579ed11fea68f9a3e95f44b71ecf812d8)
![{\displaystyle ci(c_{1}c_{4}c_{7}\ldots )=d_{3},}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e2a26f0c2eb2e93ef5dc0035d6b6c3c6677768e4)
![\ldots ,](https://wikimedia.org/api/rest_v1/media/math/render/svg/a3dbfc5796975effdfc4a5e30c7b0ce9e80e0d5f)
![{\displaystyle ci(c_{1}c_{1+t}c_{1+2t}\ldots )=d_{t},}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b51ca114f388830e6f569a0b98e47c60abe8ede5)
![\ldots](https://wikimedia.org/api/rest_v1/media/math/render/svg/3b8619532e44ee1ccae3ab03405a6885260d09ed)
![{\displaystyle d_{t}\simeq 0,065}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ab303d33f566beece0da983075d5d3951c806322)
Ez azt jelezheti, hogy a kulcs hossza , bár lehet, hogy hamis nyomvonal.
![t](https://wikimedia.org/api/rest_v1/media/math/render/svg/65658b7b223af9e1acc877d848888ecdb4466560)
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.
![t](https://wikimedia.org/api/rest_v1/media/math/render/svg/65658b7b223af9e1acc877d848888ecdb4466560)
![{\displaystyle c_{1}c_{1+t}c_{1+2t}\ldots }](https://wikimedia.org/api/rest_v1/media/math/render/svg/a6b2b0c1912c46295fd4ba0e70550a539a2ea120)
![{\displaystyle m_{1}m_{1+t}m_{1+2t}\ldots }](https://wikimedia.org/api/rest_v1/media/math/render/svg/cda45be452591bd05e26f3a5c67802729af8c6c3)
![{\displaystyle ci(m_{1}m_{1+t}m_{1+2t}\ldots )}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6f1192fad118c8bf80b2de88e1a234635b216590)
![{\displaystyle m_{1}m_{1+t}m_{1+2t}\ldots }](https://wikimedia.org/api/rest_v1/media/math/render/svg/cda45be452591bd05e26f3a5c67802729af8c6c3)
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.
![c](https://wikimedia.org/api/rest_v1/media/math/render/svg/86a67b81c2de995bd608d5b2df50cd8cd7d92455)
![{\displaystyle ci(c)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/084dbd3ae1ec1919ff4a8bceff353900dc335b70)
![{\displaystyle ci(c)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/084dbd3ae1ec1919ff4a8bceff353900dc335b70)
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.
![t](https://wikimedia.org/api/rest_v1/media/math/render/svg/65658b7b223af9e1acc877d848888ecdb4466560)
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.
![{\displaystyle \sigma _{1},\sigma _{2},\ldots ,\sigma _{t))](https://wikimedia.org/api/rest_v1/media/math/render/svg/ee630a7840dbc4c93daea39f63a21d8201c46236)
![{\displaystyle m_{1}m_{1+t}m_{1+2t}\ldots }](https://wikimedia.org/api/rest_v1/media/math/render/svg/cda45be452591bd05e26f3a5c67802729af8c6c3)
![{\displaystyle c_{1}=\sigma _{1}(m_{1}),c_{1+t}=\sigma _{1}(m_{1+t}),c_{1+2t}= \sigma _{1}(m_{1+2t}),\ldots ,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2fbf0f96dcf125c87e31f6f7537c385f47288f91)
![{\displaystyle m_{2}m_{2+t}m_{2+2t))](https://wikimedia.org/api/rest_v1/media/math/render/svg/809ae7f5c07d7a756be439ff9b3b1c4534d5b7ec)
![{\displaystyle c_{2}=\sigma _{2}(m_{2}),c_{2+t}=\sigma _{2}(m_{2+t}),c_{2+2t}= \sigma _{2}(m_{2+2t}),\ldots }](https://wikimedia.org/api/rest_v1/media/math/render/svg/78970ec34808d5ffc0b94167921667a215f37262)
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.
![t](https://wikimedia.org/api/rest_v1/media/math/render/svg/65658b7b223af9e1acc877d848888ecdb4466560)
![{\displaystyle \sigma _{1},\sigma _{2},\ldots ,\sigma _{t))](https://wikimedia.org/api/rest_v1/media/math/render/svg/ee630a7840dbc4c93daea39f63a21d8201c46236)
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
![{\displaystyle {16\ 18\ 20\ 6\ 4\ 1}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bc3b92fb7b5c14d251ced0386a0d08d929603371)
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
![{\displaystyle {43251343251343251343251343251}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0d7669713d349362e4394ac727ed4baa780a0108)
SGUCHPVELL ZIRTEPND NFGIN BORGYUG
ÉS A VÉDELEM Katonáinak meggyilkolása ÉJSZAKÁBAN
![{\displaystyle {3432513432513432513432513432}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d03d722d046de3ac344bbca53314f6b758ec542f)
L CHDKOTKHZHG UUMZDH RЪSGSYu D TPIA RV
JANUÁR EZER HUSZONKETEDIKE
![{\displaystyle {51343251343251343251343251}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e7b305a77cac153d1cbf52783acc182d4abe6a8a)
YGGISCHVCHE ETSSTUZH VSEVHA HYAFBBB
NYOLCSZÁZHUSZONHATODIK
![{\displaystyle {3432513432513432513432513432}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d03d722d046de3ac344bbca53314f6b758ec542f)
ETFZSEFTKh ZHZBZЪGFB SCHIKHHRIP ZHTZV
NEM JOAM DACOSTA, UNFAIR AT
![{\displaystyle {51343251343251343251343251343}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f8e2bd5a343bd8b734ac9391261fbda7d55e5868)
TJ YTGO YBNTFFFE OIKHTEGIIIOKZP TFL
HALÁLRA BESZÉLTEM, ÉS ÉN BOLDOGTALAN
![{\displaystyle {25134325134325134325134325134}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bbbd0d51a3f969c32b660fd555de6a498795ca03)
EUGSFIPTM O FOKSHM G B TJFYGUCHOYUN
GYÉMÁNT OSZTÁLY ALKALMAZOTTA
![{\displaystyle {325134325134325134325134325}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8b9821e854aae8b5e7db39139c5ca35c31102f92)
FNSHZGALL SCHRUDENKOLG GNSBCSSEU
MEGYE; IGEN, EGY VAGYOK, MIBEN ÉS ALÁÍRÁSOKBAN
![{\displaystyle {1343251343251343251343251}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e58dae7c9638a0eb9c5e401a393b37ec876eb143)
PNFTSEE EG G SZHNO ÉS YIO N RSITKTS
HÁBORÚ AZ IGAZI NEVEMBEN,
![{\displaystyle {3432513432513432513432513432513}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/298e202fce32ef2c44731f3dc9c09aab37326826)
EDBUB TETLO TBFTSSBUYP MPZTZHP
ORTEGA
![{\displaystyle {432513}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/57f6384b3827413a470e845168526c8de5bad31a)
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
- ↑ Martin , Keith M. Mindennapi kriptográfia . — Oxford University Press, 2012. — p. 142 p. — ISBN 978-0-19-162588-6 .
- ↑ 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.. (határozatlan)
- ↑ 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.
- ↑ 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 .
- ↑ 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 .
- ↑ 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.).
- ↑ 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 .
- ↑ Knudsen, Lars R. Block Ciphers – felmérés. - London: Springer, 1997. - ISBN 3-540-65474-7 .
- ↑ Stanislaw Jarecki. Crypto Overview, Perfect Secrecy, One-time Pad // University of California. – 2004.
- ↑ 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 .
- ↑ Zselnikov V. Kriptográfia a papirusztól a számítógépig - M .: ABF , 1996. - 336 p. — ISBN 978-5-87484-054-9
- ↑ 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 .
- ↑ Laboratóriumi gyakorlat: Vigenere, RSA, DES és hitelesítési protokollok // CS 415: Computer and Network Security. - 2006. Archiválva : 2011. július 23.
- ↑ 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
Szótárak és enciklopédiák |
|
---|