PDA

View Full Version : تبديل بايت به SHA1



h_mohamadi
یک شنبه 18 اسفند 1392, 14:28 عصر
سلام دوستان گرامي
من مي خواهم در دلفي 7 يک متغير بايت را به SHA1 تبديل کنم و خروجي تابع هم از نوع بايت باشد.
هرچي گشتم فانگشن و يا کامپوننتي که جواب بدهد را پيدا نکردم
مي خواستم بدانم کسي راهي سراغ دارد يا نه؟؟؟

یوسف زالی
یک شنبه 18 اسفند 1392, 15:19 عصر
سلام.
اینها رو ببینید:
http://www.clubdelphi.com/trucos/index.php?id=402
http://fundementals.sourceforge.net/cHash.html

دلفــي
یک شنبه 18 اسفند 1392, 22:08 عصر
با یه کم تغییرات در تابع زیر می تونی به نتیجه ی مورد نظرت برسی :


function SHA1FromString(const AString: string): string;
var
SHA1: TIdHashSHA1;
begin
SHA1 := TIdHashSHA1.Create;
try
Result := SHA1.HashStringAsHex(AString);
finally
SHA1.Free;
end;
end;

یوسف زالی
یک شنبه 18 اسفند 1392, 22:27 عصر
مطمئنید در دلفی 7 ، TIdHashSHA1 وجود داره؟ فکر می کنم ورژن های بالاتر اون رو ساپورت می کنند نه ورژن هفت. شاید هم اشتباه می کنم. در این صورت نام یونیتش رو هم بگذارید.

h_mohamadi
دوشنبه 19 اسفند 1392, 12:19 عصر
ممنونم ولي اينها جواب من را نمي دهد من مي خواهم اين قسمت را به sha1 تبديل کنم ولي نمي شود
بايت وارد شده
0000001202f95276000000000000000030303030393933351c 32303030301c1c1c1c
جواب گرفته شده از sha1
c7820cbd46cb2b752ce464c1dd02a6c0b72ac8a9
ولي توابع ارائه شده در بالا به من اين جواب را نمي دهد
بايت وارده در توابع بالا
0000001202f95276000000000000000030303030393933351c 32303030301c1c1c1c
جواب گرفته شده
67c1b32d6a856db1cad5a2929c030287f34a978b

BORHAN TEC
سه شنبه 20 اسفند 1392, 00:07 صبح
سلام

مطمئنید در دلفی 7 ، TIdHashSHA1 وجود داره؟ فکر می کنم ورژن های بالاتر اون رو ساپورت می کنند نه ورژن هفت. شاید هم اشتباه می کنم. در این صورت نام یونیتش رو هم بگذارید.
این موضوع ربطی به نسخه دلفی نداره و به نسخه Indy مربوط میشه(باید نسخه ۱۰ یا جدیدتر رو نصب کرده باشید.). در خصوص نام یونیتها هم میتونید به اینجا مراجعه کنید:
http://barnamenevis.org/showthread.php?190417-%D9%85%D8%B1%D8%AC%D8%B9-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%AF%D9%84%D9%81%DB%8C&p=1230666&viewfull=1#post1230666

h_mohamadi
سه شنبه 20 اسفند 1392, 08:35 صبح
من نمي خواهم با indy10 کار کنم چون براي ارسال ftp من بايد از ورژن 9 استفاده کنم و 10 مشکل دارد
مي خواستم بدانم فاکشني وجود دارد که مستقلا اين کار را بکند

