26. april 2005 - 20:56Der er
84 kommentarer og 1 løsning
Finde næste tegn i ASCII-tabel
Hej
Hvis jeg har en Memo1, hvor indholdet bare er et lille "a", så ved jeg jo godt at næste bogstav hedder (lille) "b". Det samme gælder stort "A", det er er stort "B".
Hvis bogstavet er (lille) "a", så skal programmet lave bogstavet om til decimal (Se link), og lægge 1 til decimalet, og derefter lave det til grafisk igen (som i dette tilfælde skulle give "b").
Eksempel: "a" = 97 i decimal + 1 = 98 decimal = "b" "r" = 114 i decimal + 1 = 115 decimal = "s" "A" = 65 i decimal + 1 = 66 decimal = "B" "!" = 33 i decimal + 1 = 34 decimal = """ (1 "gåse-øjne-tegn") ">" = 62 i decimal + 1 = 63 decimal = "?"
Det sidste tegn hedder "~" (126 decimal), og skal blive til " " (32 decimal).
Er dette umuligt?
Lidt kode ønskes, gerne lidt forklaring (er ikke en ørn til disse kanter af Delphi).
function plusone(c : char) : char; begin if ord(c) = 126 then (* hvis tal værdien af c er 126 altså fordi det er '~' så *) result := ' ' (* sæt til mellemrum ' ' *) else result := char(ord(c) + 1) (* sæt til det bogstav som har talværdien af talværdien af c + 1 *) end;
Og:
var i : integer; s : string;
begin s := Edit1.Text; (* lav en kopi af Edit1 *) for i := 1 to Length(Edit1.Text) do s[i] := plusone(s[i]); (* konverter hvert bogstav i s *) Edit2.Text := s; (* kopier s ind i Edit2 *) end;
Jeg havde iøvrigt lidt kode på lager som måske kan give dig lidt inspiration:
function encrypt(tekst,kode:string):string;
var I: integer;
begin for I := 1 to length(tekst) do begin tekst[I] := chr(32+((ord(tekst[I])-32)+(ord(kode[(I mod length(kode))+1])-32)) mod 96); end; result := tekst; end;
function decrypt(tekst,kode:string):string;
var I: integer;
begin for I := 1 to length(tekst) do begin tekst[I] := chr(32+(96 + (ord(tekst[I])-32)-(ord(kode[(I mod length(kode))+1])-32)) mod 96); end; result := tekst; end;
Forskydning af alle bogstaver med et fast antal pladser har været kendt som kryptering i mere end 2000 år (det er kendt som Cæsar kryptering efter Julius Cæsar).
Hvis du interesserer dig for den slags kan jeg anbefale:
The Codebreakers / David Kahn
Det er en 1200 siders bog som på rimeligt forståeligt engelsk beskriver udviklingen i kryptering og hvordan koder knækkes fra civilisationens start til afslutningen på anden verdens krig.
Der er ikke noget om den kolde krig og computere. Men for det første skal man have en doktor grad i matematik for at forstå moderne kryptering. For det andet så er størstedelen af det der er sket siden anden verdenskrig stadig klassificeret som top hemmeligt.
Skal man bruge kryptering professionelt så bør man bruge en af de anerkendte algoritmer 3DES eller AES.
Jeg skal iøvrigt lige pointere at matematikken omkring kryptering med random generator baserer sig på at typen af algoritme er kendt men både startseed og algoritmens parametre er ukendte. Hvis algoritmens parametre er kendte (som de vil være hvis man ved at det er Delphi Random), så er vil man ikke bøvle med matematik men lave et brute force attach (så er det nemlig kun en 32 bit key).
Det med at finde det næste tegn i ASCII-tabellen, er kun en LILLE del af min kryptering!
Bl.a. skal der sættes tilfældige tal som hvert andet tegn (dvs. "Hej" bliver først til "Ifk" (plusone) og derefter til "I6f1k2") Dog har jeg ingen idé om hvordan jeg laver det... Men den idé kommer nok!
Måske kan dette give dig lidt ideer, jeg havde en gang brug for at "kryptere" en streng således at ikke alle og enhver uden videre kunne se hvad der stod: F.eks. bliver strengen "Den lille hund" til:
Self. en masse extra tegn men jo ikke noget enhver hr. Jensen så kan få noget ud af.
Funktionen: og jeg har så en anden funktion DeCrypt der laver det tilbage igen:
function EnCrypt(Text : string) : string;
function Start(Text : string) : string; var i : integer; bog : cardinal; begin Result:=''; for i:=1 to Length(Text) do begin Bog:=ord(Text[i]); Bog:=Bog*7; Bog:=Bog*(random(765234)+1); result:=result+IntToHex(Bog,8); end; end; begin Result:=''; RandSeed:=47679321; Result:=Start(Text); RandSeed:=43217578; Result:=Start(Result); Randomize; end;
Et ? til arve_v, vil man evt. med brute force attach kunne regne sig tilbage til strengen "Den lille hund" når man nu ikke ved hvordan "0EECE33005AB626C03CB70C80 osv. osv." er fremkommet?
function PutTalInd(Tekst : string) : string; var i : integer; begin for i:=Length(Tekst) downto 1 do Insert(Inttostr(Random(10)),Tekst,i); Result:=Tekst; end;
Ja jeg har MSN. Buddy, det var et program jeg lavede for sjovt tilbage i 1998, er ikke engang sikker på at det virker med nyere windows versioner. Der er vel ingen der tvinger folk til at gå ind i tråden og læse :)
Det er et karakteristika for gode krypterings algoritmer at deres sikkerhed kun bygger på en key ikke på hemmeligholdelse af algoritmen. I dit tilfælde din key den værdi du giver RandSeed. Det er svært at hemmeligholde algoritmen hvis den skal bruges generelt.
<mtj11> Nej ikke indy men TClientSocket og TServerSocket som dengang fulgte med Delphi 4. Hacking er vel så meget sagt, der er jo ikke noget skadeligt i programmet. Men nu kender jeg heller ikke den nøjagtige definition af hacking.
Hvordan virker Chatfunktionen i dit Buddy-program? Sender den direkte fra computer til computer, eller smutter beskeden gennem en server? Jeg har før tænkt på at lave et chatprogram [selvfølgelig ikke så stort som msn... :-) ]
Her er et lidt kode, smid 2 TEdit (Edit1,Edit2) og 2 TButton (Button1,Button2)på en form. Skriv noget i Edit1 og tryk på Button1 og Edit1 vil nu indeholde den krypterede tekst. Tryk på Button2 og teksten i Edit1 vil blive dekrypterede og teksten sat ind i Edit2.
HUSK at ændre lidt på routinerne da alle der har set denne post jo ellers uden problemer kan dekryptere din tekst.
---------------------
function EnCrypt(Text : string) : string;
function Start(Text : string) : string; var i : integer; bog : cardinal; begin Result:=''; for i:=1 to Length(Text) do begin Bog:=ord(Text[i]); Bog:=Bog*7; Bog:=Bog*(random(765234)+1); result:=result+IntToHex(Bog,8); end; end; begin Result:=''; RandSeed:=47679321; Result:=Start(Text); RandSeed:=43217578; Result:=Start(Result); Randomize; end;
function DeCrypt(Text : string) : string;
function Start(Text : string) : string; var i : integer; bog : cardinal; Tal : string; begin Result:=''; for i:=1 to (Length(Text) div 8) do begin Tal:=copy(Text,1+((i-1)*8),8); bog:=StrToInt('$'+Tal); Bog:=Bog div (random(765234)+1); Bog:=Bog div 7; result:=result+chr(bog); end; end; begin Result:=''; RandSeed:=43217578; Result:=Start(Text); RandSeed:=47679321; Result:=Start(Result); Randomize; end;
procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text:=EnCrypt(Edit1.Text); end;
procedure TForm1.Button2Click(Sender: TObject); begin Edit2.Text:=DeCrypt(Edit1.Text); end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.