XCrypt Ver - Entschlüsselung von Texten und Datein

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

XCrypt Ver - Entschlüsselung von Texten und Datein

Beitrag von X360 Andy »

Xcrypt ist eine einfache verschlüsselung
von Datein und von Strings.

Sie eignet sich in meinen Augen sehr für
einfache Spiele Saves,
da man nicht viel beachten muss.

-Entschlüsseln
-Auslesen
-Verschlüsseln

Das ganze läuft auch unter Unicode
(soweit ich das testen/beurteilen konnte...)
verständigung(z.b Chats) Non Unicode - Unicode geht nicht

Die Proceduren bestehen eigentlich aus
2 Teilen , einmal das ermitteln der Key Checksumme
durch das zusammen zählen der ASCII werten.
Und das errechnen des Verschlüsselten Strings/Datein
mit dem errechneten Key.

Leider habe ich bei der Datei Verschlüsselung keine
andere Möglichkeit gesehen als es mit einer Temp
Datei zu lösen.

Das ganze dauert keine 1/8 ms bei mir (XCrypt)
Eine Text Datei mit ca. 10 Mb Inhalt dauert bei mir
ca. eine halbe Sekunde.

Zur Sicherheit kann ich nicht viel, würde mich aber
über Kommentare freuen , was daran besser gemacht
werden kann.

Aber für ein einfachen Spiele Save dürfte das locker
reichen, oder änliches was nicht die Welt bedeutet.

Mfg

XCrypt.pb

Code: Alles auswählen