Mask
سه شنبه 20 اسفند 1392, 16:51 عصر
نیاز به استفاده از indy10 نیست.
از کامپوننت TurboPower LockBox (http://lockbox.seanbdurkin.id.au/HomePage) استفاده کنید.
و کد زیر :

function HashSHA1String(Str: string): string;var
SHA1: TLbSHA1;
SHA1Digest: TSHA1Digest;
begin
SHA1 := TLbSHA1.Create(nil);
try
SHA1.HashString(Str);
SHA1.GetDigest(SHA1Digest);
Result := (BufferToHex(SHA1Digest, SizeOf(TSHA1Digest)));
finally
SHA1.Free;
end;
end;

h_mohamadi
چهارشنبه 21 اسفند 1392, 10:57 صبح
مشکل اصلی اینه که من می خواهم مقداری از نوع آرایه بایت رو هش کنم نه مقداری از نوع استرینگ
برای هش کردن استرینگ کامپوننت ها و یونیت های زیادی رو پیدا کردم ولی مشکل من رو حل نمی کنه
هدف من دادن ورودی از نوع آرایه بایت و دریافت خروجی از نوع آرایه بایت است زیرا من برای کار با پورت از طریق دلفی نیاز به ایجاد چکسامی براساس الگوریتم هش دارم و وقتی هم داده را از پورت دریافت می کنم باید صحت اطلاعات دریافتی از نوع بایت را با ایجاد مجدد چکسام و مقایسه با چکسامی که دریافت کردم بررسی کنم ممنون میشم اگر کمک کنید
من حتی این روش رو هم تست کردم که آرایه بایت رو به استرینگ تبدیل کنم و هش کنم ولی جوابی که می گیرم درست نیست

Mask
چهارشنبه 21 اسفند 1392, 14:07 عصر
مشکل اینجاست که الا سوالتون اشتباست و خودتون هنوز الگوریتم سوالتون رو نمیدونید.
به این نوشته ها دقت کنید :
متغیر بایت چیه ؟ متغیر بایت : از نوع عددی از شماره 0 تا 255 هست.
SHA1 چیه (http://en.wikipedia.org/wiki/SHA-1) :


در این روش شما می توانید رشته ای اندازه-ثابت (fixed length) از یک داده به دست آورید که با روش های ریاضی به صورت "یک طرفه" رمزنگاری شده است.

با توضیحانی که نوشتم . معلوم میشه الگوریتمهای رمزنگاری رشته میگیرند و خروجی رشته دارند .
حالا شما هر مقدار دیگه ای غیر رشته رو میخواهید رمزنگاری کنید, عملیات تبدیلش با خودتونه.
به صورت آنلاین هم میتونید این مقادیر رو چک کنید. (http://tools.aftab.cc/hash/)
و در آخر، اگه مشکل اصلیتون رو بگیدبرای رفعش شاید راه ساده تری باشه.

h_mohamadi
چهارشنبه 21 اسفند 1392, 15:03 عصر
ممنون از پیگیری دوستان
مشکل من اینه:
یک برنامه با دلفی نوشتم که به یک دستگاه جانبی از طریق پورت سریال ارتباط برقرار کنه و پیام هایی را به صورت بایت برای دستگاه بفرسته و پیام هایی را از دستگاه به صورت بایت دریافت کنه
البته این دستگاه یک فایل راهنما برای نحوه ایجاد پیام ها و پروتکلی که می بایست استفاده کنی و ساختار داده ارسالی و دریافتی داره
من داده ای رو که می خوام ارسال کنم رو به صورت آرایه ای از بایت ایجاد کردم حالا باید کد اعتبارسنجی پیامم که برای بررسی صحت اطلاعات دریافتی و ارسالی استفاده می شه با استفاده از الگوریتم در هم سازی SHA-1 به طول بیست بایت بسازم و به انتهای پیامم اضافه کرده و ارسال کنم
ابتدا داده بایت خود را به رشته تبدیل کردم و با کامپوننت ها و اکتیویکس های متفاوت هش کردم ولی نتیجه ای که به من میده درست نیست
بعد به ذهنم رسید خود داده بایت رو هش کنم که تابع یا کامپوننت یا اکتیویکس یا .... که این کار رو انجام بده پیدا نکردم
به نظر شما راه حل چیه؟
مثلا داده زیر رو ایجاد کردم
0000001202f95276000000000000000030303030303539311c 32303030301c1c1c1c
حالا باید کداعتبارسنجی از پیام بالا با الگوریتم هش بسازم که طبق راهنمای دستگاه باید کد زیر ایجادبشه که نمی شه
fcbd4439bddd5eb04b305c0eaa3c0452fc4264d7
حالا کمک:)))):افسرده:

Mask
چهارشنبه 21 اسفند 1392, 20:01 عصر
آیا به صورت دستی این مقدار رو به آخر بسته اضافه کنید ، دستگاه درست کار میکنه؟
و مورد بعدی اینکه از کجا میدونید SHA1 هست؟
شاید SHA2 یا 3 باشه.
در پست قبلی میتونید به صورت آنلاین مقدار Sha1 یه استرینگ رو گرفت . وقتی جوابی که میگیرید مثل خروجی شما نیست ، دو دلیل ممکنه وجود داشته باشه.
اولا از SHA1 استفاده نشده و شاید از الگوریتمهای دیگه ای استفاده شده.
دوم : مقداری که میخواهید رمز کنید درست نیست و شاید به ابتدا و انتهای رشته شما باید چیز دیگه ای ضافه بشه.

