Avatar billede bizty Nybegynder
20. april 2001 - 21:52 Der er 15 kommentarer og
1 løsning

Kryptere streng til tal

Hvordan kan man kryptere en streng(med tal, tegn og stor/små bogstaver til en streng bestående af tal. Det skal være muligt at kryptere med et kodeord, og det skal laves rimeligt sikkert!
Avatar billede pellelil Nybegynder
21. april 2001 - 09:31 #1
Hvad er \"rimeligt sikkert\"? Du kan nemt selv \"opfinde\" diverse krypterings algoritmer som er udmærket, men hvis \"de rette folk\" begynder at debugge/disassemble din applikation så vil det være relativt nemt at finde ud af hvordan din kryptering/dekrypterings algoritme virker. Uden at kende din applikation vil jeg gætte på at de færreste \"gider bruge tid\" på at disasembler denne !?

En simpel \"kryptering\" er at not\'e og/eller xor\'e hver byte. Hvis du kun Not\'er eller Xor hver byte så kan samme \"krypterings\" funktion bruges både til at kryptere og dekryptere, da:
not(not(x)) = x
(x xor y) xor y =  x

Derudover kan du gøre din algoritme \"mere sikker\" ved at både not\'e og xor. Ligeledes kan du xor\'e med en værdi der heletiden ændre sig og sluttelige kan du begynde at bytte rundt på de enkelte bit (men igen gælder det at hvis man gider at bruge tid på at disasemlble applikationen så er \"koden hurtigt brudt\"). Nedenstående et par algoritmer der kompinere de her nævnte tekninkker:
<SNIP>
Function  FastCrypt(ptrBuffer : Pointer; iSize : Integer; uiInit : Byte = $00) : Byte;
var
  iIdx      : Integer;
  uiCurrByte : Integer;
  uiLastByte : Integer;
begin
  uiLastByte := 0;
  for iIdx := 1 to iSize do begin
    uiCurrByte := Byte(ptrBuffer^);
    uiCurrByte := uiCurrByte xor uiLastByte;
    uiCurrByte := Not uiCurrByte;
    uiCurrByte := uiCurrByte xor uiInit;
    uiCurrByte := ((uiCurrByte and $0F) shl 4) or ((uiCurrByte and $F0) shr 4);
    uiLastByte := uiCurrByte;
    Char(ptrBuffer^) := Char(uiCurrByte);
    Inc(PChar(ptrBuffer));
  end;
end;


Function  FastDeCrypt(ptrBuffer : Pointer; iSize : Integer; uiInit : Byte = $00) : Byte;
var
  iIdx      : Integer;
  uiCurrByte : Byte;
  uiLastByte : Byte;
begin
  uiLastByte := 0;
  for iIdx := 1 to iSize do begin
    uiCurrByte := Byte(ptrBuffer^);
    uiCurrByte := ((uiCurrByte and $0F) shl 4) or ((uiCurrByte and $F0) shr 4);
    uiCurrByte := uiCurrByte xor uiInit;
    uiCurrByte := Not uiCurrByte;
    uiCurrByte := uiCurrByte xor uiLastByte;
    uiLastByte := Byte(ptrBuffer^);
    Char(ptrBuffer^) := Char(uiCurrByte);
    Inc(PChar(ptrBuffer));
  end;
end;
</SNIP>

Hvis det skal være mere sikkert så skal du har fat i de \"lidt tungere\" algoritmer. Jeg har en +600 Kb ZIP fil jeg kan maile dig (chiper.zip) indeholdende en krypterings algoritme (DEC) skrevet i Delhi af en \"Hagen Reddmann\" !?
Avatar billede borrisholt Novice
21. april 2001 - 13:07 #2
Pelle >>

Jeg kan ikke helt få dit krypterings haløj  til at virke på en Stream ... Jeg har prøvet det følgende kode :

procedure TForm1.ButtonEncryptFileClick(Sender: TObject);
var
  FileStream : TFileStream;
  Buf : array [0..2000] of byte;
begin
  FileStream := TFileStream.Create(\'Hest.exe\',fmOpenReadWrite or fmShareExclusive);
  with FileStream do
  begin
    Position := 0;
    Read(Buf,2000);
    FastCrypt(@Buf,2000);
    Write(Buf,2000);
    Free;
  end;
end;

procedure TForm1.ButtonDecryptFileClick(Sender: TObject);
var
  FileStream : TFileStream;
  Buf : array [0..2000] of byte;
begin
  FileStream := TFileStream.Create(\'Hest.exe\',fmOpenReadWrite or fmShareExclusive);
  with FileStream do
  begin
    Position := 0;
    Read(Buf,2000);
    FastDeCrypt(@Buf,2000);
    Write(Buf,2000);
    Free;
  end;
end;

Men på Strings virker dne fint ....

Jens b
Avatar billede pellelil Nybegynder
21. april 2001 - 16:59 #3
Borrisholt> Jeg skal med det samme sige at jeg aldrig har brugt den i forbindelse med streams, MEN den har den \"finurlighed\" at dine data skal dekrypteres i samme \"blok-størrelser\" som du brugte da du krypterede. Dette skyldes at algoritmen intern bruger \"uiLastByte\" under krypteringen (og denne variabel kan ikke overføres fra det ene \"block til den anden\".

Avatar billede borrisholt Novice
21. april 2001 - 17:04 #4
Yep ! Den er jeg frisk på men ....
Avatar billede pellelil Nybegynder
21. april 2001 - 17:07 #5
hmmm !?
Avatar billede bizty Nybegynder
22. april 2001 - 13:16 #6
Jeg kan altså ikke få det til at virke, bare med en string. Jeg har prøvet følgende:

procedure TForm1.Button2Click(Sender: TObject);
var
  Streng : string;
  i : integer;
begin
  Streng:=edit1.text;
    FastCrypt(@Streng,length(streng));
  i:=StrToInt(Streng);
end;

Jeg kan heller ikke lige se hvor man skal indsætte det kodeord som strengen skal krypteres med. Så jeg forklarer det lige igen:

edit1.text skal krypteres til en integer(I) ved hjælp af et kodeord(edit2.text)
Avatar billede pellelil Nybegynder
22. april 2001 - 14:32 #7
Prøv i stedet: \"FastCrypt(Streng[1],length(streng));\"
 
Avatar billede pellelil Nybegynder
22. april 2001 - 14:45 #8
Det skulle selvfølgelig ha\' været: \"FastCrypt(@Streng[1],length(streng));\".

Jeg har lige nærlæst din kode og det er noget værre sludder du laver. Du putter indholdet af edit1.text over i streng, som du dernæst kryptere - hvilket er OK. Men dernæst præver du at flytte de krypterede data over i en Integer, og dette kan du ikke gøre ! hvorfor prøver du på det ? hvad vil du opnå?

Den \"nøgle\" som min simple routine benytter er det 3. parameter som FastCrypt/FastDecrypt kaldes med, men i kræft af Pascal\'s evne til at benytte default variable kan du undlade at overføre den og routinerne vil således bruge default værdien $00. Nedenstående vises et eksempel på hvordan du kan kørst kryptere dine data med \"nøglen\" $45 hvorefter de krypteres med samme nøgle (din form skal have edit1, edit2 og edit3 for at eksemplet virker.

<SNIP>
procedure TForm1.Button2Click(Sender: TObject);
var
  Streng : string;
begin
  Streng:=edit1.text;
  FastCrypt(@Streng[1],length(streng),$45);
  edit2.text := Streng;
  FastDeCrypt(@Streng[1],length(streng),$45);
  edit3.text := Streng;
end;
</SNIP>
Avatar billede bizty Nybegynder
22. april 2001 - 18:29 #9
Du har vist ikke helt forstået hvad det er jeg vil! Jeg vil kryptere en streng (bestående af tekst, tegn og tal) til en streng uden tegn(Altså kun små og store bogstaver og tal). Dette er nødvendigt da brugeren skal indtaste den krypterede tekst(og det er jo nok de færeste som lige ved hvordan man laver et þ f.eks).
Avatar billede jensfudge Nybegynder
23. april 2001 - 09:36 #10
Jeg har hentet en pakke et eller andet sted...
Hagen Reddmann  mailto:HaReddmann@AOL.COM
har skrevet pakken, og ved at benytte blowfish algoritmen, bliver den krypterede streng til tal.
Avatar billede bizty Nybegynder
23. april 2001 - 12:48 #11
Hvor kan jeg finde det?
Avatar billede borrisholt Novice
23. april 2001 - 12:57 #12
du kan hente den på http://torry.net


Jens B
Avatar billede pellelil Nybegynder
23. april 2001 - 17:46 #13
Hvis du vil sørge for at brugeren kan indtaste det der er krypteret kan du med fordel anvende en MIME-encodeing.
Avatar billede bizty Nybegynder
24. april 2001 - 12:59 #14
jeg kan ikke finde noget på torry!
hvad skalk jeg søge efter?
Avatar billede jensfudge Nybegynder
24. april 2001 - 13:56 #15
Hvis det var mig, ville jeg nok sende en pæn mail til Hagen Reddmann, der har lavet dimserne, og som forærer dem væk som freeware... hans email adresse står længere oppe... ;-)
Avatar billede bizty Nybegynder
21. august 2003 - 17:14 #16
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester