Verschlüsselungsalgo

Anfängerfragen zum Programmieren mit PureBasic.
pede
Beiträge: 90
Registriert: 08.07.2007 20:37
Wohnort: brixen / Italien

Verschlüsselungsalgo

Beitrag von pede »

Hallo

Ich möchte mich jetz n bisschen mit Verschlüsselung/Verschlüsselungsalgos auseinandersetzen...

Also hab ich das Forum ein wenig durchforstet und bin dabei auf folgenden Algorithmus gestoßen, den NichTheQuick gepostet hat:

Code: Alles auswählen

EnableExplicit 

Procedure.s Encode(Password.s, key.s) 
  Protected *c1.Character, *c2.Character, c.c, s.s 
  
  *c1 = @Password 
  *c2 = @key 
  c = $FF 
  While *c1\c 
    If *c2\c = 0 : *c2 = @key : EndIf 
    c = (*c1\c ! *c2\c) ! c 
    
    s + Right("0" + Hex(c), 2) 
    *c1 + SizeOf(Character) 
    *c2 + SizeOf(Character) 
  Wend 
  
  ProcedureReturn s 
EndProcedure 

Procedure.s DeCode(code.s, key.s) 
  Protected Password.s, *c1.Character, *c2.Character, c.c, a.l, c1.c 
  
  *c1 = @code 
  *c2 = @key 
  c = $FF 
  While *c1\c 
    If *c2\c = 0 : *c2 = @key : EndIf 
    
    If *c1\c <= '9' : c1 = *c1\c - '0' : Else : c1 = *c1\c - 'A' + 10 : EndIf 
    c1 * 16 
    *c1 + SizeOf(Character) 
    If *c1\c <= '9' : c1 + *c1\c - '0' : Else : c1 + *c1\c - 'A' + 10 : EndIf 
    
    Password + Chr(c1 ! *c2\c ! c) 
    c = c1 
    
    *c1 + SizeOf(Character) 
    *c2 + SizeOf(Character) 
  Wend 
  
  ProcedureReturn Password 
EndProcedure 

Define length.l, Password.s, key.s, code.s 

Password = "Höhöhö" 
key = "PureBoard" 

code = Encode(Password, key) 

Debug code 
Debug DeCode(code, key)
Aber ich steig da nicht wirklich durch!

Code: Alles auswählen

*c1.Character, *c2.Character
Was ist .Character für ein Typ?? Was ist der Unterschied zu .c?

Code: Alles auswählen

While *c1\c
Was bedeutet das \c??

wär toll wenn ihrs mir erklären könntet, damit ich mir den Code weiter angucken kann..

lg
"oh... ein Sarkasmus-Detektor... ein wirklich nützliches Gerät" .. dit.. dit.. ditditdit.. *bumm*
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Soweit ich das erkenne ist das ein Pointer auf

Code: Alles auswählen

*c1.Character
eine LinkedList.
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

'Character' ist kein Datentyp, sondern eine Struktur.
Diese Struktur hat nur 1 Feld, nämlich 'c', deshlab schreibt man auch '\c'.

'*c.1Character' ist also ein strukturierter Pointer. Der Pointer zeigt dabei auf einen String bzw. auf einen der Buchstaben eines Strings; der ASCII Wert des Buchstabens, auf den der Pointer zeigt, kann mit '*c1\c' ausgelesen werden:

Code: Alles auswählen

text$="purebAsic"
*pointer.Character=@text$+5 ; Offeset addieren

Debug *pointer\c ; ergibt 65 (A)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

ich kann dir eine sehr schnelle und auch gute Verschlüsselung empfehlen, und zwar die Xor.

Code: Alles auswählen

Procedure.b coden(sFile.s)

  Protected hFile.l = 0
  Protected lLength.l = 0
  Protected *mData.l = 0
  Protected lPos.l = 0
  protected IRGENDEINE_ZAHL = 123  

  If FileSize(sFile) > 0
    
    hFile = OpenFile(#PB_Any, sFile)
    
    If hFile
      
      lLength = Lof(hFile) 
      *mData = AllocateMemory(lLength)
      
      If *mData
        
        ReadData(hFile, *mData, lLength)
        
      EndIf
      
      CloseFile(hFile)
      
      For lPos = *mData To *mData + (lLength - 1)
        
        PokeB(lPos, PeekB(lPos) ! IRGENDEINE_ZAHL)
        
      Next
      
      If *mData
        
        hFile = CreateFile(#PB_Any, sFile)
        
        If hFile
          
          WriteData(hFile, *mData, lLength)
          CloseFile(hFile)
          
          ProcedureReturn #True
          
        EndIf
        
      EndIf
      
    EndIf
    
  EndIf  
  
  ProcedureReturn #False
  
EndProcedure
So kannst du zB eine Datei verschlüsseln/entschlüsseln (beides läuft über den selben Algo). IRGENDEINE_ZAHL ist nur ein Platzhalter, kannst auch Sachen wie randomseed oder ähnliches nutzen um eine nicht durchschaubare Verschlüsselung zu machen, sollte dir die normale (mit einer "normalen" Zahl) nicht reichen.

Ist übrigens zum großteil von Lukaso
pede
Beiträge: 90
Registriert: 08.07.2007 20:37
Wohnort: brixen / Italien

Beitrag von pede »

Achso, danke

Dann müsste in diesem Beispiel:

Code: Alles auswählen

text$="purebAsic" 
*pointer.Character=@text$+5 ; Offeset addieren 

Debug *pointer\c ; ergibt 65 (A)
doch *pointer nur 1 Byte groß sein? (weil Character ja nur 1 Byte groß ist)

Er ist aber 4 Byte groß... (sonst könnt er ja auch nicht di Adresse speichern...)
Woher kommen also die anderen 3 Byte?
"oh... ein Sarkasmus-Detektor... ein wirklich nützliches Gerät" .. dit.. dit.. ditditdit.. *bumm*
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Sagt doch schon der Name, "*pointer" ist ein Zeiger, und die sind immer
4 Byte (unter 32bit) gross. Worauf der Zeiger dann letztendlich zeigt ist
etwas anderes.
pede
Beiträge: 90
Registriert: 08.07.2007 20:37
Wohnort: brixen / Italien

Beitrag von pede »

aha, ok das glaub ich hab ich jetzt gechillt...

was mir aber im Moment noch nicht ganz klar ist, ist der Sinn vom

Code: Alles auswählen

(...) ! c
wieso das nochmal XOR 'n, is das sicherer oder so?

Und danke für die Hilfe bis jetzt![/code]
"oh... ein Sarkasmus-Detektor... ein wirklich nützliches Gerät" .. dit.. dit.. ditditdit.. *bumm*
Antworten