SZYFRY POLIALFABETYCZNE (wieloalfabetyczne)
<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>
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ć:) )
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z |
B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A |
C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B |
D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C |
E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D |
F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E |
G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F |
H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G |
I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H |
J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I |
K | L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J |
L | M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K |
M | N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L |
N | O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M |
O | P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N |
P | Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
Q | R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |
R | S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q |
S | T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R |
T | U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S |
U | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T |
W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U |
X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W |
Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X |
Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | W | X | Y |
</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;
<br>
<br>
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 :)
Hmm używałem takiego szyfrowania, nie wiedząc jak to się nazywa :P
Fajny artykuł :)
Ktoś tu mojego pseudonimu używa :P
A art jest wporzo.
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).