View Full Version : آموزش: رمز کردن اطلاعات در دلفی توسط کامپوننت
gholami146
دوشنبه 22 مهر 1392, 20:58 عصر
با سلام خدمت تمامی دوستان عزیزم من این تاپیک رو قبلا در بخش دلفی و ویندوز ایجاد کردم ولی هرگز مقالات ارسالی من تایید نشد و به نمایش در نیومد
بنا بر این تصمیم گرفتم تا در اینجا مطرح کنم
خوب
در این تاپیک قصد دارم تا شما رو با یک کامپوننت اوپن سورس آشنا کنم که بسیار پر کاربرد است برای تمامی برنامه نویسان دلفی و سی .
کار این کامپوننت که دارای دو بخش هست اینکریپت و دی کریپت اطلاعات و بدست آوردن مقادیر یکتا برای فایل ها و رشته ها است که یک لیست مختصر رو در زیر برای شما عزیزان قرار میدم
Encryption Algorithms Hash Algorithms
Blowfish Haval
Cast 128 MD4
Cast 256 MD5
DES, 3DES RipeMD-128
Ice, Thin Ice, Ice2 RipeMD-160
IDEA SHA-1
Mars SHA-256, SHA-384, SHA-512
Misty1 Tiger
RC2, RC4, RC5, RC6
Rijndael (the AES)
Serpent
Tea
Twofish
البته باید این رو بگم باید صبور باشیدچون الان مشکلات زیادی دارم و ممکنه پست های این تابیک با تاخیر بروز رسانی بشه
gholami146
دوشنبه 22 مهر 1392, 21:01 عصر
ابتدا برای شروع به کار برای شما عزیزان این کامپوننت رو برای دانلود قرار میدم این کامپوننت از دلفی 7 تا XE3 توسط خودم نصب و کاملا بدون مشکل بوده
nilidelphi
سه شنبه 23 مهر 1392, 13:33 عصر
اکثر الگوریتم های موجود در کامپوننت هاا مربوط به روش های سیمیتریک یا private key هستند
اگر دوستان اطلاعاتی در مورد public key و الگوریتم های پیاده سازی این روش و همچنین استفاده این الگوریتم ها در پایگاه داده میباشند بیایید تبادل اطلاعات کنیم
gholami146
چهارشنبه 24 مهر 1392, 18:18 عصر
کامپوننت فوق به ذو قسمت Ciphers و Hashes تقسیم می شود
بخش Hashes ها دارای توابعی هست که بدون بازگشت هستند و یعنی این توابع بدین صورت طراحی شده اند که برای هر بیت از داده ها کلیدی مخصوص ان را ایجاد می کند و فقط از طریق تسط و خطا میتوان به شناسایی ان دست یافت اما در گروه دوم یعنی Ciphers ها دارای یک کلید عمومی می باشد که معمولا توسط یک یا در گاهی اوقات دو کلید اقدام به کد کردن اظلاعات می کند که به این توابع توابع بازگشتی نیز گفته می شود (اکثر برنامه نویسان از این توابع برای ایجاد قفل های نرم افزاری استفاده می شود که به این قفل ها در میان برنامه نویسان به قفل های اکتیو ایکس گفته می شود )
خوب در اینجا یک مثال رو قرار میدم که با استفاده از اون شما می توانید یک کلید هش برای یک فایل رو بدست بیارید
procedure TForm1.Button1Click(Sender: TObject);
var
Hash: TDCP_ripemd160;
Digest: array[0..19] of byte; // RipeMD-160 produces a 160bit digest (20bytes)
Source: TFileStream;
i: integer;
s: string;
begin
Source:= nil;
try
Source:= TFileStream.Create(Edit1.Text,fmOpenRead); // open the file specified by Edit1
except
MessageDlg('Unable to open file',mtError,[mbOK],0);
end;
if Source <> nil then
begin
Hash:= TDCP_ripemd160.Create(Self); // create the hash
Hash.Init; // initialize it
Hash.UpdateStream(Source,Source.Size); // hash the stream contents
Hash.Final(Digest); // produce the digest
Source.Free;
s:= '';
for i:= 0 to 19 do
s:= s + IntToHex(Digest[i],2);
Edit2.Text:= s; // display the digest
end;
end;
از تب کامپوننت ها یک TDCP_ripemd160 رو بر روی فرم قرار دهید
توجه داشته باشید که برای استفاده از هر یک از این کامپوننت ها باید یک بافر برای ان از نوع ارایه و از نوه بایت ایجاد کرد که اکثر این کامپوننت ها در قسمت انتهایی نام خود مقدار بیت مورد نیاز خود را معرفی می نماید که در این مثال چون هش ما 160 بیت است باید ارایه ای از نوع Byte بطول 20 بایت تعریف شود زیرا هر 8 بیت یک بایت می شود پس 20*8=160
حال یک ادیت باکس رو بر روی فرم قرار داده و در اون ادرس فایل مورد نظرتون رو قرار دهید البته این کار رو می تونید در ران تایم هم انجام بدید یا از یک اوپن فایل دیالوگ استفاده کنید
حال یک ادیت دیگه بر روی فرم قرار دهید و نام اون رو به ادیت 2 تغییر بدید البته در صورتی که نامش متفاوت باشه خوب برنامه رو اجرا کنید و جواب رو مشاهده کنید
امید وارم از این جلسه کوتاه کمال استفاده رو برده باشید البته باید به عرض برسونم قصد دارم در انتهای اموزش این تاپیک یک قفل نرم افزاری بسیار ساده رو طراحی کنیم و با کمک دوستان اون رو کاملش کنیم
gholami146
چهارشنبه 24 مهر 1392, 18:24 عصر
جدول زیر مقادیر مربوط به حافظه های مورد نیاز برای هر کدام می باشد
Ciphers
Name Patents Block Size Max Key Size*
Blowfish None 64 bits 448 bits
Cast-128 None 64 bits 128 bits
Cast-256 Patented? 128 bits 256 bits
DES None 64 bits** 64 bits
3DES None 64 bits 192 bits
Ice None? 64 bits 64 bits
Thin Ice None? 64 bits 64 bits
Ice 2 None? 64 bits 128 bits
IDEA Free for non-commercial use 64 bits 128 bits
MARS Patented? 128 bits 1248 bits
Misty1 Free for non-commercial use 64 bits 128 bits
RC2 None 64 bits 1024 bits
RC4 None N/A 2048 bits
RC5 Patented 64 bits 2048 bits
RC6 Patented 128 bits 2048 bits
Rijndael (AES) None 128 bits 256 bits
Serpent None 128 bits 256 bits
TEA None 64 bits 128 bits
Twofish None 128 bits 256 bits
Hash Algorithms
Name Patents Digest Size
Haval None 128, 160, 192, 224, 256 bits*
MD4 None 128 bits
MD5 None 128 bits
RipeMD-128 None 128 bits
RipeMD-160 None 160 bits
SHA-1 None 160 bits
SHA-256 None 256 bits
SHA-384 None 384 bits
SHA-512 None 512 bits
Tiger None 192 bits
gholami146
پنج شنبه 25 مهر 1392, 20:40 عصر
Ciphers - TDCP_cipher
در این بخش میخواهیم در مورد Ciphers - TDCP_cipher مطالبی را عرض کنم
تمامی کامپوننت های موجود در این تب ار TDCP_cipher بصورت inherited مشتق گردیده است و دارای یک سری توابع پایه می باشد که در انها بصورت مشترک می باشد که لیست انها را برای شما قرار می دهم
property Initialized: boolean;
property Id: integer;
property Algorithm: string;
property MaxKeySize: integer;
class function SelfTest: boolean;
procedure Init(const Key; Size: longword; InitVector: pointer);
procedure InitStr(const Key: string; HashType: TDCP_hashclass);
procedure Burn;
procedure Reset;
procedure Encrypt(const Indata; var Outdata; Size: longword);
procedure Decrypt(const Indata; var Outdata; Size: longword);
function EncryptStream(InStream, OutStream: TStream; Size: longword): longword;
function DecryptStream(InStream, OutStream: TStream; Size: longword): longword;
function EncryptString(const Str: string): string;
function DecryptString(const Str: string): string;
برای اشنایی بیشتر چند مثال
مثال 1 کد و دی کد کردن رشته ها
د ر این مثال رشته های موجود در داخل کامپوننت Memo توسط TDCP_rc4 کد و دیکد می شود
procedure TForm1.btnEncryptClick(Sender: TObject);
var
i: integer;
Cipher: TDCP_rc4;
KeyStr: string;
begin
KeyStr:= '';
if InputQuery('Passphrase','Enter passphrase',KeyStr) then // get the passphrase
begin
Cipher:= TDCP_rc4.Create(Self);
Cipher.InitStr(KeyStr,TDCP_sha1); // initialize the cipher with a hash of the passphrase
for i:= 0 to Memo1.Lines.Count-1 do // encrypt the contents of the memo
Memo1.Lines[i]:= Cipher.EncryptString(Memo1.Lines[i]);
Cipher.Burn;
Cipher.Free;
end;
end;
procedure TForm1.btnDecryptClick(Sender: TObject);
var
i: integer;
Cipher: TDCP_rc4;
KeyStr: string;
begin
KeyStr:= '';
if InputQuery('Passphrase','Enter passphrase',KeyStr) then // get the passphrase
begin
Cipher:= TDCP_rc4.Create(Self);
Cipher.InitStr(KeyStr,TDCP_sha1); // initialize the cipher with a hash of the passphrase
for i:= 0 to Memo1.Lines.Count-1 do // decrypt the contents of the memo
Memo1.Lines[i]:= Cipher.DecryptString(Memo1.Lines[i]);
Cipher.Burn;
Cipher.Free;
end;
end;
مثال 2
کد و دیکد کردن یک فایل توسط همین کامپوننت TDCP_rc4
procedure TForm1.btnEncryptClick(Sender: TObject);
var
Cipher: TDCP_rc4;
KeyStr: string;
Source, Dest: TFileStream;
begin
KeyStr:= '';
if InputQuery('Passphrase','Enter passphrase',KeyStr) then // get the passphrase
begin
try
Source:= TFileStream.Create(boxInputFile.Text,fmOpenRead);
Dest:= TFileStream.Create(boxOutputFile.Text,fmCreate);
Cipher:= TDCP_rc4.Create(Self);
Cipher.InitStr(KeyStr,TDCP_sha1); // initialize the cipher with a hash of the passphrase
Cipher.EncryptStream(Source,Dest,Source.Size); // encrypt the contents of the file
Cipher.Burn;
Cipher.Free;
Dest.Free;
Source.Free;
MessageDlg('File encrypted',mtInformation,[mbOK],0);
except
MessageDlg('File IO error',mtError,[mbOK],0);
end;
end;
end;
procedure TForm1.btnDecryptClick(Sender: TObject);
var
Cipher: TDCP_rc4;
KeyStr: string;
Source, Dest: TFileStream;
begin
KeyStr:= '';
if InputQuery('Passphrase','Enter passphrase',KeyStr) then // get the passphrase
begin
try
Source:= TFileStream.Create(boxInputFile.Text,fmOpenRead);
Dest:= TFileStream.Create(boxOutputFile.Text,fmCreate);
Cipher:= TDCP_rc4.Create(Self);
Cipher.InitStr(KeyStr,TDCP_sha1); // initialize the cipher with a hash of the passphrase
Cipher.DecryptStream(Source,Dest,Source.Size); // decrypt the contents of the file
Cipher.Burn;
Cipher.Free;
Dest.Free;
Source.Free;
MessageDlg('File decrypted',mtInformation,[mbOK],0);
except
MessageDlg('File IO error',mtError,[mbOK],0);
end;
end;
end;
مثال 3
در این مثال به شما طریقه کد و دیکد کردن اطلاعات یک پکیج را در شبکه توضیح می دهد
type
TSomePacket= record
Date: double;
ToUserID: integer;
FromUserID: integer;
MsgLen: integer;
Msg: string;
end;
procedure EncryptPacket(Cipher: TDCP_cipher; var Packet: TSomePacket);
// encrypt the information packet with the cipher
// if the cipher isn't initialized then prompt for passphrase
begin
if Cipher= nil then
raise Exception.Create('Cipher hasn''t been created!')
else
begin
if not Cipher.Initialized then // check the cipher has been initialized
Cipher.InitStr(InputBox('Passphrase','Enter passphrase',''),TDCP_sha1);
if Cipher is TDCP_blockcipher then // if a block cipher use CFB 8bit as encrypting small packets
TDCP_blockcipher(Cipher).CipherMode:= cmCFB8bit;
// encrypt the record part by part, could do this in one go if it was a packed record
Cipher.Encrypt(Packet.Date,Packet.Date,Sizeof(Pack et.Date));
Cipher.Encrypt(Packet.ToUserID,Packet.ToUserID,Siz eof(Packet.ToUserID));
Cipher.Encrypt(Packet.FromUserID,Packet.FromUserID ,Sizeof(Packet.FromUserID));
Cipher.Encrypt(Packet.MsgLen,Packet.MsgLen,Sizeof( Packet.MsgLen));
Cipher.Encrypt(Packet.Msg[1],Packet.Msg[1],Length(Packet.Msg)); // slightly different for strings
// don't bother resetting the cipher, instead keep the chaining information
end;
end;
امیدوارم از این آموزش استفاده کامل رو برده باشید
gholami146
پنج شنبه 25 مهر 1392, 20:54 عصر
Hash Algorithms - TDCP_hash
در این بخش قست دارم کلاس TDCP_hash را بصورت مختصر معرفی کنم این کلاس هم دارای کامپوننت هایی هست که از ان مشتق شده اند اما توابع پایه ان توابع ذکر شده زیر هستند
property Initialized: boolean;
property Id: integer;
property Algorithm: string;
property HashSize: integer;
class function SelfTest: boolean;
procedure Init;
procedure Final(var Digest);
procedure Burn;
procedure Update(const Buffer; Size: longword);
procedure UpdateStream(Stream: TStream; Size: longword);
procedure UpdateStr(const Str: string);
در اینجا مثالی را که قبلا قرار داده بودم قرار می دهم که با استفاده از ان می توان کدی همانند CRC32 برای هر فایل تولید نمود
procedure TForm1.Button1Click(Sender: TObject);
var
Hash: TDCP_ripemd160;
Digest: array[0..19] of byte; // RipeMD-160 produces a 160bit digest (20bytes)
Source: TFileStream;
i: integer;
s: string;
begin
Source:= nil;
try
Source:= TFileStream.Create(Edit1.Text,fmOpenRead); // open the file specified by Edit1
except
MessageDlg('Unable to open file',mtError,[mbOK],0);
end;
if Source <> nil then
begin
Hash:= TDCP_ripemd160.Create(Self); // create the hash
Hash.Init; // initialize it
Hash.UpdateStream(Source,Source.Size); // hash the stream contents
Hash.Final(Digest); // produce the digest
Source.Free;
s:= '';
for i:= 0 to 19 do
s:= s + IntToHex(Digest[i],2);
Edit2.Text:= s; // display the digest
end;
end;
gholami146
پنج شنبه 25 مهر 1392, 20:56 عصر
در قسمت بعدی تصمیم به ساخت برنامه ای داریم که اقدام به تولید کد برای برنامه ها کند تا کاربران با استفاده از ان اقدام به رجیستر کردن برنامه ها کنند
البته این اموزش صرفا جهت اشنایی بیشتر با این کامپوننت می باشد
ATULICUS
سه شنبه 26 آذر 1392, 09:55 صبح
سلام به همگی !
مبحث بسیار جالب و مفیدی رو راه انداختید
کاش ادامش بدید !
arkia
یک شنبه 29 دی 1392, 23:44 عصر
سلام.
میشه دیتایی که تو دلفی رمز کردیم رو توی PHP رمزگشایی کنیم؟ یا بالعکس! اگه تابحال با هر الگوریتمی انجام دادید لطفا یک نمونه قرار بدید ممنون.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.