20. april 2001 - 21:52Der 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!
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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\" !?
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;
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\".
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)
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>
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).
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.
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... ;-)
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.