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í
- M 1 = "G".
- y = 6 (y je číslo sloupce)
- K1 = 2
- C 1 \u003d T 2 6 \u003d "I"
C + \u003d "I" (C \u003d "I")
- M2 = "R".
- y=17
- K2 = 0
- C 2 \u003d T 0 17 \u003d "R"
C + \u003d "R" (C \u003d "IR")
. . . . . . . . .
- M9 = "D"
- y=3
- K9 = 2
- C 9 \u003d T 2 3 \u003d "F"
C + \u003d "F" (C \u003d "IRPSUFFQF")
Šifrovaný text ( C ) - "IRPSUFFQF"
Dešifrování
- C 1 \u003d "Já".
- x = K1 = 2
- y = 6 (y je index setkání Cn na řádku x)
- M+="G" (M="G")
- C 2 \u003d "R"
- x = K2 = 0
- y=17
- M+="R" (M="GR")
. . . . . . . . .
- C9 = "F "
- x = K9 = 2
- y=3
- M+="D" (M="GRONSFELD")
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" );