Here is a new example to encrypt text files with Blowfish lib. Two editors to see the process. You can open file or write in editor. Some files cause problems with AllocateMemory() and Freememory() but i don't know why. If you can repeat the bug and discover the reason, thanks to share.
Code: Select all
;Example to encrypt and decrypt text file in editor by Jacobus with JCV blowfish library
;-Constantes
Enumeration
#WIN_TEST
#Text1
#btnEnc
#Text2
#btnDec
#editor
#editorcrypt
#btnOpen
#btnCryptFile
#btnDecryptFile
EndEnumeration
Structure BLOWFISH_CTX
K.q[18]
S0.q[256]
S1.q[256]
S2.q[256]
S3.q[256]
EndStructure
#FL = $FFFFFFFF
#BlowFish_UseBase64 = $01
#BlowFish_UseCBC = $02
;#BlowFish_UseCBC = Will always produce a different encrypted Text(or Memoryblock)
;#BlowFish_UseBase64 = Will encrypt the result in base64.
Procedure.l Blowfish_CryptText(*text, textlen.l, *Password, passlen.l, *Result, Resultlen.l, Mode.l = #BlowFish_UseBase64)
Protected BF.BLOWFISH_CTX, *Buffer, n.l, i.l, a.l, K.q, P.l, b.l
Blowfish_Init(@BF, *Password, passlen)
*Buffer = AllocateMemory(textlen * 2) ; problem with some files (invalid memory access)
If *Buffer
n = textlen
If n % 8 <> 0
n = 8 - (n % 8)
For i = 0 To n - 1
PokeB(*text + textlen + i, 32)
Next i
textlen + n
EndIf
n = textlen / 4
Dim L.Quad(n)
Dim Cipher.Quad(n+2)
If Mode & #BlowFish_UseCBC
Cipher(0)\q = Date();
Cipher(1)\q = ElapsedMilliseconds()*1000000
P = 2
EndIf
For i = 0 To n - 1
L(i)\q = PeekL(*text + i*4) & #FL
Next i
b = 1
If n*8 <= Resultlen
For i = 0 To n - 1 Step 2
If Mode & #BlowFish_UseCBC
L(i)\q ! Cipher(b-1)\q
L(i+1)\q ! Cipher(b)\q
EndIf
Cipher(i+P)\q = L(i)\q
Cipher(i+P+1)\q = L(i+1)\q
Blowfish_Encrypt(@BF, @Cipher(i + P), @Cipher(i + P+ 1))
b + 2
Next i
a = 0
For i = 0 To n - 1 + P Step 2
K = Cipher(i)\q & #FL
PokeL(*Buffer + a, PeekL(@K))
K = Cipher(i + 1)\q & #FL
PokeL(*Buffer + a + 4, PeekL(@K))
a + 8
Next i
If Mode & #BlowFish_UseBase64
Base64Encoder(*Buffer, a, *Result, Resultlen)
a = MemoryStringLength(*Result)
Else
CopyMemory(*Buffer, *Result, a)
EndIf
EndIf
FreeMemory(*Buffer); problem with some files - pointer invalid
; Else
; Debug "Impossible d'allouer la mémoire demandée !"
EndIf
ProcedureReturn a
EndProcedure
Procedure.l Blowfish_DecryptText(*text, textlen.l, *Password, passlen.l, *Result, Resultlen.l, Mode.l = #BlowFish_UseBase64)
Protected BF.BLOWFISH_CTX, *Buffer, n.l, i.l, a.l, j.l, K1.q, K2.q
Blowfish_Init(@BF, *Password, passlen)
*Buffer = AllocateMemory(textlen * 2 + 64)
If *Buffer
If Mode & #BlowFish_UseBase64
textlen = Base64Decoder(*text, textlen, *Buffer, textlen * 2 + 64)
n = textlen / 4
Else
CopyMemory(*text, *Buffer, textlen)
n = textlen / 4
EndIf
Dim Cipher.Quad(n+2)
Dim L.Quad(n)
For i = 0 To n - 1
Cipher(i)\q = PeekL(*Buffer + i*4) & #FL
Next i
If Mode & #BlowFish_UseCBC
j = 2
Else
j = 0
EndIf
a = 0
If n*8 <= Resultlen
For i = j To n - 1 Step 2
K1 = Cipher(i)\q
K2 = Cipher(i+1)\q
Blowfish_Decrypt(@BF, @K1, @K2)
If Mode & #BlowFish_UseCBC
L(i-j)\q = K1 ! Cipher(i-2)\q
L(i+1-j)\q = K2 ! Cipher(i-1)\q
Else
L(i-j)\q = K1
L(i+1-j)\q = K2
EndIf
Next i
For i = 0 To n - 1 - j Step 2
K1 = L(i)\q & #FL
K2 = L(i + 1)\q & #FL
PokeL(*Result + a, PeekL(@K1))
PokeL(*Result + a + 4, PeekL(@K2))
a + 8
Next i
EndIf
FreeMemory(*Buffer)
; Else
; Debug "Impossible d'allouer la mémoire demandée !"
EndIf
ProcedureReturn a
EndProcedure
Global Pfe$
Pfe$ = "d41d8cd98f00b204e9800998ecf8427e" ; encryption key based on md5 file
Procedure.s CryptBF(ToEnc$)
ResultC$ = Space(4096); necessary with long lines
flags.l = #BlowFish_UseCBC | #BlowFish_UseBase64
lengthC = Blowfish_CryptText(@ToEnc$, Len(ToEnc$), @Pfe$, Len(Pfe$), @ResultC$, Len(ResultC$), flags)
If lengthC
ProcedureReturn ResultC$
Else
MessageRequester("Error!","Encryption is failed",#MB_ICONEXCLAMATION)
EndIf
EndProcedure
Procedure.s DecryptBF(ToDec$)
ResultD$ = Space(4096)
flags.l = #BlowFish_UseCBC | #BlowFish_UseBase64
lengthD = Blowfish_DecryptText(@ToDec$, Len(ToDec$), @Pfe$, Len(Pfe$), @ResultD$, Len(ResultD$), flags)
If lengthD
ProcedureReturn Left(ResultD$, lengthD)
Else
MessageRequester("Error!","Decrypt is failed",#MB_ICONEXCLAMATION)
EndIf
EndProcedure
;-Fenêtre principale/Main window
If OpenWindow(#WIN_TEST,0,0, 790, 550,"Window test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)=0 Or CreateGadgetList(WindowID(#WIN_TEST))=0
End
EndIf
StringGadget(#Text1, 10,10,480,20,"")
ButtonGadget(#btnEnc, 500,10,80,20,"Crypt>>")
StringGadget(#Text2, 10,50,480,20,"")
ButtonGadget(#btnDec, 500,50,80,20,"<<Decrypt")
ButtonGadget(#btnOpen, 10,100,80,20,"OpenFile")
ButtonGadget(#btnCryptFile, 100,100,80,20,"CryptFile>>")
ButtonGadget(#btnDecryptFile, 190,100,80,20,"<<DecryptFile")
EditorGadget(#editor,10,130,380,380)
SendMessage_(GadgetID(#editor), #EM_SETLIMITTEXT, -1, 0)
;SendMessage_(GadgetID(#editor), #EM_SETTARGETDEVICE, #Null, 0)
EditorGadget(#editorcrypt,395,130,380,380)
SendMessage_(GadgetID(#editorcrypt), #EM_SETLIMITTEXT, -1, 0)
;-Programme / Event loop
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case #btnEnc ; encrypt first string
Enc$ = GetGadgetText(#Text1)
If Enc$<>""
Debug Enc$
TextEnc$ = CryptBF(Enc$)
SetGadgetText(#Text2, TextEnc$)
SetGadgetText(#Text1, "")
EndIf
Case #btnDec ; decrypt second string
Dec$ = GetGadgetText(#Text2)
If Dec$<>""
Debug Dec$
TextDec$ = DecryptBF(Dec$)
SetGadgetText(#Text1, TextDec$)
SetGadgetText(#Text2, "")
EndIf
Case #btnOpen ; select and open file
If DestRep$ = ""
DestRep$ = "c:\"
EndIf
Fichier.s = OpenFileRequester("Select and open one file", DestRep$, "Text files|*.txt", 0)
If Fichier <> ""
If ReadFile(0, Fichier)
ClearGadgetItemList(#editor)
While Eof(0) = 0
AddGadgetItem(#editor, -1 ,ReadString(0))
Wend
CloseFile(0)
EndIf
DestRep$ = GetPathPart(Fichier)
EndIf
Case #btnCryptFile ;encrypt text in left editor
ValText$ = GetGadgetText(#editor)
If ValText$<>""
Nblines = CountGadgetItems(#editor)
For ni = 0 To Nblines - 1
Encf$ = GetGadgetItemText(#editor,ni,0):Debug Len(Encf$)
If Encf$<>""
AddGadgetItem(#editorcrypt, -1 ,CryptBF(Encf$))
Else
AddGadgetItem(#editorcrypt, -1 ,"")
EndIf
Next
ClearGadgetItemList(#editor)
EndIf
Case #btnDecryptFile ; decrypt text in right editor
ValText$ = GetGadgetText(#editorcrypt)
If ValText$<>""
Nblines = CountGadgetItems(#editorcrypt)
For ni = 0 To Nblines - 1
Decf$ = GetGadgetItemText(#editorcrypt,ni,0)
If Decf$<>""
AddGadgetItem(#editor, -1 ,DecryptBF(Decf$))
Else
AddGadgetItem(#editor, -1 ,"")
EndIf
Next
ClearGadgetItemList(#editorcrypt)
EndIf
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
;-End
End