Merhaba "Delphi Can"lar,
Kendi projelerimde de kullandığım, Library projesi olarak (.dll) yazmış olduğum, Delphi projelerinizde Encryption/Decryption işlemlerinizi yapabileceğiniz, Rijndael - CBC - 128 bit şifreleme kullanan, kolay ve kullanışlı bir projeyi sizlerle paylaşıyorum.
Veri tabanına, ini dosyalara, vs. bazı bilgileri şifreleyip yazmak ve okurken de sadece biz çözebilmek isteriz. Bu kütüphanede aynı metin her şifrelendiğinde kafa karıştırmak için farklı bir şifrelenmiş metin oluşturulur. Ama çözerken aynı sonuca ulaşırız. Bu projeyi derlediğimizde Rijndael.dll oluşturulur. Sonrasında bu dll' i projelerinize import ederek çok kolay bir şekilde kullanabilirsiniz. Ayrıca, şifreleme ve çözme metodlarına 2. parametre olarak 12 karakterli bir şifre göndererek kullanılmakta. Bu şekilde her projeyi farklı bir şifreleme yapısıyla kullanabilirsiniz.
Rijndael.dpr içeriği;
Projenin tamamı ekte yer almaktadır.
Projeye kütüphaneyi ekleme;
(implementation satırı üstüne aşağıdaki iki satır eklenir.)
Kullanım örneği;
Umarım faydalı olur...
Kendi projelerimde de kullandığım, Library projesi olarak (.dll) yazmış olduğum, Delphi projelerinizde Encryption/Decryption işlemlerinizi yapabileceğiniz, Rijndael - CBC - 128 bit şifreleme kullanan, kolay ve kullanışlı bir projeyi sizlerle paylaşıyorum.
Veri tabanına, ini dosyalara, vs. bazı bilgileri şifreleyip yazmak ve okurken de sadece biz çözebilmek isteriz. Bu kütüphanede aynı metin her şifrelendiğinde kafa karıştırmak için farklı bir şifrelenmiş metin oluşturulur. Ama çözerken aynı sonuca ulaşırız. Bu projeyi derlediğimizde Rijndael.dll oluşturulur. Sonrasında bu dll' i projelerinize import ederek çok kolay bir şekilde kullanabilirsiniz. Ayrıca, şifreleme ve çözme metodlarına 2. parametre olarak 12 karakterli bir şifre göndererek kullanılmakta. Bu şekilde her projeyi farklı bir şifreleme yapısıyla kullanabilirsiniz.
Rijndael.dpr içeriği;
library Rijndael;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
DECCipher,
Dialogs,
DECUtil, DECHash, DECFmt;
var
ACipherClass: TDECCipherClass = TCipher_Rijndael;
ACipherMode: TCipherMode = cmCBCx;
AHashClass: TDECHashClass = THash_Whirlpool;
ATextFormat: TDECFormatClass = TFormat_Mime64;
AKDFIndex: LongWord = 1;
{$R *.res}
function StrToHex(const Value: string): string;
var
I: Integer;
begin
Result := '';
for I := 1 to length(value) do
result := result + IntToHex(Ord(Value[I]), 2);
end;
function HexToStr(const Value: string): string;
var
I: Integer;
begin
Result := '';
for I := 1 to length(value) do
begin
if ((I mod 2) = 1) then
begin
result := result + Chr(StrToInt('0x'+ Copy(Value, I, 2)));
end;
end;
end;
function encode (const source: pchar; var out: pchar; key: pchar) : boolean;
var
aes: TCipher_Rijndael;
begin
aes := TCipher_Rijndael.Create;
aes.Init(key);
out := pchar(StrToHex(aes.EncodeBinary(HexToStr(source))));
end;
function decode (const source: pchar; var out: pchar; key: pchar) : boolean;
var
aes: TCipher_Rijndael;
begin
aes := TCipher_Rijndael.Create;
aes.Init(key);
out := pchar(StrToHex(aes.DecodeBinary(HexToStr(source))));
end;
function Encrypt(const AText: WideString; APassword : WideString): WideString;
var
// APassword : WideString;
ASalt: Binary;
AData: Binary;
APass: Binary;
begin
if length(AText) = 0 then begin
result := '';
exit;
end;
with ValidCipher(ACipherClass).Create, Context do
try
ASalt := RandomBinary(16);
APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
Mode := ACipherMode;
Init(APass);
SetLength(AData, Length(AText) * SizeOf(AText[1]));
Encode(AText[1], AData[1], Length(AData));
Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC);
finally
Free;
ProtectBinary(ASalt);
ProtectBinary(AData);
ProtectBinary(APass);
end;
end;
function Decrypt(const AText: WideString; APassword : WideString): WideString;
var
// APassword : WideString;
ASalt: Binary;
AData: Binary;
ACheck: Binary;
APass: Binary;
ALen: Integer;
begin
if length(AText) = 0 then begin
result := '';
exit;
end;
with ValidCipher(ACipherClass).Create, Context do
try
ASalt := ValidFormat(ATextFormat).Decode(AText);
ALen := Length(ASalt) - 16 - BufferSize;
AData := System.Copy(ASalt, 17, ALen);
ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
SetLength(ASalt, 16);
APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
Mode := ACipherMode;
Init(APass);
SetLength(Result, ALen div SizeOf(AText[1]));
Decode(AData[1], Result[1], ALen);
if ACheck <> CalcMAC then
raise Exception.Create('Invalid data');
finally
Free;
ProtectBinary(ASalt);
ProtectBinary(AData);
ProtectBinary(ACheck);
ProtectBinary(APass);
end;
end;
exports Encrypt, Decrypt;
begin
end.
Projenin tamamı ekte yer almaktadır.
Projeye kütüphaneyi ekleme;
(implementation satırı üstüne aşağıdaki iki satır eklenir.)
function Encrypt(const AText: WideString; APassword : WideString): WideString; external 'Rijndael.dll'; function Decrypt(const AText: WideString; APassword : WideString): WideString; external 'Rijndael.dll'; implementation
Kullanım örneği;
var _sifre : WideString; _sifrelenmis : WideString; _cozulmus : WideString; begin _sifre = '123'; _sifrelenmis := Encrypt(sifre,'852357jMl???'); _cozulmus := Decrypt(_sifrelenmis,'852357jMl???'); showmessage(_sifrelenmis); showmessage(_cozulmus); end;
Umarım faydalı olur...


