PDA

View Full Version : راهنمایی Encrypt / Decrypt



amin2dpr
یک شنبه 16 آذر 1393, 02:26 صبح
سلام

من دنبال الگریتم که یه متغییر String رو Encrypt / Decrypt کنه و با خروجی String تحویل بده که فارسی رو هم ساپورت کنه هستم

هرچی تو انجمن و سایت ها گشتم مطلبی پیدا نکردم که مشکل من حل کنه

ممنون میشم اگه راهنمایی کنید

دلفــي
یک شنبه 16 آذر 1393, 10:41 صبح
function EncryptStr(const S: String; Key: Word): String;
var I: Integer;
const C1 = 53761;
C2 = 32618;
begin
Result := S;
for I := 1 to Length(S) do begin
Result[I] := char(byte(S[I]) xor (Key shr 8));
Key := (byte(Result[I]) + Key) * C1 + C2;
end;
end;

function DecryptStr(const S: String; Key: Word): String;
var I: Integer;
const C1 = 53761;
C2 = 32618;
begin
Result := S;
for I := 1 to Length(S) do begin
Result[I] := char(byte(S[I]) xor (Key shr 8));
Key := (byte(S[I]) + Key) * C1 + C2;
end;
end;

یوسف زالی
یک شنبه 16 آذر 1393, 11:56 صبح
سلام.
اگرچه من گشتم و بود، اما براتون توضیح می دم:
شما علاوه بر استفاده از الگوریتم هایی مثل زیپ (:بامزه:) به همراه پسورد روی حافظه (که پروسه طولانی ای داره) می تونید بصورت سفارشی الگوریتم خودتون رو پیاده کنید.
این الگوریتم ها می تونند بازگشت پذیر یا بازگشت ناپذیر باشند.
الگوریتم های بازگشت ناپذیر معمولا طول های کوتاهی می دند، مثل HashCode ها، SHA1 و این چیزا، و معمولا برای ذخیره رمز عبور مناسب هستند.
الگوریتم های بازگشت پذیر برای ذخیره یا انتقال داده مورد استفاده قرار می گیرند.
این الگوریتم ها با افزایش طول داده، خروجی شون افزایش پیدا می کنه.
بهترین الگوریتم ها اونهایی هستند که به ازای افزایش n بایت، در خروجی چیزی غیر از n بایت افزایش داشته باشند. یعنی بصورت یک به یک نباشند.
نکته دیگه این که اگر قراره مثلا A بشه X، در همه جای متن نباید A بشه X (ماشین انیگما از همین روش استفاده می کرد) ولی بدونید که ممکنه حتی گاهی A بشه A (ماشین انیگما رو از همین نقطه ضعف رمزگشایی کردند!!)
کدینگ مورد استفاده باید دامنه از قبل تعریف شده ای داشته باشه، مثلا اگر فقط قراره اعداد رو ساپورت کنه، می تونید دو عدد رو در یک بایت خلاصه کنید تا اوضاع پیچیده تر بشه.
در نهایت می تونید از Salt کردن استفاده کنید، به این معنی که بخشی رو بصورت دستی وارد داده می کنید تا رمزگشایی اون سخت تر بشه.

الگوریتم های ساده ای مثل شیفت بیتی، و جمع و منها با یک عدد می تونن مورد استفاده باشن، تا XOR و الگوریتم های پیچیده تری که حساس به مکان حضور کاراکتر در رشته باشند.
عجیبه که هنوز برنامه هایی رو می بینم که رمز گذاری شون آدم رو به خنده می ندازه، یکی از همین برنامه ها رو (اسم نمی برم، فقط بدونید داده هاش برای تولید جدول بود) همین پریروز ظرف 3 دقیقه تشخیص دادم و در 5 ساعت براش دیکد نوشتم.
این رو هم در نظر داشته باشید که هرقدر الگوریتم پیچیده تر باشه، دیکدش بیشتر طول می کشه. پس باید تصمیم درستی در این زمینه بگیرید.

یکی از الگوریتم های خودم رو براتون می گذارم. فقط محض راه افتادن دست شما:


uses StrUtils, Math;


function CodeIt(s, key: string): string;
var
b, k: byte;
i, j: integer;
begin
Result := '';
Randomize;
s := IntToHex(length(s), 4) + s;
s := s + DupeString(Chr(RandomRange(33, 120)), 16 -length(s) mod 16);
i := 0;
j := 0;
k := RandomRange(0, 255);
repeat
inc(i);
if i > length(s) then Break;
j := (j mod length(key)) +1;
b := Ord(s[i]);
b := b xor k xor Ord(key[j]);
Result := Result + IntToHex(b, 2);
until false;
Result := IntToHex(k, 2) + ReverseString(Result) + IntToHex(RandomRange(0, 255), 2);
end;


function HexToByte(Hex: string): byte;
function HexToHalf(X: char): byte;
begin
case X of
'0'..'9': Result := Ord(X) -48;
else Result := Ord(X) -55;
end;
end;


begin
Result := 0;
Result := HexToHalf(Hex[1]) * 16 + HexToHalf(Hex[2]);
end;


function DecodeIt(s, key: string): string;
var
b, k: byte;
t: string;
i, j: integer;
begin
Result := '';
t := Copy(s, 1, 2);
k := HexToByte(t);
Delete(s, 1, 2);
s := Copy(ReverseString(s), 3, length(s));
i := 0;
j := 0;
t := '';
repeat
inc(i, 2);
if i > length(s) then Break;
j := (j mod length(key)) +1;
b := HexToByte(s[i -1] + s[i]);
b := b xor k xor Ord(key[j]);
Result := Result + Chr(b);
until false;
t := Copy(Result, 1, 4);
Delete(Result, 1, 4);
j := HexToByte(t[1] + t[2]) * 256 + HexToByte(t[3] + t[4]);
Result := Copy(Result, 1, j);
end;


