Seite 1 von 1

Verschlüsselungsalgo

Verfasst: 19.10.2007 15:34
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

Verfasst: 19.10.2007 15:59
von roherter
Soweit ich das erkenne ist das ein Pointer auf

Code: Alles auswählen

*c1.Character
eine LinkedList.

Verfasst: 19.10.2007 16:01
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)

Verfasst: 19.10.2007 16:48
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

Verfasst: 19.10.2007 16:51
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?

Verfasst: 19.10.2007 17:23
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.

Verfasst: 19.10.2007 22:18
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]