Seite 1 von 1

Cryptother (OpenSource)

Verfasst: 07.05.2007 18:05
von a14xerus
Ein kleines Programm, um Dateien zu verschlüsseln
Dateien können über das Menü ver-/entschlüsselt werden oder sie werden per Drag&Drop auf das Programmfenster gezogen (Erkennung per Dateierweiterung)
Programmseite
Direktdownload
Kein Installer, kein Zip, nur eine Exe, keine weiteren Auslagerungen und kein E.T. nach hause telefonieren verpackt in 47 KB :allright:

Verfasst: 07.05.2007 22:16
von bluejoke
Kannst du was zum verwendeten Verschlüsselungsalgo sagen?

Verfasst: 07.05.2007 22:24
von a14xerus
jup.
Es ist üüüberhaupt nichts großes.
Aber das hatte ich auch gar nicht vor. Das Programm hab ich in der schule in der pause geschrieben :D
Also wohl auch nicht sicher , aber das habe ich ja nie behauptet :)
Aufbau der Crypt-Datei:
  • 1 Byte Datei-versions-angabe

    1 Byte Längenangabe für folgenden String
    String mit der original-Datei-Erweiterung

    1 Byte Längenangabe für Checksumme
    String mit Checksumme (im moment immer 32 zeichen md5hash)

    danach normale Datei verändert durch Xor (code: "!") mit crc32fingerprint vom Passwort.
Die Checksumme wird benötigt, weil die Datei ja ge-x-or-t (:lol:) wird mit dem Passwort.
Um die Datei wieder normal zu machen, muss sie ja nochmal mit dem gleichen Passwort wiederum ge-x-or-t werden.
Falls aber das Falsche passwort eingegeben wird, wird die datei zwar scheinbar entschlüsselt, aber mit dem falschen XOR.
Darum wird nach dem entschlüsseln nochmal die Checksumme überprüft, und wenn falsch, dann wird eine meldung ausgegeben.

Deswegen keine wichtigen Dateien "extra falsch entschlüsseln".
Die namensgebugn der dateien ist wie folgt:
C:\input.original =>
C:\input.crypt =>
C:\input.original
Vorrausgesetzt man verschiebt sie nicht.
Die Datei bleibt immer im gleichen ordner und behält den selben namen, nur die Dateiendung wird verändert. Beim Ver-/Entschlüsseln bleibt die "inputdatei" immer erhalten.
Zum herumexperimentieren einfach eine kleine txt Datei erstellen oder eine größere Datei in ein eigenes Verzeichnis kopieren oder eine Kopie davon anders benennen. Nur damit im Falle eines Falles nicht die originaldatei mit einer falsch entschlüsselten Datei überschrieben wird...
Vll ergänze ich noch, das zuerst in eine Temporäre Datei geschrieben wird, und erst, wenn alles ok ist, zurückkopiert wird.. mal sehen.

Vll geb ich den Code auch noch frei. Sind mit GUI nur 352 Zeilen (inklusive Leerzeilen)
Aber alles nicht mehr heute
Jetzt gehe ich erstmal offline.
BB

Verfasst: 08.05.2007 15:01
von a14xerus
So, Hier das Program auf dem Stand von gestern abend:

Code: Alles auswählen

; Cryptother (C) Alexander Nähring 2007 for PB 4.XX
EnableExplicit
Global PrgVersion.l = 4

Enumeration
  #WindowMain
  #WindowInfo
EndEnumeration
Enumeration
  #GadgetProgressbar
  #GadgetInfo
  #GadgetInfoText
  #GadgetButtonUpdate
EndEnumeration
Enumeration
  #MenuID
EndEnumeration
Enumeration
  #MenuItemEncryptFile
  #MenuItemEncryptDir
  #MenuItemDecrypt
  #MenuItemEnd
  #MenuItemInfo
EndEnumeration