procedure TForm1.CodeBtnClick(Sender: TObject);
begin
Edit2.Text := CodeIt(Edit1.Text, 'yousef zalli');
end;


procedure TForm1.DecodeBtnClick(Sender: TObject);
begin
Caption := DecodeIt(Edit2.Text, 'yousef zalli');
end;




این الگوریتم برای متنی مثل salam در هر دفعه یک چیز می ده، در هر کدوم هم a ها با هم تفاوت دارند.
طول خروجی در این الگوریتم رابطه یک به یک با ورودی نداره.
الگوریتم سالت شده.
الگوریتم کلید داره.

amin2dpr
یک شنبه 16 آذر 1393, 12:30 عصر
ببخشیذ کدو وارد کردم میکنم ولی موقع Compile این خطا رو میده

[Hint] Test.dpr(101): Value assigned to 'HexToByte' never used

amin2dpr
یک شنبه 16 آذر 1393, 12:50 عصر
دست درد نکنه You-See
من از دلفی 7 استفاده میکنم از اونجایی که آشنایی کمی با دلفی دارم گفتم که ذکر کنم
من دارم یک برنامه درست میکنم که تمام خطهای یک فایل متنی رو در متغیر با عنوان All: string; ثبت میکنه میخوام این کدی که دادین اونو در صورتی اینکریپ باشه دیکریپت کنه و بلعکس
ممنون میشم از دوستان اگه می تونن راهنمایی کنید

یوسف زالی
یک شنبه 16 آذر 1393, 13:16 عصر
می تونید از الگوریتم های متقارن استفاده کنید.
این الگوریتم نمی تونه تشخیص بده که کد شده دارید بهش می دید یا دیکد شده.
اصولا هیچ الگوریتمی نمی تونه تشخیص بده.

amin2dpr
یک شنبه 16 آذر 1393, 14:42 عصر
میشه به این کد نگاه کنید و کدهای Encryption و Decryption در جاهای مشخص قرار بدید

متغییری که کد و اینکد میشه از نوع String هستش All میخوام فایل کد شده و یا اینکد شده هم از نوع String باشه

من با دلفی 7 کار میکنم



library Test;

uses
SysUtils, Windows, Classes, System;

{$R *.res}
procedure Test1; cdecl;

var
F : TextFile;
s: string;
All: string;
Begin
All := '';
AssignFile(F, 'D:\Code.txt');
Reset(F);
while not Eof(F) do
begin
Readln(F, s);
All := All + CHR(13)+CHR(10) + s;
end;
////////////////
/////////Encryption "All"
////////////////
end;

procedure Test2; cdecl;

var
F : TextFile;
s: string;
All: string;
Begin
All := '';
AssignFile(F, 'D:\Code.txt');
Reset(F);
while not Eof(F) do
begin
Readln(F, s);
All := All + CHR(13)+CHR(10) + s;
end;
////////////////
/////////Decryption "All"
////////////////
end;
exports
Test1, Test2;
begin
end.

Mask
یک شنبه 16 آذر 1393, 16:24 عصر
حاجی روانیه این کدهاتم به خدا
این که هر دفعه یه کد تولید میشه، خیلی جالبه.
البته برای من روی DXe فارسی رو جواب نداد. فقط انگلیسی رو جواب داد.

یوسف زالی
یک شنبه 16 آذر 1393, 18:36 عصر
کدها یونیکد نیست و ورژن هفتیه. ورژن بالاترش رو برات می دم. خصوصی بیا.

hadisalahi2
چهارشنبه 15 بهمن 1393, 09:36 صبح
کدها یونیکد نیست و ورژن هفتیه. ورژن بالاترش رو برات می دم. خصوصی بیا.

من همینک به این نتیجه ای رسیدم که حمزه رسیده
فارسی رو جواب نمیده
لطفا اگه میشه بزار تا ما هم از اون جدیداش استفاده کنیم :لبخند:

یوسف زالی
چهارشنبه 15 بهمن 1393, 12:17 عصر
هادی شب بیا ریموت بده رو سیستمت درست کنم، یونیکد ورژن دلفی رو نصب ندارم.

hadisalahi2
چهارشنبه 15 بهمن 1393, 16:36 عصر
هادی شب بیا ریموت بده رو سیستمت درست کنم، یونیکد ورژن دلفی رو نصب ندارم.
متاسفانه شب در منزل نت ندارم و الان هم در محل کار فقط نت دارم

اگه از دست خودم بر میاد بگو تا انجام بدم
من دلفی XE2 کار میکنم

یوسف زالی
چهارشنبه 15 بهمن 1393, 19:21 عصر
با تریس کردن قدم به قدم باید ببینید که کاراکتر های یونیکد که حالا دو بایتی هستند، چطور باید در توابع، عملیاتی بشن، مثلا byte و Ord و این چیزا رو باید بازنگری کنید.
توابع رشته ای رو هم باید تریس کنید ببینید که ورودی / خروجی شون به چه نحوه.
همین.
خیلی سخت نیست.

gholami146
چهارشنبه 15 بهمن 1393, 19:43 عصر
سلام دوست عزیز چطوری تو انجمن گشتی و تو نت که پیداش نکردی من حتی خودم یادم میاد کامپوننتی رو برای همین کار بهمرته آموزش استفاده از اون تو انجمن قرار دادم که اگه بگردی پیداش می کنی
این کامپوننت خیلی با ارزش دانلود کنید

{توضیح مدیر: ممکنه خیلی ها مسلمان نباشند. اجرتون با خدا}