Wpisany przez Waldemar Sradomski,
02 grudnia 2007 14:35
Jednym z łatwiejszych algorytmów szyfrujących jest algorytm XOR. W Pascal’u procedura szyfrująca może
wyglądać następująco:
Deszyfrowanie odbywa się z użyciem tej samej procedury z tym, że jako napis wejściowy mamy tekst zaszyfrowany a jako wyjściowy oryginalny test przed zaszyforwaniem. Oczywiście zastosowanie klucza w o 255 różnych wartościach nie daje możliwości uzyskania dużej siły szyfrowania. Modyfikacje poprawiające siłę szyfrowania powinny w większym stopniu różnicować klucz, można to zrobić np. przy pomocy klucza w postaci napisu wykonując operację xor na kolejnych znakach tekstu szyfrowanego i hasła:
im dłuższe hasło tym lepszy wynik szyfrowania. Efekt szyfrowania znacznie lepiej będzie wyglądać gdy hasłem nie będzie napis ale ciąg liczb losowych, no nie do końca losowych. Generatory liczb pseudolosowych podają ciągi liczb zależne od liczby jaką generator został zainicjowany, do inicjacji generatora liczb losowych w Pascal’u (Delphi) służy procedura Randomize. W procedurze tej zmiennej RandSeed (jądrze generatora) przypisuje się czas komputera.
Tabela Przykład liczb losowych w zależności od wartości zmiennej RandSeed, standardowa funkcja Random(255)
Taką właściwość generatora liczb losowych możemy wykorzystać do szyfrowania następująco:
Jak widzimy funkcja szyfrująca ma zalety algorytmu XOR ale siła szyfrowania zwiększyła się. Szyfrowanie jest tak dobre jak generator liczb losowych. Standardowy generator inicjuje się liczbą typu LongInt, a więc może przyjmować wartości: -2147483648..2147483647. Moim zdaniem generowanie klucza najlepiej przeprowadzić przy pomocy algorytmu CRC, który na podstawie napisu generuje liczbę.
procedure szyfrXOR(var napis : string; klucz : byte);
var I :integer;
begin
for i:=1 to length(napis) do
napis[i] := char(byte(napis[i]) xor klucz )
end;
Deszyfrowanie odbywa się z użyciem tej samej procedury z tym, że jako napis wejściowy mamy tekst zaszyfrowany a jako wyjściowy oryginalny test przed zaszyforwaniem. Oczywiście zastosowanie klucza w o 255 różnych wartościach nie daje możliwości uzyskania dużej siły szyfrowania. Modyfikacje poprawiające siłę szyfrowania powinny w większym stopniu różnicować klucz, można to zrobić np. przy pomocy klucza w postaci napisu wykonując operację xor na kolejnych znakach tekstu szyfrowanego i hasła:
wynik[i] := char(byte(napis[i]) xor byte(haslo[j]))
im dłuższe hasło tym lepszy wynik szyfrowania. Efekt szyfrowania znacznie lepiej będzie wyglądać gdy hasłem nie będzie napis ale ciąg liczb losowych, no nie do końca losowych. Generatory liczb pseudolosowych podają ciągi liczb zależne od liczby jaką generator został zainicjowany, do inicjacji generatora liczb losowych w Pascal’u (Delphi) służy procedura Randomize. W procedurze tej zmiennej RandSeed (jądrze generatora) przypisuje się czas komputera.
Tabela Przykład liczb losowych w zależności od wartości zmiennej RandSeed, standardowa funkcja Random(255)
RandSeed | 0 | 10 | 20 | 40 |
kolejne wartości liczb pseudolosowych | 0 8 220 51 69 171 81 41 95 108 20 121 18 |
80 83 70 231 66 36 191 68 232 253 2 110 197 |
160 159 177 156 63 156 46 94 112 141 240 99 121 |
65 55 133 4 56 141 10 148 130 173 203 78 225 |
Taką właściwość generatora liczb losowych możemy wykorzystać do szyfrowania następująco:
procedure szyfrXOR2(var napis : string; klucz : LongInt);
var i : integer;
begin
RandSeed := klucz;
for i:=1 to length(napis) do
napis[i] := char(byte(napis[i]) xor byte(Random(255)))
end;
Jak widzimy funkcja szyfrująca ma zalety algorytmu XOR ale siła szyfrowania zwiększyła się. Szyfrowanie jest tak dobre jak generator liczb losowych. Standardowy generator inicjuje się liczbą typu LongInt, a więc może przyjmować wartości: -2147483648..2147483647. Moim zdaniem generowanie klucza najlepiej przeprowadzić przy pomocy algorytmu CRC, który na podstawie napisu generuje liczbę.
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Waldemar Sradomski | Delphi/Pascal | .pas | .pas | ***** / 1 | |
Nikodem Solarz | Ruby | Metoda obliczająca. | .rb | .rb | ***** / 0 |
Poprawiony: 04 października 2012 18:38