h_mohamadi
شنبه 24 اسفند 1392, 11:06 صبح
من به صورت دستی این مقدار رو به انتهای بسته ام اضافه و بسته رو می فرستم دستگاه به من جواب می ده پس به انتها یا ابتدای آن نباید هیچ مقدار دیگری اضافه کرد و فقط اضافه کردن کد اعتبارسنجی به انتهای پیام کافی است
از طرفی در دستورالعمل دستگاه عبارت <با استفاده از الگوریتم در هم سازی SHA-1> ذکر شده است
اما نکته ای که از بررسی الگوریتم درهم سازی SHA-1 به نظرم می رسه اینه که:
در زمان هش کردن یک عبارت رشته ای ، در مرحله اول ابتدا آرایه ای از نوع بایت به اندازه طول رشته ایجاد کرده و سپس کد اسکی هر کارکتر را محاسبه و در مکان در آرایه بایت که معادل مکان کارکتر در رشته است قرار می دهند و در مراحل بعدی عملیات در هم سازی را روی این آرایه انجام می دهند و در انتها هم خروجی اصلی به صورت آرایه ای با طول ثابت 20 بایت است که اگر خروجی تمامی توابع و کامپوننت ها و اکتیویکس های تولید کننده SHA-1 رو بررسی کنید می بینید که خروجی حتی اگر به صورت رشته هم باشد باز هم از نوع هگز بوده که به صورت رشته در آمده است
پس طبق استدلالات من در زمان هش کردن یک آرایه از نوع بایت مرحله اول حذف می شود چون تمامی محتویات آرایه به صورت اسکی هستند و نیاز به تبدیل وجود ندارد و فقط باید درهم سازی صورت بگیرد
حالا به نظرم شما این فکر درسته یا اشتباه؟
البته از همه دوستانی که مشکل من رو پیگیری می کنند سپاسگذارم

h_mohamadi
یک شنبه 25 اسفند 1392, 11:40 صبح
دوستان راه حلی ندارن؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟
البته من بررسی کردم C# این دستور رو داره
public byte[] ComputeHash(
byte[] buffer,
int offset,
int count
)امکان استفاده از dll های c# در دلفی وجود دارد؟

دلفــي
سه شنبه 12 فروردین 1393, 13:14 عصر
ممنونم ولي اينها جواب من را نمي دهد من مي خواهم اين قسمت را به sha1 تبديل کنم ولي نمي شود
بايت وارد شده
0000001202f95276000000000000000030303030393933351c 32303030301c1c1c1c
جواب گرفته شده از sha1
c7820cbd46cb2b752ce464c1dd02a6c0b72ac8a9
ولي توابع ارائه شده در بالا به من اين جواب را نمي دهد
بايت وارده در توابع بالا
0000001202f95276000000000000000030303030393933351c 32303030301c1c1c1c
جواب گرفته شده
67c1b32d6a856db1cad5a2929c030287f34a978b

جوابی که تابع بالا داده بر اساس الگوریتم SHA-1 بوده و کاملا صحیح است ، حالا شما اگه توسط راهنمای دستگاهتون یه جواب دیگه ای باید داشته باشید این موضوع برمیگرده به الگوریتم تبدیل که احتمالا SHA-1 نبوده و از الگوریتم دیگری استفاده شده است .
در فایل ضمیمه شده از شش نوع الگوریتم استفاده شده است .

h_mohamadi
یک شنبه 17 فروردین 1393, 10:33 صبح
سلام
دوستان مشكلم رفع شد
از يك يونيت كه فقط كار تبديل به الگوریتم SHA-1 رو انجام مي داد به نام Crypt.SHA1 استفاده كردم و با كمي دست كاري در توابع آن ورودي رشته رو به بايت تبديل كردم و خروجي مورد نظرم رو گرفتم البته بايد بگم كه هيچ تغييري در الگوريتم ندادم
باتشكر:تشویق: