Gronsfeldova šifra

Gronsfeldova šifra  je polyalfabetická substituční šifra vytvořená hrabětem Gronsveldem (vedoucím první německé dešifrovací služby) v 17. století. Šifru lze považovat za vylepšení Caesarovy šifry (síla) a Vigenère/Beaufort (rychlost).

Popis

Klíč

Délka klíče ( K ) se musí rovnat délce původního textu. K tomu se klíč zapisuje cyklicky, dokud jeho délka neodpovídá délce zdrojového textu.

Šifrování

Každý znak M i v otevřeném textu M je třeba posunout doprava o K i (odpovídající klíčový znak K ).
Nebo pomocí Gronsfeldovy tabulky ( T x y , kde x  je číslo řádku a y  je číslo sloupce a počítá se od nuly):
každý znak C i šifrového textu C je na průsečíku sloupce y , jehož první (záhlaví) znak se rovná odpovídajícímu znaku v otevřeném textu Mi a K i -té ( odpovídající číslici klíče) řádek - ( T K i y )

Dešifrování

Každý znak ( C i ) šifrového textu C je potřeba posunout doleva o K i (odpovídající znak klíče K ).
Nebo pomocí Gronsfeldovy tabulky ( T x y , kde x  je číslo řádku a y  je číslo sloupce a počítání je od nuly):
musíte najít znak v K i ( i -tá číslice klíče K ) v řádek, který se rovná odpovídajícímu znaku šifrového textu ( T K i y = C i ), a první (záhlaví) prvek sloupce bude i -tý znak prostého textu.

Příklad

Nechť je uveden zdrojový text: M = "GRONSFELD"
a klíč: K = "2015"

Klíč

Délka vymazání je 9 znaků, takže délka klíče by měla být také 9 znaků.
K = "201520152"

Šifrování

. . . . . . . . .

Šifrovaný text ( C ) - "IRPSUFFQF"

Dešifrování

. . . . . . . . .

Dešifrovaný text ( M ) – „GRONSFELD“

Implementace

Python

Kód A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * 2 # abeceda def f ( text , k , op ): k *= len ( text ) // délka ( k ) + 1 text = text . horní () vrátit '' . spojení ([ A [ A . index ( j ) + int ( k [ i ]) * op ] pro i , j ve výčtu ( text )]) def zašifrovat ( zpráva , klíč ): návrat f ( zpráva , klíč , 1 ) def dešifrovat ( šifrový text , klíč ): návrat f ( šifrový text , klíč , -1 ) tisknout ( zašifrovat ( 'GRONSFELD' , '2015' )) # šifrovat tisknout ( dešifrovat ( 'IRPSUFFQF' , '2015' )) # dešifrovat

СSharp

Kód string key = "2015" , text = "gronsfeld" ; string abc = "abcdefghijklmnopqrstuvwxyz" , newKey = klíč , výsledek = "" ; bool kódovat = true ; int op = zakódovat ? + 1 : - 1 , posun , indexOf = 0 ; while ( newKey . Length < text . Length ) { newKey += key ; } if ( novýKey . Délka > text . Délka ) { newKey = novýKey . Podřetězec ( 0 , newKey . Length - ( newKey . Length - text . Length )); } for ( int i = 0 ; i < text . Délka ; i ++) { indexOf = abc . IndexOf ( text [ i ]); if ( indexOf ! = -1 ) { offset = abc . IndexOf ( text [ i ]) + ( Convert . ToInt32 ( newKey [ i ]) - 48 ) * op ; if ( offset >= abc . Délka ) offset = offset - abc . Délka ; else if ( offset < 0 ) offset = abc . délka + odsazení ; vysledek += abc [ offset ]; } else vysledek += text [ i ]; }

JavaScript

