Programowanie w języku Delphi » Gotowce

Szyfr

Potężny szyfr

+                +          +------+        +-----+       +---+---+
|              /          |      |       /             |   |   |
|                   /           |      |      /              |   |   |  
|             /            |      |     +           +    +-------+
|            /             |      |               /     |   |   |
|           /              |      |              /      |   |   |
|          /               |      |        +-----+       +---+---+
+         +-------------+   +------+

Zazwyczaj gdy widzimy jakiś zaszyfrowany plik (nie zip z hasłem) to zajmuje on tyle miejsca na HDD ile nie zaszyfrowany. Czyli (myślimy) że każdy znak został  dodany, xorowany lub odjęty itd. np. jeżeli mamy literkę "a" +1 = "b" i rozszyfrowanie: "b" -1 = "a" prostę nie ? Ale mnie o takie szyfrowanie nie chodzi. Kolejne symbole oznaczają manewrowanie bitami znaku. Pewnie i tak nie zrozumiesz powiem tylko że chodzi o rozłączenie bitów na 2,3,4,6,8,{16 wymuszenie}.

Pomyśl (...) liczbę można dowolnie zamienać na inny system liczbowy. W kompie jest zapis 8 {binarny} np. 01011011, 3 {dziesiętny} np. 193, 2 {Hexy} np. 0F, 1 {Ascii} np. ^,%,D,~, itd.


Teraz przyda się przeliczanie z systemu 10 na inny i odwrotnie. Skorzystam z gotwca autorswa tomidze. Mam nadzieję, że nie będzie miał mi tego za złe;

Dodaj do uses MATH.

10-owy na dowolny:
function ten2xxx(value: String; system: Integer): String; 
var liczba: Integer; 
  {=======================================} 
  function Zamien(licz: Integer): String; 
  begin 
   case licz of 
    10: Result := 'A'; 
    11: Result := 'B'; 
    12: Result := 'C'; 
    13: Result := 'D'; 
    14: Result := 'E'; 
    15: Result := 'F'; 
    else Result := IntToStr(licz); 
   end; 
  end; 
  {=======================================} 
begin 
 if value = '' then 
  begin 
   Result := ''; 
   Exit; 
  end; 
 Result := ''; 
 liczba := StrToInt(value); 
 Repeat 
  Result := Zamien(liczba mod system) + Result; 
  liczba := liczba div system; 
 until liczba = 0; 
end;


dowolny na 10=owy:
function xxx2ten(value: String; system: Integer): String; 
var i, suma, dlug: Integer; 
  {============================================} 
  function Zamien(znak: Char): Integer; 
  begin 
   if znak in ['a', 'A'] then Result := 10 
   else if znak in ['b', 'B'] then Result := 11 
   else if znak in ['c', 'C'] then Result := 12 
   else if znak in ['d', 'D'] then Result := 13 
   else if znak in ['e', 'E'] then Result := 14 
   else if znak in ['f', 'F'] then Result := 15 
   else Result := StrToInt(znak); 
  end; 
  {============================================} 
begin 
 if value = '' then 
  begin 
   Result := ''; 
   Exit; 
  end; 
 suma := 0; 
 dlug := Length(value) - 1; 
 for i := 0 to dlug do 
  suma := suma + 
      Zamien(value[i + 1]) * Round(IntPower(system, (dlug - i))); 
 Result := IntToStr(suma); 
