Criptare de fișiere cu o parolă în delphi (sursă, descărcare) - produse software

Pentru a înțelege mai bine, în tabel nu voi specifica codurile de parolă ale parolei, indic doar scrisorile. Desigur, literele înseamnă codul lor digital.







Cu algoritmul pe care l-am dat seama, acum trebuie să ne gândim la funcția care va cripta octetul folosind increment. Cea mai ușoară cale este să ne certăm xn și dx. Aici:

Această metodă este demnă de remarcat prin faptul că nu are nevoie să creeze o metodă de decriptare, deoarece decryptorul xora este același ca și ksor.

xk: = xn x sau dx;
xdk: = xk x sau dx;

După toate aceste manipulări, xdk va fi egal cu xn. Prin urmare, pentru decriptare, nu este nevoie să creați un decryptor.

Criptarea cu ksor este primitivă și simplă. Există o metodă mai bună. Puteți să adăugați pur și simplu valoarea dx la valoarea inițială a octetului și să o scăpați atunci când îl decriptați. În opinia mea, această metodă este mai bună și mai originală. Dar și aici există o captură. Problema este că valoarea maximă a octetului 28 este de 256, dar avem și zero, ceea ce înseamnă că intervalul de octeți [0..255]. Prin urmare, în cazul în care valoarea inițială a octet este egal cu 245, iar creșterea este de 45, iar în cazul în care stabilesc spirele 290, și atribuirea valorii de dimensiunea variabilă a unui preaplin octet va avea loc și pur și simplu atribuiți-l la 0. Există o cale: puteți lua pur și simplu restul 256. Atunci când decodificați pentru a vedea dacă dx este mai mare decât xn, atunci pur și simplu să scăpați mai întâi dx de la xn și apoi să adăugați 256. Iată cele două funcții:

funcție plus (xn, dx: octet): octet;
începe
rezultat: = (xn + dx) mod 256;
se încheie;

funcția minus (xn, dx: octet): octet;
începe
dacă xn> = dx atunci
rezultat: = xn-dx
altfel
rezultat: = xn-dx + 256;
se încheie;

Deci avem un criptor și un decryptor. Acum, să începem să scriem singure funcțiile de criptare și decriptare.

În primul rând, scriem criptorul.

Funcția CriptFile (
SourceFile: șir; // probabil
DestFile: șir; // acest lucru este de înțeles
Parola: șir; // parola de criptare
Steaguri: DWORD; // steaguri de funcționare
// un indicator pentru progres
): boolean;
etichetă
1; // intrați la îndemână
var
DestHFile, SourceHFile: Thandle;
FSize, i, j, kl, n: DWORD;
CurrentByte: byte;
one_byte_mass, all_mass: real;
începe
Rezultat: = false;
kl: = lungime (parola);

ACF_AutoRename: = (Steaguri și CF_AutoRename) = CF_AutoRename;






ACF_DeleteSource: = (Flags și CF_DeleteSource) = CF_DeleteSource;
ACF_Dest_NOT_CREATE: = (Flaguri și CF_Dest_NOT_CREATE) = CF_Dest_NOT_CREATE;
ACF_ShowProgress: = (Flags și CF_ShowProgress) = CF_ShowProgress;

Procesează steagurile pe care le-am acceptat și apoi le procesăm. Valorile constante CF_ * și ACF_ * vor fi descrise ulterior.

Aici voi explica în detaliu. Consola CF_Dest_NOT_CREATE indică funcția de care aveți nevoie pentru ao cripta în fișierul de căutare, adică fișierul țintă și fișierul destinație sunt aceleași. Dar fișierul intermediar este necesar în orice caz, așa că îl creăm pe unitatea C. Apoi vom înlocui fișierul necesar cu acest fișier intermediar și apoi vom șterge fișierul intermediar.

all_mass: = 0; // această variabilă este necesară pentru progres
SourceHFile: = CreateFile (pchar (SourceFile), GENERIC_READ, FILE_SHARE_READ, zero, OPEN_EXISTING, 0,0);
dacă SourceHFile = INVALID_HANDLE_VALUE atunci
Exit;
DestHFile: = CreateFile (pchar (DestFile), GENERIC_WRITE, FILE_SHARE_READ, zero, CREATE_ALWAYS, 0,0);
dacă DestHFile = INVALID_HANDLE_VALUE atunci
Exit;
FSize: = GetFileSize (SourceHFile, zero);
dacă ACF_ShowProgress atunci
dacă aGauge = nul atunci

ACF_ShowProgress: = false
altfel
<всё правильно: гаугэ указали, получаем вес одного байта в прогрессе гаугэ>
one_byte_mass: = (TGauge (aGauge ^)) MaxValue-TGauge (aGauge ^) MinValue) / FSize;

În plus, există un algoritm diferit de cel indicat la început, dar face același lucru doar mai repede. Este mai rapid, deoarece nu calculează numărul literei care trebuie luată din parolă, este luată de la sine, conform numărului de repetiție din bucla interioară.

pentru i: = 1 până la (FSize div kl) +1
pentru j: = 1 la kl
începe
ReadFile (SourceHFile, CurrentByte, 1, n, 0);

dacă n = 0 atunci ajungem la 1;
CurrentByte: = plus (CurrentByte, ord (parola [j]));
WriteFile (DestHFile, Currentbyte, 1, n, 0);
dacă ACF_ShowProgress atunci
începe
all_mass: = toate_mass + one_byte_mass;
TGauge (aGauge ^) Progres: = rotund (toate_mass);
se încheie;
se încheie;
1:

Iată constantele pe care le-am folosit în această funcție (schimbarea lor nu este recomandată):

const
CF_AutoRename = $ 00000001;
CF_DeleteSource = $ 00000002;
CF_Dest_NOT_CREATE = $ 00000008;
CF_ShowProgress = $ 00000010;

var
ACF_AutoRename: boolean;
ACF_DeleteSource: boolean;
ACF_Dest_NOT_CREATE: boolean;
ACF_ShowProgress: boolean;
Acestea ar trebui să fie descrise în felul următor: constante înainte de implementare și variabile după.

Funcția. DeCriptFile Nu voi descrie, pentru că este exact același lucru, cu doar două diferențe:

și bineînțeles:
CurrentByte: = minus (CurrentByte, ord (parola [j]));

Vorbind de steaguri. Acestea pot fi combinate cu operatorul sau.
Iată un exemplu de utilizare a acestor funcții:

procedura TForm1.Button1Click (expeditor: TObject);
începe
CriptFile (Edit1.Text, "," 123 ", CF_AutoRename sau CF_ShowProgress sau
CF_DeleteSource, @ Gauge1);
se încheie;

procedura TForm1.Button2Click (expeditor: TObject);
începe
DeCriptFile (Edit2.Text, "," 123 ", CF_AutoRename sau
CF_ShowProgress, @ Gauge1);
se încheie;

Pe scurt, uitați-vă la sursă. Totul este acolo. Copiați acest modul într-un folder distribuit pentru delfin, adăugați modulul FileCript la expresia folosită și folosiți-o pentru sănătate.

Descărcări







Trimiteți-le prietenilor: