Szyfry polialfabetyczne (lub wieloalfabetyczne)
Krecik
<B>SZYFRY POLIALFABETYCZNE (wieloalfabetyczne)</B>
<tt>P R E H I S T O R I A P R E H I S T O R m a m u t y w y g i n e l y b a r d z o
I A P R E H I S T ...
d a w n o t e m u ...</tt></pre>
Litera klucza zapisana nad literą tekstu jawnego (źródłowego) określa, według którego wiersza (lub kolumny - bez różnicy) tablicy należy ją zaszyfrować. I tek: literę m szyfrujemy według wiersza P, literę a według wiersza R, kolejną literę m według wiersza E i tak dalej... Zatem te same litery tekstu źródłowego będą zależne od ich położenia w tym tekście (czyli: litera a może raz zostać zaszyfrowana jak np. c, a raz jako np. f). Podobnie di- i tri- gramy będą rozbite, przez zastępowanie ich różnymi sekwencjami znaków.
Jeszcze trudniejszy do złamania szyfr uzyskujemy używając dla wierszy tablicy dowolnie wybranych szyfrów monoalfabetycznych, nie ograniczając się do jednego (np. szyfru Cezara). Jedynym problemem jest wtedy to, że wspomniana wyżej tablica 26 znaków jest częścią składową klucza szyfru i musiałaby być przechowywana i trzeba ją przechowywać na użytek każdego szyfranta osobno.
SPOSOBY ROZSZYFROWYWANIA
PS> METODA KLUCZA NIEPRZEŁAMYWALNEGO</span>
[DODATEK]
Wzmiankowana w tekscie tablica ilustrująca szyfr algorytmem Vigenera dla języka angielskiego. (Musiałem sobie do napisania tego program napisać:) ) <table cellspacing=0 cellpadding=0 bordercolor=#D2D2D2 align=center frame="box" STYLE="border: 1px; border-style: solid; border-style: line; border-color:#D2D2D2">
ABCDEFGHIJKLMNOPQRSTUWXYZ BCDEFGHIJKLMNOPQRSTUWXYZA CDEFGHIJKLMNOPQRSTUWXYZAB DEFGHIJKLMNOPQRSTUWXYZABC EFGHIJKLMNOPQRSTUWXYZABCD FGHIJKLMNOPQRSTUWXYZABCDE GHIJKLMNOPQRSTUWXYZABCDEF HIJKLMNOPQRSTUWXYZABCDEFG IJKLMNOPQRSTUWXYZABCDEFGH JKLMNOPQRSTUWXYZABCDEFGHI KLMNOPQRSTUWXYZABCDEFGHIJ LMNOPQRSTUWXYZABCDEFGHIJK MNOPQRSTUWXYZABCDEFGHIJKL NOPQRSTUWXYZABCDEFGHIJKLM OPQRSTUWXYZABCDEFGHIJKLMN PQRSTUWXYZABCDEFGHIJKLMNO QRSTUWXYZABCDEFGHIJKLMNOP RSTUWXYZABCDEFGHIJKLMNOPQ STUWXYZABCDEFGHIJKLMNOPQR TUWXYZABCDEFGHIJKLMNOPQRS UWXYZABCDEFGHIJKLMNOPQRST WXYZABCDEFGHIJKLMNOPQRSTU XYZABCDEFGHIJKLMNOPQRSTUW YZABCDEFGHIJKLMNOPQRSTUWX ZABCDEFGHIJKLMNOPQRSTUWXY </table>[DODATEK]
- FUNKCJA SZYFROWANIA:
char *text = "ALAMAZIELONEGOKOTA";
char *pass = "ABCDEF";
//tworzenie 'tablicy szyfru':
char *tablica = "ABCDEFGHIJKLMNOPQRSTUWXYZ";
char **tab;
tab = new char *[strlen(tablica)];
for(int i=0; i<strlen(tablica); i++)
tab[i] = new char[strlen(tablica)];
//wypełnianie tej tablicy szyfrem wg. algorytmu Vigenera (trochę mało konomiczny sposób, bo własny):
int pos=0;
for(int i=0; i<strlen(tablica); i++)
{
for(short int j=0; j<strlen(tablica)+1; j++)
{
int ps = pos+j;
if(ps>strlen(tablica))
{
ps = ps-strlen(tablica);
}
tab[i][j]=tablica[ps];
}
pos++;
}
//SZYFROWANIE:
for(int i=0; i<strlen(text); i++)
{
//znak szyfrowany:
char znak = text[i];
//znak szyfrujący:
int rest = i%strlen(pass);
char pchr = pass[rest];
//szukanie litery zaszyfrowanej:
//szuaknie wiersza według którego będziemy szyfrować:
int wiersz = 0;
for(int k=0; k<strlen(tablica); k++)
{
if(tab[0][k]==pchr)
{
wiersz = k;
break;
}
}
//i zanjdujemy literę zaszyfrowaną:
int kolumna = 0;
for(int k=0; k<strlen(tablica); k++)
{
if(tab[k][0]==znak)
{
kolumna = k;
break;
}
}
//tu już nie miałem siły truć się char`em: :)
Edit2->Text = Edit2->Text + tab[kolumna][wiersz];
}
for (int i = 0; i < strlen(tablica); i++)
delete[] tab[i];
delete[] tab;
2. FYNKCJA DESZYFROWANIA: ```cpp char *text = "AMCPEEIFNRRJGPMRYF"; char *pass = "ABCDEF";
//tworzenie 'tablicy szyfru':
char *tablica = "ABCDEFGHIJKLMNOPQRSTUWXYZ";
char **tab;
tab = new char *[strlen(tablica)];
for(int i=0; i<strlen(tablica); i++)
tab[i] = new char[strlen(tablica)];
//wypełnianie tej tablicy szyfrem wg. algorytmu Vigenera (trochę mało konomiczny sposób, bo własny):
int pos=0;
for(int i=0; i<strlen(tablica); i++)
{
for(short int j=0; j<strlen(tablica)+1; j++)
{
int ps = pos+j;
if(ps>strlen(tablica))
{
ps = ps-strlen(tablica);
}
tab[i][j]=tablica[ps];
}
pos++;
}
//DESZYFROWANIE:
for(int i=0; i<strlen(text); i++)
{
//znak szyfrowany:
char znak = text[i];
//znak szyfrujący:
int rest = i%strlen(pass);
char pchr = pass[rest];
//szukanie litery zaszyfrowanej:
int wiersz = 0;
for(int k=0; k<strlen(tablica); k++)
{
if(tab[0][k]==pchr)
{
wiersz = k;
break;
}
}
int kolumna = 0;
for(int k=0; k<strlen(tablica); k++)
{
if(tab[k][wiersz]==znak)
{
kolumna = k;
break;
}
}
//brakło sił do char:
Edit2->Text = Edit2->Text + tab[kolumna][0];
}
for (int i = 0; i < strlen(tablica); i++)
delete[] tab[i];
delete[] tab;
PS> po czymś takim, człowiek zaczyna rozumieć po co jest AnsiString :)
Sęk w tym jak samemu wygenerować taki ciąg co Ty sobie ręcznie stworzyłeś?
Ja mam to jako zadanie, ale nie od A do Z tylko od char(32) do char (255).
Ktoś tu mojego pseudonimu używa :P
A art jest wporzo.
Hmm używałem takiego szyfrowania, nie wiedząc jak to się nazywa :P
Fajny artykuł :)