end; 

 
teraz funkcja która dopełnia znaki:
function dop(Value: string; System: Integer): string; 
begin 
 case System of 
  2:Result:=StringOfChar('0',8-Length(Value))+Value; 
  3:Result:=StringOfChar('0',6-Length(Value))+Value; 
  4:Result:=StringOfChar('0',4-Length(Value))+Value; 
  5:Result:=StringOfChar('0',4-Length(Value))+Value; 
  6:Result:=StringOfChar('0',4-Length(Value))+Value; 
  7:Result:=StringOfChar('0',3-Length(Value))+Value; 
  8:Result:=StringOfChar('0',3-Length(Value))+Value; 
  9:Result:=StringOfChar('0',3-Length(Value))+Value; 
  10:Result:=StringOfChar('0',3-Length(Value))+Value; 
  11:Result:=StringOfChar('0',3-Length(Value))+Value; 
  12:Result:=StringOfChar('0',3-Length(Value))+Value; 
  13:Result:=StringOfChar('0',3-Length(Value))+Value; 
  14:Result:=StringOfChar('0',3-Length(Value))+Value; 
  15:Result:=StringOfChar('0',3-Length(Value))+Value; 
  16:Result:=StringOfChar('0',2-Length(Value))+Value; 
 end; 
end;




Walnij 2 Edit`y na formę i nazwij "Kod","edit2",I z zakładki Samples Gauge i nazwij PB.
Wygodnie jest mieć 1 lierę z hasła a nie np. 20

Procedure Wylicz(str:string;var b:byte);
var
I:integer;
pom:byte; //pomocnicza zmienna
begin
pom:=ord(str[1]);
for I:=2 to length(str) do pom:=pom xor ord(str[I]);
b:=pom;
end;  


negacja bitowa

function neg(b:byte):byte;
var
I:integer;
s:string;
begin
s:=ten2xxx(inttostr(b),2);
s:=dop(s,2);
for I:=1 to 8 do if s[I]='0' then s[I]:='1' else S[I]:='0';
result:=strtoint(xxx2ten(s,2));
end;


teraz GŁÓWNY ALGORYTM 16x {Nazwałem go "P-O-W-E-R"} Plik 2 razy większy.
[{(polecam przerobić kod na Pascala a proces szyfrowania pliku będzie krótszy)}]
Procedure Power(fn:String);
var
I,II:byte;
f:file;
wyj:array [1..2] of byte;
Fi:file;
fnam,pom,l,le,ri:string;
begin
assignfile(f,fn);
reset(f,1);
fnam:=changefileext(fn,'.zzz');
assignfile(fi,fnam);
rewrite(fi,1);
form1.PB.MaxValue:=filesize(f);
wylicz(form1.kod.text,II);
while not(eof(f)) do
begin
blockread(f,I,1);
form1.PB.Progress:=filepos(f);
I:=I xor II;
I:=neg(I);
pom:=dop(ten2xxx(inttostr(I),2),2);
l:=pom[5]+pom[5]+pom[6]+pom[6]+pom[7]+pom[7]+pom[8]+pom[8]+pom[1]+pom[1]+pom[2]+pom[2]+pom[3]+pom[3]+pom[4]+pom[4];
le:=l[1]+l[2]+l[3]+l[4]+l[5]+l[6]+l[7]+l[8];
ri:=l[9]+l[10]+l[11]+l[12]+l[13]+l[14]+l[15]+l[16];
wyj[1]:=strtoint(xxx2ten(le,2));
wyj[2]:=strtoint(xxx2ten(ri,2));
blockwrite(fi,wyj,2);
end;
closefile(f);
closefile(Fi);
end;


16 komentarzy

BcbMan 2005-11-25 13:39

jak tu nie krytykowac skoro gosc zachowuje sie jak... psychoszayber ;). Ale co sie dziwic... BTW jesli dla kogos jest to czarna magia to dlatego, ze sam nie dobrze rozumiesz o czym piszesz. Krotka wypowiedz zrozumiala dla poczatkujacych jest dowodem na wlasciwe zrozumienie problemu przez autora (najpierw znajdujemy rozwiazania najbardziej zagmatwane i nie optymalne (zeby tylko dzialalo), a dopiero pozniej kod optymalizujemy), czyz nie?

filipo 2004-05-16 15:57

piszcie sami zamiast krytykowac....moze i ten szyfr dało by się troszkę skrócić ale art jest skierowany do początkujących userów...
pozdrawiam
FK

sakus 2003-12-20 16:17

ja też preferuję xorowanie, ale przez hasło-klucz podane przez użytkownika - nawet mając źródło programu szyfrującego nie rozszyfrujemy tekstu. Jedyna wada - małe zastosowanie, poieważ potrzebujemy ingerencji użytkownika.

Algorytm szyfrujący zwiększający plik 24x jest po prostu śmieszny. Równie dobrze mógłbym się chwalić że zrobiłem algorytm nie-do_złamania zwiększający plik 100x...

Zgadzam się z przedmówcami - teksty typu "i tak nie zrozumiesz" są nie na miejscu u kogoś kto nawet nie zna podstawowych konstrukcji języka (case)

I ostatnie - APELUJĘ O PAMIĘTANIU O ESTETYCE KODU. Jeśli piszesz artykuł pamiętaj przede wszystkim o:
 1. Małe, Duże Litery i    Spacje
 2. //Liczne komentarze
 3. Odstępy pomiędzy głównymi blokami kodu

Pozdrawiam twórcę artykułu!

Marooned 2003-07-26 03:28

Czego wymagacie od 14-latka oceniającego siebie 6/6 ?? :D - no comment

A co do "Po piąte naprawdę następnym razem dobrze się zastanów nad napisaniem "Szmelckiego" komentarza" - wcześniej tego nie zauważyłem.
Zamiast pisać takie bzdury lepiej byś zrobił biorąc sobie do serca dobre słowa krytyki.
Time to grow up...

RobinMaster 2003-07-18 13:34

Uważam sie za poczštkujšcego , no ale ten artykół to tragedia  . Jak ty byœ go nie zrozumiał to nie wiem jaki masz IQ=0 sorki ale taka jest prawda zmniejsz ten kod Ÿródłowy przynajmiej o 3/4

Piotr Zając 2003-08-07 13:03

Rzeczywiście to nie jest najlepszy sposób. Ja preferuje XORowanie, przez wiele zmiennych (np. Aktualny numer znaku, potem przez liczbę znaków w linii itd)

virus12 2003-06-30 10:21

Ile babraniny, chyba ci się nudzi w domu, poczytaj troche książek... może się czegoś nauczysz.
Co do algorytmu który ma 245 linii i 24 krotnie zwieksza rozmiar pliku, to mam pytanie po co?
Co ty tym bedziesz szyfrować?

binek86 2003-05-28 15:23

Jest prostszy sposób na stworzenie algorytmu szyfrowania. Np:

--->Wystarczy pobrać kod ASCII litery stojącej przy szyfrowanej literze
---->Kod ten wstawić do RandSeed
---->Wylosować liczbę f. Random(256)
---->szyfrowaną literę xorować przez wylosowaną liczbę
---->Oczywiście gdy xorujemy ostatnią literę trzeba wziąć kod ASCII litery poprzedniej z nie następnej

Jest to prosty sposób na szyfrowanie. Nie rozszyfrujemy zaszyfrowanej litery nie znając litery stojącej przy niej!

forumer 2003-05-26 14:36

Słabe to. Szyfr ma za duży kod wynikowy. Łatwo zrobić coś o niebo lepszego.

Johnny_Bit 2003-05-15 07:58

Ale potężny szyfr... Stronka sie tylko dłużej ładuje, a jego złamanie jest naprawdę proste (Tak jak mówił Dryo, Statystyka). Osobiście żrobiłem kod który nie powieksza pliku, a złamanie go statystycznie jest średnio skomplikowane (nie ma szyfru idealnego, bardzo dobry jest PGP, mój jest conajwyżej średni).

Jeszcze jedno: Popracuj nad optymalizacją kodu.

my_nick 2003-05-14 19:56

Z twoich 200 linii dodających zera zrobiłem 19, i to szybciej działających:

function AddZeros(Value: string; System: Integer): string;
begin
  case System of
    2:Result:=StringOfChar('0',8-Length(Value))+Value;
    3:Result:=StringOfChar('0',6-Length(Value))+Value;
    4:Result:=StringOfChar('0',4-Length(Value))+Value;
    5:Result:=StringOfChar('0',4-Length(Value))+Value;
    6:Result:=StringOfChar('0',4-Length(Value))+Value;
    7:Result:=StringOfChar('0',3-Length(Value))+Value;
    8:Result:=StringOfChar('0',3-Length(Value))+Value;
    9:Result:=StringOfChar('0',3-Length(Value))+Value;
    10:Result:=StringOfChar('0',3-Length(Value))+Value;
    11:Result:=StringOfChar('0',3-Length(Value))+Value;
    12:Result:=StringOfChar('0',3-Length(Value))+Value;
    13:Result:=StringOfChar('0',3-Length(Value))+Value;
    14:Result:=StringOfChar('0',3-Length(Value))+Value;
    15:Result:=StringOfChar('0',3-Length(Value))+Value;
    16:Result:=StringOfChar('0',2-Length(Value))+Value;
  end;
end;

lofix 2003-05-14 19:16

Zaprawdę potężny artykuł (szyfr)..ale pod jakim względem????

psychoszayber 2003-05-14 18:18

Po pierwsze ja to pisałem nie dla zaawansowanych. Po drugie Może i to dla ciebie "Potężny szyfr" być kupą śmiechu ale dla początkujących czrna magia. Po trzecie gdyby napisał to ktoś inny, tak samo jak ja to nawet ja bym tego nie zrozumiał poniważ tutaj kiepsko wychodzą tekstowe rysunki. Po czwarte u siebie mam algorytm który ma 245 lini robi plik 24x  większy od pierwotnego. Po piąte naprawdę następnym razem dobrze się zastanów nad napisaniem "Szmelckiego" komentarza

Marooned 2003-05-14 12:25

"Pewnie i tak nie zrozumiesz"
"Pewnie i tak nie kapujesz. Z czsem zrozumiesz"

Uważanie się za mądrzejszego od czytelnika jest jednym z najgorszych błędów, jakich NIE wolno popełniać autorowi artykułów!! Przez to jesteś postrzegany jako gbur i tyle.

A kod? Gdybym miał go skomentować, to musiałbym Cię poniżyć, a tego nie chcę.

I jeszcze ten temat "Potężny szyfr" - kupa śmiechu!

Następnym razem bardziej się postaraj (jeśli będzie następny raz).

Vogel 2003-05-14 11:55

Tak, kod jest masakrą (if if if if if, zamiast Copy odpowiednio wywołanego :). Ale zrozumiałem, więc daruj sobie teksty 'pewno i tak nie rozumiesz'. !$!@%!@$!#

Dryobates 2003-05-13 23:48

Ale nakręciłeś. Widać, że jest to szyfrowanie kluczem symetrycznym. Kombinowania dużo, ale algorytm posiada kilka wad.
1. Jego złożoność obliczeniowa jest przerażajaco duża (nie nadaje się do szyfrowania większych plików)
2. Rozmiar powstającego pliku jest 2 razy większy!! To chyba lekka przesada.
3. Jeżeli możliwe jest stworzenie funkcji deszyfrującej (nie analizowałem dokładnie kodu i raczej nie zamierzam męczyć się z tworzeniem funkcji deszyfrującej) to równie dobrze można będzie to złamać i to wydaje mi się, że dosyć prostymi metodami (przypuszczam, że mimo tak zagmatwanego szyfrowania metody statystyczne by wystarczyły).

Może komuś się to przyda. Na pewno dobrze jest stosować jakieś nietypowe algorytmy szyfrowania. Ale złożoność obliczeniowa moim zdaniem wyklucza ten sposób z praktycznych zastosowań.

I taki jeszcze szczegół: wiesz co to jest instrukcja case? A o UpCase słyszałeś? Poczytaj o tym i zmniejsz koda co najmniej 2-krotnie.