#Crypt_Decrypt = $01
#Crypt_Encrypt = $02

Global WindowMainHWND.l
Global prg$ = "Cryptother"
Global i.l, k.l
Global WindowEvent.l, EventGadget.l, EventMenu.l, EventType.l, EventWindow.l

Procedure.l DownloadToMem( URL.s, *lpRam, ramsize.l ) 
  Protected agent.s, hINet.l, hData.l, Bytes.l 
  agent = prg$+" - "+Str(PrgVersion)
  hINet = InternetOpen_(@agent,0,0,0,0) 
  hData = InternetOpenURL_(hINet,@URL,"",0,$84000000,0 ) 
  If hData > 0
    InternetReadFile_ ( hData, *lpRam, ramsize, @Bytes )
  Else
    Bytes = -1
  EndIf
  InternetCloseHandle_ (hINet)
  InternetCloseHandle_ (hData) 
  ProcedureReturn Bytes 
EndProcedure 
Procedure update(dummy.l)
  Protected *mem, tmp$, new_version.l
  DeleteURLCacheEntry_("http://update.alexander-n.de/crypt/update.upd")
  *mem = AllocateMemory(10)
  DownloadToMem("http://update.alexander-n.de/crypt/update.upd",*mem,10)
  tmp$ = Left(PeekS(*mem),1)
  FreeMemory(*mem)
  new_version = Val(tmp$)
  If new_version > PrgVersion
    If MessageRequester("Neue Version","Es ist eine neue Version vorhanden."+Chr(10)+"(Ihre Version: "+Str(PrgVersion)+", neue Version: "+Str(new_version)+")"+Chr(10)+"Wollen Sie zur Projektseite wechseln?",#PB_MessageRequester_YesNo) = #IDYES
      RunProgram(Chr(34)+"http://www.alexander-n.de/pages/download.php?prog=5"+Chr(34))
    EndIf
  Else
    MessageRequester("Keine neue Version","Sie haben die aktuellste Version. ("+Str(PrgVersion)+")")
  EndIf
EndProcedure

Macro GetFileNamePart(file)
  Left(file,Len(file)-Len(GetExtensionPart(file))-1)
EndMacro

Procedure HideFromTaskBar(hwnd.l, Flag.l) 
  Protected TBL.ITaskbarList 
  
  CoInitialize_(0) 
  If CoCreateInstance_(?CLSID_TaskBarList, 0, 1, ?IID_ITaskBarList, @TBL) = #S_OK 
    TBL\HrInit() 
    If Flag 
      TBL\DeleteTab(hwnd) 
    Else 
      TBL\AddTab(hwnd) 
    EndIf 
    TBL\Release() 
  EndIf 
  CoUninitialize_() 
  
  DataSection 
  CLSID_TaskBarList: 
  Data.l $56FDF344 
  Data.w $FD6D, $11D0 
  Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90 
  IID_ITaskBarList: 
  Data.l $56FDF342 
  Data.w $FD6D, $11D0 
  Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90 
  EndDataSection 
EndProcedure


Procedure WriteNewData(sourceID.l,targetID.l,pw.l,Mode.l)
  Protected i.l, tmp$
  If Mode = #Crypt_Decrypt
    tmp$ = "Entschlüsslungsvorgang"
  ElseIf Mode = #Crypt_Encrypt
    tmp$ = "Verschlüsslungsvorgang"
  EndIf
  SetGadgetAttribute(#GadgetProgressbar,#PB_ProgressBar_Maximum,Lof(sourceID))
  While Not Eof(sourceID)
    WriteByte(targetID,ReadByte(sourceID)!pw)
    i+1 
    If i >= 1024*10
      SetGadgetState(#GadgetProgressbar,Loc(sourceID))
      SetGadgetText(#GadgetInfo,tmp$+" läuft..."+Chr(10)+Str(Loc(sourceID)/1024)+" Kb / "+Str(Lof(sourceID)/1024)+" Kb")
      i = 0
    EndIf 
  Wend
  SetGadgetAttribute(#GadgetProgressbar,#PB_ProgressBar_Maximum,1)
  SetGadgetState(#GadgetProgressbar,1)
  SetGadgetText(#GadgetInfo,tmp$+" beendet..."+Chr(10)+Str(Lof(sourceID)/1024)+" Kb")
EndProcedure
Procedure crypter(Source.s,Password.s,Mode.l)
  Protected Target.s, ext.s, md5.s
  Protected pw.l, tmp.l, sourceID.l, targetID.l, Version.l
  Protected length.l, *mem
  pw.l = CRC32Fingerprint(@Password,Len(Password)+1)
  Select Mode
    Case #Crypt_Decrypt
      Debug "#Crypt_Decrypt"
      sourceID = ReadFile(-1,Source)
      If sourceID
        Version = ReadByte(sourceID)
        Select Version
          Case 1
            Debug "VERSION 1"
            length = ReadByte(sourceID)
            *mem = AllocateMemory(length)
            ReadData(sourceID,*mem,length)
            ext = PeekS(*mem,length)
            FreeMemory(*mem)
            Debug "ext :"+ext
            
            ReadLong(sourceID)
            
            Target = GetFileNamePart(Source)+"."+ext
            targetID = CreateFile(-1,Target)
            If targetID
              WriteNewData(sourceID.l,targetID.l,pw.l,Mode)
              CloseFile(sourceID)
              CloseFile(targetID)
              ProcedureReturn #True
            Else
              ProcedureReturn #False
            EndIf
          Case 2
            Debug "Version 2"
            length = ReadByte(sourceID)
            *mem = AllocateMemory(length)
            ReadData(sourceID,*mem,length)
            ext = PeekS(*mem,length)
            FreeMemory(*mem)
            Debug "ext :"+ext
            
            length = ReadByte(sourceID)
            *mem = AllocateMemory(length)
            ReadData(sourceID,*mem,length)
            md5 = PeekS(*mem,length)
            FreeMemory(*mem)
            Debug "md5 länge: "+Str(length )
            Debug "md5: "+md5
            
            Target = GetFileNamePart(Source)+"."+ext
            targetID = CreateFile(-1,Target)
            If targetID
              WriteNewData(sourceID.l,targetID.l,pw.l,Mode)
              CloseFile(sourceID)
              CloseFile(targetID)
              If MD5FileFingerprint(Target) <> md5
                MessageRequester("Fehler","Anscheinend haben Sie ein falsches Passwort eingeben."+Chr(10)+"Der MD5-Hash der entschlüsselten Datei stimmt nicht mir dem gespeichertem Code überein",#MB_ICONWARNING)
              EndIf
              ProcedureReturn #True
            Else
              ProcedureReturn #False
            EndIf
        EndSelect
        

      Else
        ProcedureReturn #False
      EndIf
    Case #Crypt_Encrypt
      Debug "#Crypt_Encrypt"
      Target = GetFileNamePart(Source)+".crypt"
      sourceID = ReadFile(-1,Source)
      targetID = CreateFile(-1,Target)
      Debug "Source: "+Source
      Debug "Target: "+Target
      If sourceID And targetID
        WriteByte(targetID,2)
        WriteByte(targetID,Len(GetExtensionPart(Source))) ; Länge der folgenden Extension
        WriteString(targetID,GetExtensionPart(Source),#PB_Ascii) ; extension der originaldatei
        md5 = MD5FileFingerprint(Source)
        WriteByte(targetID,Len(md5)) ; Länge des folgenden MD5 Hash
        WriteString(targetID,md5,#PB_Ascii) ; MD5
        WriteNewData(sourceID.l,targetID.l,pw.l,Mode)
        CloseFile(targetID)
        CloseFile(sourceID)
        ProcedureReturn #True
      Else
        ProcedureReturn #False
      EndIf
  EndSelect
EndProcedure
  
Procedure open(file.s,Mode.l=0)
  Protected ext.s
  If Not Mode
    ext = LCase(GetExtensionPart(file))
    Select ext
      Case "crypt"
        Mode = #Crypt_Decrypt
      Default
        Mode = #Crypt_Encrypt
    EndSelect
  EndIf
  If Not file
    Select Mode
      Case #Crypt_Decrypt
        file = OpenFileRequester("Öffne Verschlüsselte Datei","","Crypt-Dateien|*.crypt",0)
      Case #Crypt_Encrypt
        file = OpenFileRequester("Wähle zu verschlüsselnde Datei","","Alle Dateien|*.*",0)
    EndSelect
  EndIf
  If Not file Or Not Mode
    ProcedureReturn #False
  EndIf
  crypter(file,InputRequester("Passwort eingeben","Passwort eingeben",""),Mode)
EndProcedure
Procedure OpenByMode(Mode.l)
  open("",Mode)
EndProcedure
Procedure OpenByFile(file.s)
  open(file)
EndProcedure
  
Procedure.s GetDropFile (*dropFiles, Index) 
  Protected buffer$
  buffer$ = Space(DragQueryFile_ (*dropFiles, Index, 0, 0) +1)
  DragQueryFile_ (*dropFiles, Index, buffer$, Len(buffer$)) 
  ProcedureReturn buffer$ 
EndProcedure
  
Procedure EventCallback(WindowID, message, wParam, lParam)
  Protected resp = #PB_ProcessPureBasicEvents
  Protected *recv.COPYDATASTRUCT
  Select message
    Case #WM_DROPFILES
      CreateThread(@OpenByFile(),GetDropFile(wParam,0))
      DragFinish_(wParam)
  EndSelect
  ProcedureReturn resp
EndProcedure
  
Procedure OpenMainWindow()
  Protected flags.l
  flags | #PB_Window_ScreenCentered
  flags | #PB_Window_Invisible
  flags | #PB_Window_SystemMenu
  WindowMainHWND = OpenWindow(#WindowMain, 0, 0, 300, 100, prg$, flags)
  If WindowMainHWND
    MakeToolWindow(WindowMainHWND,1)
    If CreateGadgetList(WindowMainHWND)
      ProgressBarGadget(#GadgetProgressbar,0,0,WindowWidth(#WindowMain),20,0,0)
      TextGadget(#GadgetInfo,0,20,WindowWidth(#WindowMain),WindowHeight(#WindowMain)-20,"")
      If CreateMenu(#MenuID,WindowMainHWND)
        MenuTitle("Datei")
        MenuItem(#MenuItemEncryptFile,"Datei verschlüsseln")
        MenuItem(#MenuItemDecrypt,"Crypt-Datei entschlüsseln")
        MenuBar()
        MenuItem(#MenuItemEnd,"Beenden")
        MenuTitle("Über")
        MenuItem(#MenuItemInfo,"Info")
        DragAcceptFiles_(WindowMainHWND, 1)
        SetWindowCallback(@EventCallback())
        HideWindow(#WindowMain,0)
        HideFromTaskBar(WindowMainHWND,0)
        ProcedureReturn #True
      EndIf
    EndIf
  EndIf
EndProcedure
Procedure OpenInfoWindow()
  Protected flags.l
  flags | #PB_Window_WindowCentered
  flags | #PB_Window_Invisible
  flags | #PB_Window_SystemMenu
  WindowMainHWND = OpenWindow(#WindowInfo, 0, 0, 150, 40, prg$+" - Info", flags,WindowMainHWND)
  If WindowMainHWND
    MakeToolWindow(WindowMainHWND,1)
    If CreateGadgetList(WindowMainHWND)
      TextGadget(#GadgetInfoText,0,0,WindowWidth(#WindowInfo),WindowHeight(#WindowInfo)-20,"© 2007 Alexander Nähring",#PB_Text_Center)
      ButtonGadget(#GadgetButtonUpdate,0,WindowHeight(#WindowInfo)-20,WindowWidth(#WindowInfo),20,"Versionsüberprüfung")
      HideWindow(#WindowInfo,0)
    EndIf
  EndIf 
EndProcedure

Procedure ende()
  HideFromTaskBar(WindowMainHWND,1)
  HideWindow(#WindowMain,1)
  End 
EndProcedure
  
OpenMainWindow()
  
If CountProgramParameters()
  CreateThread(@OpenByFile(),ProgramParameter())
EndIf

Repeat
  WindowEvent = WaitWindowEvent()
  EventGadget = EventGadget()
  EventMenu = EventMenu()
  EventType = EventType()
  EventWindow = EventWindow()
  
  Select WindowEvent
    Case #PB_Event_CloseWindow
      Select EventWindow
        Case #WindowMain
          ende()
        Case #WindowInfo
          DisableWindow(#WindowMain,0)
          CloseWindow(#WindowInfo)
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadget
        Case #GadgetButtonUpdate
          CreateThread(@update(),0)
      EndSelect
    Case #PB_Event_Menu
      Select EventMenu
        Case #MenuItemEnd
          ende()
        Case #MenuItemEncryptFile
          CreateThread(@OpenByMode(),#Crypt_Encrypt)
        Case #MenuItemDecrypt
          CreateThread(@OpenByMode(),#Crypt_Decrypt)
        Case #MenuItemInfo
          OpenInfoWindow()
          DisableWindow(#WindowMain,1)
      EndSelect
  EndSelect
  Delay(0)
ForEver
Achtung: Mir ist aufgefallen, dass Der Thread zur Ver-/Entschlüsselung noch gar nicht abgesichert ist (beim beenden wird er einfach gekillt und theoretisch kann er unendlich mal gestartete werden...) Bei mir aufm PC schon behoben, im Code noch nicht, aber da geht es ja mehr um die Verschlüsselung selber

Verfasst: 08.05.2007 19:01
von bluejoke
Achso dann.
Ich such noch nach ner Implementierung von RSA, deshalb meine Neugier.

Verfasst: 22.06.2007 14:49
von V1dar
Das Problem mit eigens erfundenen Crypto Algorithmen ist das es meist niemanden gibt der diese auf ihre Sicherheit hin prüft. Deshalb sollte man möglichst bekannte Verfahren verwenden die natürlich enormen Analysen unterzogen wurden/werden. Wie du selbst schon gesagt hast ist dieser wahrscheinlich nicht sicher, hier der Beweis:

Code: Alles auswählen

; ----------------------------------------------------------------------------
; Cryptother Crack by V1dar, Brute force and Chosen-plaintext attack supported
; ----------------------------------------------------------------------------
;
; Im Prinzip sind alle Dateien die mit Cryptother v2 verschlüsselt wurden mit
; diesem Programm zu knacken. Hierfür wird Brute force verwendet der alle
; 16^2 Möglichkeiten durch geht. Schneller ist die Chosen-plaintext attack,
; der im Moment die Dateien *.exe, *.dll, und *.zip unterstützt. Das Programm
; kann für weitere Dateien angepaßt bzw. erweitert werden.
;
; Beispiel einer Erweiterung für RAR Dateien:
;
;      ElseIf LCase(ext)="rar" <- File Extension (*.rar)
;        key = PeekB(*dat)!82 <- erstes Byte einer RAR
;        If(Decrypt(*dat,datlen,md5,key,newfile))
;          crk = 1
;        EndIf

Procedure.l Decrypt(*dat,len.l,md5.s,key.l,newfile.s)
  ret.l=0
  *tmp=AllocateMemory(len+1)
  CopyMemory(*dat,*tmp,len)
  For x=0 To len
    PokeB(*tmp+x,PeekB(*dat+x)!key)
  Next x  
  If MD5Fingerprint(*tmp,len)=md5
    CreateFile(0,newfile)
    WriteData(0,*tmp,len)
    CloseFile(0)
    ret=1
  EndIf
  FreeMemory(*tmp)
  ProcedureReturn ret
EndProcedure

file.s = OpenFileRequester("Open","","Crypted file (*.crypt)|*.crypt",0)
If Len(file)
  If ReadFile(0,file)
    If ReadByte(0) = 2
      crk.l = 0
      exlen.l=ReadByte(0)
      ext.s=Space(exlen)
      ReadData(0,@ext,exlen)
      md5len.l=ReadByte(0)
      md5.s=Space(md5len)
      ReadData(0,@md5,md5len)
      datlen.l=Lof(0)-(3+exlen+md5len)
      *dat=AllocateMemory(datlen)
      ReadData(0,*dat,datlen)
      key.l=0
      newfile.s=Left(file,Len(file)-Len(GetExtensionPart(file))-1)+"."+ext
      If ext="exe" Or ext="dll"
        key = PeekB(*dat)!77
        If(Decrypt(*dat,datlen,md5,key,newfile))
          crk = 1
        EndIf
      ElseIf LCase(ext)="zip"
        key = PeekB(*dat)!80
        If(Decrypt(*dat,datlen,md5,key,newfile))
          crk = 1
        EndIf        
      Else
        For key = 0 To 255
          If(Decrypt(*dat,datlen,md5,key,newfile))
            crk = 1
            Break
          EndIf
        Next key
      EndIf
      FreeMemory(*dat)
      If(crk)
        MessageRequester("..by V1dar..", "File cracked! ;)")
      Else
        MessageRequester("..by V1dar..", "Failed.. :(")
      EndIf
    EndIf
    CloseFile(0)
  EndIf
EndIf

Verfasst: 22.06.2007 15:37
von a14xerus
ich finds ecfht toll, dass sich jemand dran gesetzt hat den Algo zu knacken.
Ganz im Ernst :)
Gute Arbeit (aber wie du schon gesagt, war wohl nicht all zu schwer... und ich hab ja den Algo angegeben)
ich werd wohl eine Neue Version von Cryptother rausbringen, und den Source erstmal geschlossen halten :wink:

Verfasst: 22.06.2007 16:08
von V1dar
Hör ich da ein wenig Sarkasmus raus? Sorry! Das ganze ist wirklich als gesunde Kretik gedacht. :|
a14xerus hat geschrieben:ich werd wohl eine Neue Version von Cryptother rausbringen, und den Source erstmal geschlossen halten :wink:
Naja, nur weil man den Algo. geheim hält macht es ihn dadurch nicht sicherer.
Warum glaubst du veröffentlichen Kryptologen ihre Algos?
Wenn es keine nutzbare Schwäche gibt braucht man auch nichts verstecken.
Bei kritischen Schwächen braucht man nicht mal den Sourecode um ihn zu knacken.

Wenn dich Verschlüsselung interessiert such mal Internet Seiten z.b. über Feistel-Netzwerke raus.
Auf ähnlicher Basis entwickelte Algos sollte dann relativ sicher sein. :allright:

Verfasst: 22.06.2007 16:12
von a14xerus
naja das mit dem "geheim" halten bezog sich auf einen begrenzten Zeitraum, nur um zu testen, ob man es schon an der Dateistruktur erkennt...
> Hör ich da ein wenig Sarkasmus raus?
Ich habe so gut wie möglich versucht das zu unterbinden, ich finde das wirklich super von dir :)
> Wenn dich Verschlüsselung interessiert ...
Da ich jetzt wiedermehr Zeit habe (Ferien) werde ich mir bestimmt verschiedene Verschlüsselungen mal angucken