Kód //Tento kód funguje v konzoli prohlížeče, pokud jej tam zkopírujete a vložíte. var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; //Řetězec abecedy //Jedna ze dvou funkcí odtud: https://codepen.io/the405/pen/ZOxwrr function Gronsfeld ( m , key , mode , a ) { //Gronsfeld cipher - encrypt/decrypt // m - message or ciphertext; // klíč - klíč, // a - řetězec s abecedou // režim - režim. "šifrovat" (výchozí), "dešifrovat" - pro dešifrování. var vysledek = "" ; //prázdný výsledný řetězec k vyplnění. for ( var i = 0 ; i < m . délka ; ++ i ) { //pro každé písmeno zprávy/šifrového textu if ( typeof a !== 'undefined' ){ //pokud je zadaná abeceda, zašifrovat/ dešifrovat pomocí tohoto krátkého kódu var ki = parseInt ( klíč [( ( i >= klíč . délka ) ? i % klíč . délka : i )]); //přizpůsobení klíče ki = ( mode === 'dešifrovat' ) ? - ki : ki ; //-k[i] při dešifrování //šifrování: ( m[i] + k[i] ), dešifrování: ( m[i] - k[i] ) = ( m[i] + (-k[i) ]) ) výsledek += a [ ( ( a . indexOf ( m [ i ] ) + ki ) ) ]; } else { //pokud není uvedena abeceda, zkusme šifrování/dešifrování - kódem znaků var c = m [ i ]. charCodeAt ( 0 ); //kód i-tého znaku textu/šifrového textu var counter = ( ( i >= klíč . délka ) ? i % klíč . délka : i ); if (( typeof mode === 'undefined' ) || mode === 'šifrovat' ){ if ( c >= 97 && ( parseInt ( c ) + parseInt ( klíč [ counter ])) > 122 ) { // výsledek malými písmeny += Řetězec . fromCharCode ( parseInt ( 96 ) + parseInt (( parseInt ( c ) + parseInt ( klíč [ čítač ]) - parseInt ( 122 ))) ); } else if ( c <= 90 && ( parseInt ( c ) + parseInt ( klíč [ counter ])) > 90 ) { // výsledek velkými písmeny += String . fromCharCode ( parseInt ( 64 ) + parseInt (( parseInt ( c ) + parseInt ( klíč [ counter ]) - parseInt ( 90 ))) ); } else { //jinak - výsledek posunu znaků += Řetězec . fromCharCode ( parseInt ( c ) + parseInt ( klíč [ counter ])); } } else if ( režim === 'dešifrovat' ){ if ( c >= 65 && c <= 90 ) { // velká písmena if (( parseInt ( c ) - parseInt ( klíč [ counter ])) < 65 ) { result += String . fromCharCode ( parseInt ( 91 ) - parseInt (( parseInt ( 65 ) - ( parseInt ( c ) - parseInt ( klíč [ counter ]))))) ); } else { result += String . fromCharCode ( parseInt ( c ) - parseInt ( klíč [ counter ])); } } else if ( c >= 97 && c <= 122 ) { // malá písmena if (( parseInt ( c ) - parseInt ( key [ counter ])) < 97 ) { result += String . fromCharCode ( parseInt ( 123 ) - parseInt (( parseInt ( 97 ) - ( parseInt ( c ) - parseInt ( klíč [ counter ])))) ); } else { result += String . fromCharCode ( parseInt ( c ) - parseInt ( klíč [ counter ])); } } else { //jinak - pouze znakový výsledek += Řetězec . fromCharCode ( c ); } } } } vrátit výsledek ; //vrátí šifrovaný text/textový řetězec. } //Test // # šifrování - se zadanou abecední konzolí . log ( Gronsfeld ( 'GRONSFELD' , '2015' , 'šifrovat' , abeceda ), "- abecední šifrování" ); // # decrypt - se zadanou abecedou konzole . log ( Gronsfeld ( 'IRPSUFFQF' , '2015' , 'decrypt' , alphabet ), "- decrypt with alphabet" ); // # šifrování - výchozí, bez abecedy a bez 'šifrovací' konzole . log ( Gronsfeld ( 'GRONSFELD' , '2015' ), "- šifrování bez abecedy a 'šifrovat'" ); // # úspěšné dešifrování - žádná abecední konzole . log ( Gronsfeld ( 'IRPSUFFQF' , '2015' , 'dešifrovat' ), "- dešifrovat bez abecedy" ); // # šifrování - žádná abeceda, malá písmena konzole . log ( Gronsfeld ( 'gronsfeld' , '2015' , 'šifrovat' ), "- šifrování malými písmeny - bez abecedy" ); // # dekódování - žádná abeceda, malá písmena. konzole . log ( Gronsfeld ( 'irpsuffqf' , '2015' , 'decrypt' ), "- dešifrování malých písmen - žádná abeceda" );