* * *    
Главная » Статьи » Код PB

Просмотров: 1824 | Дата: 26.04.2024 | Коментарии (0)

file encoder-decoder



Code
; Demo: Streaming AES file encode/decode
; netmaestro August 2010
; Purebasic 4.51

Declare Encode(void)
Declare Decode(void)

OpenWindow(0,0,0,200,120,"Cryptor!",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(0, 50,20,100,20,"Encrypt a file")
ButtonGadget(1, 50,50,100,20,"Decrypt a file")
CreateStatusBar(0, WindowID(0))
AddStatusBarField(200)
StatusBarProgress(0,0,0,#PB_ProgressBar_Smooth,0,100)

Repeat
  EventID = WaitWindowEvent()
  Select EventID
  Case #PB_Event_Gadget
  Select EventGadget()
  Case 0
  CreateThread(@Encode(), 0)
   
  Case 1
  CreateThread(@Decode(), 0)
  EndSelect
  EndSelect
Until EventID = #PB_Event_CloseWindow

End

Procedure Encode(void)
   
  chunksize = 4096
  rawfilename$ = OpenFileRequester("Please choose a file to encrypt:","","",0)
  encfilename$ = rawfilename$+".enc"
   
  If OpenFile(0, rawfilename$)
  If CreateFile(1, encfilename$)
  DisableGadget(0,1)
  DisableGadget(1,1)
   
  length.q = Lof(0)
  numparts = length/chunksize
  lastchunksize = length%chunksize
  If lastchunksize
  numparts+1
  lastchunk = numparts
  Else
  lastchunk = 0
  EndIf
   
  *raw = AllocateMemory(chunksize)  
  *secure = AllocateMemory(chunksize)  
   
  StartAESCipher(0, ?key, 256, ?iVector, #PB_Cipher_CBC|#PB_Cipher_Encode)
   
  For i=1 To numparts
  If i=lastchunk
  FillMemory(*raw, chunksize, 0, #PB_Byte)
  ReadData(0, *raw, lastchunksize)
  Else
  ReadData(0, *raw, chunksize)
  EndIf
  AddCipherBuffer(0, *raw, *secure, chunksize)
  WriteData(1, *secure, chunksize)
  prog.d = i/numparts*100
  StatusBarProgress(0,0, Int(prog))
  Delay(1)
  Next
  If lastchunksize
  WriteLong(1, lastchunksize)
  Else
  WriteLong(1, chunksize)
  EndIf
   
  FinishCipher(0)  
  CloseFile(0)
  CloseFile(1)
   
  FreeMemory(*raw)
  FreeMemory(*secure)
   
  MessageRequester("Finished", "Encrypted file "+encfilename$+" saved",#MB_ICONINFORMATION)
  StatusBarProgress(0,0,0)
   
  DisableGadget(0,0)
  DisableGadget(1,0)
   
  EndIf
  EndIf
EndProcedure

Procedure Decode(void)
   
  chunksize = 4096
   
  encfilename$ = OpenFileRequester("Please choose a file to decrypt:","","",0)
  rawfilename$ = SaveFileRequester("Please choose a new name for the decrypted file","","",0)
   
  If OpenFile(0, encfilename$)
  FileSeek(0, Lof(0)-4)
  lastchunksize = ReadLong(0)
  FileSeek(0, 0)
  If CreateFile(1, rawfilename$)
  DisableGadget(0,1)
  DisableGadget(1,1)
   
  length.q = Lof(0)
  numparts = length/chunksize
   
  *raw = AllocateMemory(chunksize)  
  *secure = AllocateMemory(chunksize)  
   
  StartAESCipher(0, ?key, 256, ?iVector, #PB_Cipher_CBC|#PB_Cipher_Decode)
   
  For i=1 To numparts
  ReadData(0, *secure, chunksize)
  AddCipherBuffer(0, *secure, *raw, chunksize)
  If i=numparts
  WriteData(1, *raw, lastchunksize)
  Else
  WriteData(1, *raw, chunksize)
  EndIf
  prog.d = i/numparts*100
  StatusBarProgress(0,0, Int(prog))
  Delay(1)
  Next
   
  FinishCipher(0)  
  CloseFile(0)
  CloseFile(1)
   
  FreeMemory(*raw)
  FreeMemory(*secure)
   
  MessageRequester("Finished", "Decrypted file "+rawfilename$+" saved",#MB_ICONINFORMATION)
  StatusBarProgress(0,0,0)
   
  DisableGadget(0,0)
  DisableGadget(1,0)
  EndIf
  EndIf
EndProcedure

DataSection
  key:
  Data.b $8C,$15,$51,$2C,$0C,$8A,$0A,$D8,$07,$E4,$21,$A2,$8E,$83,$A3,$88,$8A,$CA,$FB,$E1
  Data.b $7B,$A3,$6B,$D6,$BC,$F7,$E6,$CD,$FE,$B5,$D7,$B3
  iVector:
  Data.b $08,$0C,$96,$48,$33,$51,$35,$80,$0C,$A9,$42,$1E,$11,$E0,$83,$C7,$C4,$C6,$E1,$E4
  Data.b $2E,$40,$81,$0A,$24,$70,$00,$10,$08,$B3,$64,$21
EndDataSection










Сайт посвящён языку программирования PureBasic — коммерческий компилятор языка программирования, использующего синтаксис BASIC. Предназначен для создания кроссплатформенных приложений для AmigaOS, Linux, Microsoft Windows, Windows NT и Mac OS X. Разработан компанией Fantaisie Software.