Cifrul Gronsfeld
Cifrul Gronsfeld este un cifr de substituție polialfabetic creat de contele Gronsveld (șeful primului serviciu de descifrare din Germania) în secolul al XVII-lea. Cifrul poate fi considerat o îmbunătățire a cifrului Caesar (putere) și Vigenère/Beaufort (viteză).
Descriere
Cheie
Lungimea tastei ( K ) trebuie să fie egală cu lungimea textului original. Pentru a face acest lucru, cheia este scrisă ciclic până când lungimea ei se potrivește cu lungimea textului sursă.
Criptare
Fiecare caracter M i al textului simplu M trebuie deplasat la dreapta cu Ki ( caracterul cheie corespunzător K ).
Sau folosind tabelul Gronsfeld ( T x y , unde x este numărul rândului și y este numărul coloanei și numărând de la zero):
fiecare caracter C i al textului cifrat C se află la intersecția coloanei y , primul caracter (antet) al căruia este egal cu caracterul de text simplu corespunzător M i și Ki --a (cifra corespunzătoare a tastei) linia - (
T K i y )
Decriptare
Fiecare caracter ( C i ) al textului cifrat C trebuie deplasat la stânga cu Ki ( caracterul corespunzător al tastei K ).
Sau folosind tabelul Gronsfeld ( T x y , unde x este numărul rândului, iar y este numărul coloanei și numărarea este de la zero):
trebuie să găsiți un caracter în Ki (i - a cifră a tastei K ) în rând care este egal cu caracterul corespunzător al textului cifrat ( T K i y = C i ), iar primul element (antet) al coloanei va fi al i - lea caracter text simplu.
Exemplu
Să fie dat textul sursă: M = "GRONSFELD"
și cheia: K = "2015"
Cheie
Lungimea ștergării este de 9 caractere, deci lungimea tastei ar trebui să fie, de asemenea, de 9 caractere.
K = „201520152”
Criptare
- M1 = "G".
- y = 6 (y este numărul coloanei)
- 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")
Text cifrat ( C ) - „IRPSUFFQF”
Decriptare
- C 1 \u003d „Eu”.
- x = K 1 = 2
- y = 6 (y este indicele întâlnirii C n pe linia x)
- M+="G" (M="G")
- C 2 \u003d „R”
- x = K2 = 0
- y=17
- M+="R" (M="GR")
. . . . . . . . .
- C9 = „F ”
- x = K 9 = 2
- y=3
- M+="D" (M="GRONSFELD")
Text decriptat ( M ) - „GRONSFELD”
Implementare
Python
Codul
A = „ABCDEFGHIJKLMNOPQRSTUVWXYZ” * 2 # alfabet
def f ( text , k , op ):
k *= len ( text ) // len ( k ) + 1
text = text . sus ()
întoarcere '' . join ([ A [ A . index ( j ) + int ( k [ i ]) * op ] pentru i , j în enumerate ( text )])
def encrypt ( mesaj , cheie ):
return f ( mesaj , cheie , 1 )
def decriptare ( text cifrat , cheie ):
returnează f ( text cifrat , cheie , -1 )
print ( criptați ( 'GRONSFELD' , '2015' )) # criptați
print ( decriptare ( 'IRPSUFFQF' , '2015' )) # decriptare
СSharp
Codul
cheie șir = "2015" , text = "gronsfeld" ;
șir abc = "abcdefghijklmnopqrstuvwxyz" , newKey = cheie , rezultat = "" ;
bool encode = true ;
int op = codificare ? + 1 : - 1 , offset , indexOf = 0 ;
while ( cheie nouă . Lungime < text . Lungime )
{ cheie
nouă += tastă ;
}
if ( cheie nouă . Lungime > text . Lungime )
{
cheie nouă = cheie nouă . Subșir ( 0 , cheie nouă . Lungime - ( cheie nouă . Lungime - text . Lungime ));
}
pentru ( int i = 0 ; i < text . Lungime ; i ++)
{
indexOf = abc . IndexOf ( text [ i ]);
if ( indexOf != - 1 )
{
offset = abc . IndexOf ( text [ i ]) + ( Convert . ToInt32 ( newKey [ i ]) - 48 ) * op ;
if ( offset >= abc . Length )
offset = offset - abc . lungime ;
else if ( offset < 0 )
offset = abc . lungime + offset ;
rezultat += abc [ offset ];
} else
rezultat += text [ i ];
}
JavaScript
Codul
//Acest cod funcționează în consola browserului dacă îl copiați și lipiți acolo.
var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; //Șir alfabet
//Una dintre cele două funcții de aici: https://codepen.io/the405/pen/ZOxwrr
function Gronsfeld ( m , cheie , mod , a ) {
//Gronsfeld cipher - encrypt/decrypt
// m - mesaj sau ciphertext;
// tastă - cheie,
// a - șir cu alfabet
// mod - mod. „criptare” (implicit), „decriptare” - pentru decriptare.
var rezultat = "" ; // șirul rezultat gol de completat.
pentru ( var i = 0 ; i < m . lungime ; ++ i ) { //pentru fiecare literă a mesajului/text cifrat
if ( tip de a !== 'nedefinit' ){ //dacă este specificat alfabetul, criptați/ decriptați cu acest cod scurt
var ki = parseInt ( cheie [( ( i >= cheie . lungime ) ? i % cheie . lungime : i )]); //personalizarea cheii
ki = ( mod === 'decriptare' ) ? - ki : ki ; //-k[i] la decriptare
//criptare: ( m[i] + k[i] ), decriptare: ( m[i] - k[i] ) = ( m[i] + (-k[i] ]) )
rezultat += a [ ( ( a . indexOf ( m [ i ] ) + ki ) ) ];
} else { //dacă nu este specificat alfabetul, încercați criptarea/decriptarea - prin codul de caractere
var c = m [ i ]. charCodeAt ( 0 ); //codul caracterului i al textului/textului cifrat
var counter = ( ( i >= cheie . lungime ) ? i % cheie . lungime : i );
if (( typeof mode === 'nedefinit' ) || mod === 'criptare' ){
if ( c >= 97 && ( parseInt ( c ) + parseInt ( cheie [ counter ])) > 122 ) { //
rezultat cu minuscule += String . fromCharCode (
parseInt ( 96 ) + parseInt (( parseInt ( c ) + parseInt ( cheie [ counter ]) - parseInt ( 122 )))
);
} else if ( c <= 90 && ( parseInt ( c ) + parseInt ( cheie [ counter ])) > 90 ) { //
rezultat majuscule += String . fromCharCode (
parseInt ( 64 ) + parseInt (( parseInt ( c ) + parseInt ( cheie [ counter ]) - parseInt ( 90 )))
);
} else { //altfel -
rezultat schimbare caracter += String . fromCharCode ( parseInt ( c ) + parseInt ( cheie [ counter ]));
}
} else if ( mod === 'decriptare' ){
if ( c >= 65 && c <= 90 ) { // majuscule
if (( parseInt ( c ) - parseInt ( cheie [ counter ])) < 65 ) {
rezultat += șir . fromCharCode (
parseInt ( 91 ) - parseInt (( parseInt ( 65 ) - ( parseInt ( c ) - parseInt ( cheie [ counter ])))))
);
}
else {
rezultat += String . fromCharCode ( parseInt ( c ) - parseInt ( cheie [ counter ]));
}
} else if ( c >= 97 && c <= 122 ) { // minuscule
dacă (( parseInt ( c ) - parseInt ( cheie [ counter ])) < 97 ) {
rezultat += String . fromCharCode (
parseInt ( 123 ) - parseInt (( parseInt ( 97 ) - ( parseInt ( c ) - parseInt ( cheie [ counter ]))))
);
}
else {
rezultat += String . fromCharCode ( parseInt ( c ) - parseInt ( cheie [ counter ]));
}
} else { //altfel - doar un caracter
rezultat += String . fromCharCode ( c );
}
}
}
}
returnează rezultatul ; //întoarce un șir de text/text cifrat.
}
//Testează // # criptare - cu
consola alfabetului specificat
. jurnal ( Gronsfeld ( 'GRONSFELD' , '2015' , 'criptare' , alfabet ), "- criptare alfabetică" ); // # decriptare - cu consola alfabet specificată . jurnal ( Gronsfeld ( 'IRPSUFFQF' , '2015' , 'decriptare' , alfabet ), "- decriptare cu alfabet" ); // # criptare - implicit, fără alfabet și fără consolă „criptare” . jurnal ( Gronsfeld ( 'GRONSFELD' , '2015' ), „- criptare fără alfabet și „criptare”” ); // # decriptare reușită - fără consolă alfabetică . jurnal ( Gronsfeld ( 'IRPSUFFQF' , '2015' , 'decriptare' ), "- decriptare fără alfabet" ); // # criptare - fără alfabet, console cu litere mici . jurnal ( Gronsfeld ( 'gronsfeld' , '2015' , 'criptare' ), "- criptare litere mici - fără alfabet" ); // # decodare - fără alfabet, litere mici. consola . jurnal ( Gronsfeld ( 'irpsuffqf' , '2015' , 'decriptare' ), "- decriptare litere mici - fără alfabet" );