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