Procedure.s XFileCrypt(File$, Key$)
  XCryptKeyLen = Len(Key$)
  For XCryptKeyStartLen = 1 To XCryptKeyLen
    XCryptKeySingleChar$ = Mid(Key$, XCryptKeyStartLen, 1)
    For ascakt = 1 To 256
      If Chr(ascakt) = XCryptKeySingleChar$
        XCryptKey + ascakt
      EndIf
    Next
  Next
  XCryptFile = ReadFile(#PB_Any, File$)
  TempXCryptFile = CreateFile(#PB_Any, "XCrypt-Temp-Crypt-File.txt")
  While Eof(XCryptFile) = 0
    XCryptString$ = ReadString(XCryptFile)
    XCryptStringLen = Len(XCryptString$)
    For XCryptStartLen = 1 To XCryptStringLen
      XCryptStringSingleChar$ = Mid(XCryptString$, XCryptStartLen, 1)
      XCryptNewString$ + Chr(Asc(XCryptStringSingleChar$) + XCryptKey)
    Next
    WriteStringN(TempXCryptFile, XCryptNewString$)
    XCryptNewString$ = ""
  Wend
  CloseFile(TempXCryptFile)
  CloseFile(XCryptFile)
  CopyFile("XCrypt-Temp-Crypt-File.txt", File$)
  DeleteFile("XCrypt-Temp-Crypt-File.txt")
EndProcedure

Procedure.s XFileEncrypt(File$, Key$)
  XCryptKeyLen = Len(Key$)
  For XCryptKeyStartLen = 1 To XCryptKeyLen
    XCryptKeySingleChar$ = Mid(Key$, XCryptKeyStartLen, 1)
    For ascakt = 1 To 256
      If Chr(ascakt) = XCryptKeySingleChar$
        XCryptKey + ascakt
      EndIf
    Next
  Next
  XCryptFile = ReadFile(#PB_Any, File$)
  TempXCryptFile = CreateFile(#PB_Any, "XCrypt-Temp-Crypt-File.txt")
  While Eof(XCryptFile) = 0
    XCryptString$ = ReadString(XCryptFile)
    XCryptStringLen = Len(XCryptString$)
    For XCryptStartLen = 1 To XCryptStringLen
      XCryptStringSingleChar$ = Mid(XCryptString$, XCryptStartLen, 1)
      XCryptNewString$ + Chr(Asc(XCryptStringSingleChar$)-XCryptKey)
    Next
    WriteStringN(TempXCryptFile, XCryptNewString$)
    XCryptNewString$ = ""
  Wend
  CloseFile(TempXCryptFile)
  CloseFile(XCryptFile)
  CopyFile("XCrypt-Temp-Crypt-File.txt", File$)
  DeleteFile("XCrypt-Temp-Crypt-File.txt")
EndProcedure

Procedure.s XCrypt(String$, Key$)
  XCryptKeyLen = Len(Key$)
  For XCryptKeyStartLen = 1 To XCryptKeyLen
    XCryptKeySingleChar$ = Mid(Key$, XCryptKeyStartLen, 1)
    For ascakt = 1 To 256
      If Chr(ascakt) = XCryptKeySingleChar$
        XCryptKey + ascakt
      EndIf
    Next
  Next
  XCryptStringLen = Len(String$)
  For XCryptStartLen = 1 To XCryptStringLen
    XCryptStringSingleChar$ = Mid(String$, XCryptStartLen, 1)
    XCryptNewString$ + Chr(Asc(XCryptStringSingleChar$) + XCryptKey)
  Next
  ProcedureReturn XCryptNewString$
EndProcedure

Procedure.s XEncrypt(String$, Key$)
  XCryptKeyLen = Len(Key$)
  For XCryptKeyStartLen = 1 To XCryptKeyLen
    XCryptKeySingleChar$ = Mid(Key$, XCryptKeyStartLen, 1)
    For ascakt = 1 To 256
      If Chr(ascakt) = XCryptKeySingleChar$
        XCryptKey + ascakt
      EndIf
    Next
  Next
  XCryptStringLen = Len(String$)
  For XCryptStartLen = 1 To XCryptStringLen
    XCryptStringSingleChar$ = Mid(String$, XCryptStartLen, 1)
    XCryptNewString$ + Chr(Asc(XCryptStringSingleChar$)-XCryptKey)
  Next
  ProcedureReturn XCryptNewString$
EndProcedure

2 Beispiele dazu

- Datei Beispiel
- (Vorher Beispiel datei erstellen)

Code: Alles auswählen

+++++++++++++++++++++++++++++++++++
;+ XCrypt by X360´s World - Andreas Rauscher +
;+++++++++++++++++++++++++++++++++++

XIncludeFile "XCrypt.pb"

Enumeration
  #Button_0
  #String_0
  #Text_0
  #Radio_0
  #Radio_1
  #String_1
  #Editor_0
  #Frame3D_1
EndEnumeration

Procedure XCyrpt_File_Bsp_Window()
  If OpenWindow(0, 219, 97, 278, 217, "XCrypt File Beispiel", #PB_Window_SystemMenu | #PB_Window_TitleBar)
    ButtonGadget(#Button_0, 200, 70, 70, 20, "Crypt")
    StringGadget(#String_0, 40, 30, 230, 20, "Ich bin ein Beispiel Key")
    TextGadget(#Text_0, 10, 30, 20, 20, "Key:")
    OptionGadget(#Radio_0, 10, 10, 130, 20, "Datei Verschlüsseln")
    OptionGadget(#Radio_1, 160, 10, 150, 20, "Datei Entschlüsseln")
    StringGadget(#String_1, 10, 70, 180, 20, "XCrypt File Beispiel Datei.txt")
    EditorGadget(#Editor_0, 10, 100, 260, 100)
    Frame3DGadget(#Frame3D_1, 5, 5, 267, 50, "")
  EndIf
EndProcedure
XCyrpt_File_Bsp_Window()

Repeat
  Select WindowEvent()
      
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
        Case #Button_0
          
          ClearGadgetItemList(#Editor_0)
          
          ;Wir erhalten unseren Key und den Pfad zur Datei
          Key$ = GetGadgetText(#String_0)
          File$ = GetGadgetText(#String_1)
          
          If GetGadgetState(#Radio_0) = 1
            
            ;XFilecrypt() wird aufgerufen und verschlüsselt die Datei
            ; Der Verschlüsselte Text ist dann sofort in der Datei
            XFilecrypt(File$, Key$)
            ; Nun Lesen wir die soeben Verschlüsselte Datei ....
            File = ReadFile(#PB_Any, File$)
            While Eof(File) = 0
              ;.... Schritt für Schritt und setzten den Eintrag in das Editor Feld
              AddGadgetItem(#Editor_0, -1, ReadString(File))
            Wend
            
          ElseIf GetGadgetState(#Radio_1) = 1
            
            ;XFileEncrypt() wird aufgerufen und enschlüsselt die Verschlüsselte Datei
            ; Der Entschlüsselte Text ist dann sofort in der Datei
            XFileEncrypt(File$, Key$)
            
            File = ReadFile(#PB_Any, File$)
            While Eof(File) = 0
              AddGadgetItem(#Editor_0, -1, ReadString(File))
            Wend
            
            ;Nachdem wir den Text ins Editor Feld ausgegebn haben
            ;verschlüsseln wir die Datei wir die Datei wieder
            XFilecrypt(File$, Key$)
            
          EndIf
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      quit = 1
  EndSelect
  
Until quit = 1

-String Beispiel

Code: Alles auswählen

;+++++++++++++++++++++++++++++++++++
;+ XCrypt by X360´s World - Andreas Rauscher +
;+++++++++++++++++++++++++++++++++++

XIncludeFile "XCrypt.pb"

Enumeration
  #String_0
  #Button_0
  #Radio_0
  #Radio_1
  #String_1
  #Text_0
  #Frame3D_0
  #Frame3D_1
  #String_2
EndEnumeration

Procedure XCyrpt_String_Bsp_Window()
  If OpenWindow(0, 531, 249, 204, 158, "XCrypt String Beispiel", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar)
    OptionGadget(#Radio_0, 10, 10, 80, 20, "Verschlüsseln")
    OptionGadget(#Radio_1, 110, 10, 80, 20, "Entschlüsseln")
    StringGadget(#String_1, 32, 30, 160, 20, "")
    StringGadget(#String_0, 10, 70, 130, 20, "")
    StringGadget(#String_2, 20, 120, 170, 20, "")
    ButtonGadget(#Button_0, 150, 70, 50, 20, "Crypt")
    TextGadget(#Text_0, 10, 32, 20, 20, "Key:")
    Frame3DGadget(#Frame3D_0, 5, 0, 192, 60, "")
    Frame3DGadget(#Frame3D_1, 10, 100, 190, 50, "Ausgabe")
  EndIf
EndProcedure
XCyrpt_String_Bsp_Window()

Repeat
  Select WindowEvent()
      
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
        Case #Button_0
          
          If GetGadgetState(#Radio_0) = 1
            
            ;Wir benützen den Befehl XCrypt um die Datei zu verschlüsseln über GetGadgetText erhalten wir die
            ;Notwendigen Texte aus den StringGadgets
            ;Der Verschlüsselte Text wird dann einem weteren StringGadget ausgegeben
            SetGadgetText(#String_2, XCrypt(GetGadgetText(#String_0), GetGadgetText(#String_1)))
            
          Else
            
            ;Wir benützen den Befehl XEnCrypt um die Datei zu entschlüsseln über GetGadgetText erhalten wir die
            ;Notwendigen Texte aus den StringGadgets
            ;Der Entschlüsselte Text wird dann einem weteren StringGadget ausgegeben
            SetGadgetText(#String_2, XEnCrypt(GetGadgetText(#String_0), GetGadgetText(#String_1)))
            
          EndIf
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      quit = 1
  EndSelect
  
Until quit = 1

Hier noch das ganze als Download mit Bsp. Txt Datei
und das ganze noch als binary datei.

PB 4.20 | PB 4.30


Mfg
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Beitrag von andi256 »

Zur Sicherheit kann ich nicht viel, würde mich aber
über Kommentare freuen , was daran besser gemacht
werden kann.
naja sicher kann man das auf keinen Fall bezeichnen ... jede reine "ASC" Verschlüsselung kann man sehr leicht knacken ...
(zum bsp. bei einem Text kommt regelmässig ein leerzeichen (asc 32) vor .. und anhand dem kann man relativ einfach deinen Key-offset
erkennen ... (weiters wenn dein keywert ein vielfaches von 256 ist verschlüsselst du überhaupst nicht !! zb.: Key "aaa9389" )

für den bruteforce deines algos bäuchte man 256(-1) Versuche = ca. 1 sek

bei dem unten angeführte 18446744073709551615 Versuch .... und dazu brauchen die besten Rechner der Welt noch Jahre .....

wenn man etwas sicheres machen will sollte man auf bekannte algos zurückgreifen zb.:

http://de.wikipedia.org/wiki/Data_Encryption_Standard DES IDEA SHA etc...

Das gute an diesen codes ist das sie auch bei bekannten Algo ohne key keine Rückschlüsse vom verschlüsselten Text zulassen und damit haben sich Universitäten auseinandergesetzt.

DES ist zwar auch nicht mehr das sichereste aber im Vergleich zu deinem Code Fort Knox :-)
In der Praxis würde man im gegensatz zu meinem Code
3DES verwenden ( dh. jeden 8Byteblock 3x mit DES verschlüsseln) und zusätzlich das der 1. verschlüsselte 8-Byte Block im File mit dem nächsten 8-Byte Block geXORT wird ) (Blockverschlüsselung)

aber würde dir auch schon mit diesem code meine Kontodaten schicken :-)

einfaches bsp. mit DES angehängt ...

Code: Alles auswählen

;*********************************************************** 
;* Usage: DES encription -> setkey(0,0,key): des(in,out)   * 
;*        DES decription -> setkey(0,1,key): des(in,out)   * 
;* key     (8BYTE)   -> key used For encription/decription * 
;* in      (8BYTE)   -> Data To encrypt/decrypt            * 
;* out     (8BYTE)   -> Data encripted/decripted           * 
;*********************************************************** 

Structure BYT 
 b.b[768] 
EndStructure 

DataSection 
; PERMUTED CHOICE 1 (PC1) 
PC1: 
Data.b 57,49,41,33,25,17, 9 
Data.b  1,58,50,42,34,26,18 
Data.b 10, 2,59,51,43,35,27 
Data.b 19,11, 3,60,52,44,36 
Data.b 63,55,47,39,31,23,15 
Data.b  7,62,54,46,38,30,22 
Data.b 14, 6,61,53,45,37,29 
Data.b 21,13, 5,28,20,12, 4 

; Schedule of left shifts For C And D blocks 
shifts: 
Data.b 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 

; PERMUTED CHOICE 2 (PC2) 
PC2: 
Data.b 14,17,11,24, 1, 5 
Data.b  3,28,15, 6,21,10 
Data.b 23,19,12, 4,26, 8 
Data.b 16, 7,27,20,13, 2 
Data.b 41,52,31,37,47,55 
Data.b 30,40,51,45,33,48 
Data.b 44,49,39,56,34,53 
Data.b 46,42,50,36,29,32 

; INITIAL PERMUTATION (IP) 
IP: 
Data.b 58,50,42,34,26,18,10, 2 
Data.b 60,52,44,36,28,20,12, 4 
Data.b 62,54,46,38,30,22,14, 6 
Data.b 64,56,48,40,32,24,16, 8 
Data.b 57,49,41,33,25,17, 9, 1 
Data.b 59,51,43,35,27,19,11, 3 
Data.b 61,53,45,37,29,21,13, 5 
Data.b 63,55,47,39,31,23,15, 7 

; REVERSE FINAL PERMUTATION (IP-1) 
RFP: 
Data.b  8,40,16,48,24,56,32,64 
Data.b  7,39,15,47,23,55,31,63 
Data.b  6,38,14,46,22,54,30,62 
Data.b  5,37,13,45,21,53,29,61 
Data.b  4,36,12,44,20,52,28,60 
Data.b  3,35,11,43,19,51,27,59 
Data.b  2,34,10,42,18,50,26,58 
Data.b  1,33, 9,41,17,49,25,57 

  
; E BIT-SELECTION TABLE  
E: 
Data.b 32, 1, 2, 3, 4, 5 
Data.b  4, 5, 6, 7, 8, 9 
Data.b  8, 9,10,11,12,13 
Data.b 12,13,14,15,16,17 
Data.b 16,17,18,19,20,21 
Data.b 20,21,22,23,24,25 
Data.B 24,25,26,27,28,29 
Data.B 28,29,30,31,32, 1 
  
; PERMUTATION FUNCTION P 
P: 
Data.b 16, 7,20,21 
Data.b 29,12,28,17 
Data.b  1,15,23,26 
Data.b  5,18,31,10 
Data.b  2, 8,24,14 
Data.b 32,27, 3, 9 
Data.b 19,13,30, 6 
Data.b 22,11, 4,25 
  
; 8 S-BOXES 
S: 
Data.b 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7 
Data.b  0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8 
Data.b  4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0 
Data.b 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13 
  
Data.b 15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10 
Data.b  3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5 
Data.b  0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15 
Data.b 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9 
  
Data.b 10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8 
Data.b 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1 
Data.b 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7 
Data.b  1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12 
  
Data.b  7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15 
Data.b 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9 
Data.b 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4 
Data.b  3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14 
  
Data.b  2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9 
Data.b 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6 
Data.b  4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14 
Data.b 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3 
  
Data.b 12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11 
Data.b 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8 
Data.b  9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6 
Data.b  4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13 
  
Data.b  4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1 
Data.b 13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6 
Data.b  1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2 
Data.b  6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12 
  
Data.b 13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7 
Data.b  1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2 
Data.b  7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8 
Data.b  2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11 

; Key schedule of 16 48-bit subkeys generated from 64-bit key 
KS: 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
Data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
EndDataSection 

;****************************************************************************** 
;*  PACK8()  Pack 64 bytes at 1 bit/byte into 8 bytes at 8 bits/byte          * 
;*  packed                     packed block ( 8 bytes at 8 bits/byte)         * 
;*  binary                   unpacked block (64 bytes at 1 bit /byte)         * 
;****************************************************************************** 

Procedure pack8(*packed.BYT,*binary.BYT) 
 For i=0 To 7 
  d=0 
  For j=0 To 7 
   d+(*binary\b[i*8+j]&1)<<(7-j) 
  Next j 
 *packed\b[i] = d    
 Next i 
EndProcedure 

;****************************************************************************** 
;*  UNPACK8()  Unpack 8 bytes at 8 bits/byte into 64 bytes at 1 bit/byte      * 
;*  packed                        packed block   ( 8 bytes at 8 bits/byte)    * 
;*  binary                        unpacked block (64 bytes at 1 bit /byte)    * 
;****************************************************************************** 

Procedure unpack8(*packed.BYT,*binary.BYT) 
 For i=0 To 63 
  *binary\b[i]= *packed\b[i/8]>>(7-i%8)&1 
 Next i 
EndProcedure 

;****************************************************************************** 
;*  SETKEY()  Generate key schedule For given key And type of cryption        * 
;*  sw1                 parity:        0=ignore, 1=check                      * 
;*  sw2                 type cryption: 0=encrypt,1=decrypt                    * 
;*  pkey                64-bit key packed into 8 bytes                        * 
;****************************************************************************** 

Procedure setkey(sw1,sw2,*pkey) 
 *key.BYT = AllocateMemory (63) 
 *cd.BYT  = AllocateMemory (63) 

; /* Double-check 'parity' parameter */ 
 If sw1<>0 And sw1<>1 
  PrintN("setkey: bad parity parameter") 
  Input() 
  End 
 EndIf 

; Double-check 'type of cryption' parameter 
 If sw2 <> 0 And sw2 <> 1 
   PrintN("setkey: bad cryption parameter") 
   Input() 
  End 
 EndIf 
  
; Unpack KEY from 8 bits/byte into 1 bit/byte 
 unpack8(*pkey,*key) 

; Check For ODD key parity 
 If sw1=1 
  For i=0 To 63 
   k=1 
   For j=0 To 6 
    i+1 
    k+*key\b[i-1] 
    k=k%2 
   Next j 
   If *key\b[i]=k 
   Else 
    PrintN("parity error") 
    Input() 
    End 
   EndIf 
  Next i 
 EndIf 
  
; Permute unpacked key with PC1 To generate C And D 
 For i=0 To 55 
  *cd\b[i] = *key\b[PeekB(?PC1+i)-1] 
 Next i 
  
; Rotate And permute C And D To generate 16 subkeys 
 For i=0 To 15 
; Rotate C And D 
  For j=0 To (PeekB(?shifts+i))-1 
   t1 = *cd\b 
   t2 = *cd\b[28] 
   For k=0 To 26 
    *cd\b[k]   =*CD\b[k+ 1] 
    *cd\b[k+28]=*CD\b[k+29] 
   Next k 
   *cd\b[27] = t1 
   *cd\b[55] = t2 
  Next j 
; Set order of subkeys For type of cryption 
  
  If sw2 = 1 
   j = 15-i 
  Else 
   j = i 
  EndIf  
  
; Permute C And D with PC2 To generate KS 
  For k=0 To 47 
   PokeB(?KS+j*48+k,PeekB(*CD+PeekB(?PC2+k)-1)) 
  Next k 
 Next i 
 FreeMemory (*key) 
 FreeMemory (*CD) 
EndProcedure 

;****************************************************************************** 
;*  DES()                                                                     * 
;*  in;                 packed 64-bit INPUT block                             * 
;*  out;                packed 64-bit OUTPUT block                            * 
;****************************************************************************** 

Procedure des(*in,*out) 
 *block.BYT = AllocateMemory(63) 
 *LR.BYT    = AllocateMemory(63) 
 *preS.BYT  = AllocateMemory(48) 
 *f.BYT     = AllocateMemory(32)  
 *IP.BYT = ?IP 
 *KS.BYT = ?KS 
 *E.BYT  = ?E 
 *S.BYT  = ?S 
 *P.BYT  = ?P 
 *RFP.BYT= ?RFP 

; Unpack the INPUT block 
  unpack8(*in,*block) 

; Permute unpacked input block with IP To generate L And R 
 For j=0 To 63 
  *LR\b[j] = *block\b[*IP\b[j]-1] 
 Next j 
  
; Perform 16 rounds 
 For i=0 To 15 
; Expand R To 48 bits with E And XOR with i-th subkey 
  For j=0 To 47 
   *preS\b[j]=*KS\b[(i*48)+j]!*LR\b[*E\b[j]+31] 
  Next j 

; Map 8 6-bit blocks into 8 4-bit blocks using S-Boxes 
  For j=0 To 7 
; Compute index t into j-th S-box 

   k=6*j 
   t=       *preS\b[k  ] 
   t=(t<<1)|*preS\b[k+5] 
   t=(t<<1)|*preS\b[k+1] 
   t=(t<<1)|*preS\b[k+2] 
   t=(t<<1)|*preS\b[k+3] 
   t=(t<<1)|*preS\b[k+4] 
; Fetch t-th entry from j-th S-box 
   t=*S\b[j*64+t] 
; Generate 4-bit block from S-box entry 
   k=4*j  
   *f\b[k]  =(t>>3)&1 
   *f\b[k+1]=(t>>2)&1 
   *f\b[k+2]=(t>>1)&1 
   *f\b[k+3]= t    &1 
  Next j 
  For j=0 To 31 
; Copy R */ 
   t=*LR\b[j+32] 
; Permute f w/ P And XOR w/ L To generate newR 
   *LR\b[j+32] = *LR\b[j]!*f\b[*P\b[j]-1] 
   *LR\b[j] = t 
  Next j 
 Next i 
  
; /* Permute L And R with reverse IP-1 To generate output block */ 
 For j=0 To 63 
  *Block\b[j]=*LR\b[*RFP\b[j]-1] 
 Next j 
 pack8(*out,*block) 
  
 FreeMemory(*block) 
 FreeMemory(*LR)    
 FreeMemory(*preS)  
 FreeMemory(*f)      
EndProcedure 

;************ 
;************ 
;************     REAL STUFFF :-)
;************ 
;************ 

Enumeration
#filein    
#filecrypt
#filetest
EndEnumeration

; -- MAIN .................


key$ = LSet(InputRequester("Eingabe","bitte Schlüssel eingeben",""),8,"0")   ; Schlüssel festlegen (maximal 8 Stellen)
file$ = OpenFileRequester("Bitte Datei wählen","","",0)                     ; File auswählen

cryptfile$ = file$ + ".crypt"                                               ; verschlüsseltes File erstellen
testfile$ =  file$ + ".test"                                                ; File erstellen um probeweise das erstellte Cryptfile wieder zu entschlüsseln


ReadFile  (#filein   ,file$)                                 
CreateFile(#filecrypt,cryptfile$)
CreateFile(#filetest ,testfile$)

setkey(0,0,@key$)                                                           ; Des wird auf verschlüsseln gestellt

in.q                                                                        ; .q(Quad) heist es werden 8Byte reseviert ... der Des algo arbeitet mit 8Byte 
out.q                                                                       ; darum kann man einfach per pointer die gelesen Quads den des algo übergeben
   
While Eof(#filein) = 0                                                     ; solange das inputfile daten hat
 in = ReadQuad(#filein)                                                   ; 8 Byte einlesen
 des(@in,@out)                                                              ; 8 Byte mit 8 Keybyts DES verschlüsseln
 WriteQuad(#filecrypt,out)                                                  ; und ins neue File schreiben
Wend

FileSeek(#filecrypt,0)
setkey(0,1,@key$)  

While Eof(#filecrypt) = 0 
 in = ReadQuad(#filecrypt)
 des(@in,@out)
 WriteQuad(#filetest,out)
Wend

CloseFile(#filein)
CloseFile(#filecrypt)
CloseFile(#filetest)
mfg Andi
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Danke für die Hinweise bzw die Infos , werde mir die verschiedenen Sachen ansehen und studieren :allright:
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Beitrag von Josh »

diese DES verschlüsselung von andi256 gefällt mir eigentlich ganz gut, aber trotzdem dürfte da ein kleiner fehler drinnen sein:

eigenlich sollten ja 8 byte aus dem schlüssel verwendet werden, dann komme ich mit 256^8 auch auf die 18.446.744.073.709.551.616 möglichkeiten.

wenn ich aber einen text verschlüssen lasse, dann werden nur die ersten vier stellen des schlüssels verwendet. ab der fünften stelle ist es egal, was ich angebe, es wird immer der gleiche verschlüsselte code erzeugt.

leider blicke ich bei dem programm nicht wirklich durch, dass ich selber den fehler finden könnte.

mfg josh

Geändert 14.05.2013, nur um den Mods/Admins zu zeigen, dass es trotzdem geht
Zuletzt geändert von Josh am 14.05.2013 09:23, insgesamt 1-mal geändert.
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Beitrag von andi256 »

Der Algo oben sollte als Vorlage zu sehen sein, mit schwerpunkt "sicherer Algo"

Die Umsetzung hier ist sehr "dünn" gehalten und sollte bei Verwendung in einem Programm überarbeitet werden.

Ich nehme mal an du verwendest die compiler option "Create unicode executable"

dann werden pro eingebenen Zeichen dies immer in 2 Byte abgelegt und so nur die ersten 4 Zeichen = 8Byte dem Algo übergeben.

Code: Alles auswählen

 -- MAIN ................. 

Procedure.s speicherout_hex(*mem,l,q$)
 For i = 0 To l-1
  q$ + RSet(Hex(PeekB(*mem+i)),2,"0") + " "
 Next i
ProcedureReturn q$
EndProcedure

key$ = LSet(InputRequester("Eingabe","bitte Schlüssel eingeben",""),8,"0")   ; Schlüssel festlegen (maximal 8 Stellen) 

Debug speicherout_hex(@key$,16,"Schlüssel: ")

file$ = OpenFileRequester("Bitte Datei wählen","","",0)                     ; File auswählen 
füg das mal in den Code oben ein

bei Schlüsseleingabe von "12345678"
erhälst du bei unicode
"Schlüssel: 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00"
(_________1____2____3____4 __|-----nicht relevant ----- )
hier gehen die ersten 8Byte in den Algo ein also deine "vier Stellen"

wenn du unicode nicht verwendest
bei Schlüsseleingabe von "12345678"
"Schlüssel: 31 32 33 34 35 36 37 38 00 00 00 00 00 00 00 00"
(_________1__2_3__4__5_6__7_8|-----nicht relevant ----- )
also gehen alle 8 Stellen in den Algo ein.

andi256
Antworten