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

. . . . . . . . .

Text cifrat ( C ) - „IRPSUFFQF”

Decriptare

. . . . . . . . .

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" );