PDA

View Full Version : روش رمزگذاری و رمز نگاری داده های ثابت



daryooosh
شنبه 10 فروردین 1398, 15:14 عصر
با سلام خدمت همه ی دوستان عزیز
من برنامه نویسی c برای سیستم های جاسازی شده انجام میدم.در یک پروژه ای یک شبکه با تعدادی کلاینت و یک سرور دارم که به صورت بی سیم با هم متصل هستند.(تکنولوژی بیسیم RF) .یک پروتکل خودساخته هم براشون پیاده کردم که از اصول پروتکل TCPIP و هم خانوده هاش استفاده میکنه.به عنوان مثال هر نقطه آدرس منحصر به فرد داره,به دلایلی 4 آدرس برای برودکست داره ,هرکلاینت فقط به سرور میتونه وصل بشه و تبادل اطلاعات به صورت دستور-پاسخ است.

تا اینجا تقریبا همه چیز خوبه به غیر از بحث امنیت شبکه.
قبل از بحث امنیت بگم که در این شبکه همیشه داده های ثابتی انتقال پیدا میکنه.به عنوان مثال بین کلاینت شماره 1 و سرور فقط داده های A و B انتقال داده میشه.و بین کلاینت شماره 2 و سرور فقط داده های CوD انتقال داده میشود و به همین ترتیب.من میخام این داده های ثابت در هر دستور تفاوت پیدا کنه به طوری که قابل پیشبینی نباشه در دستور بعدی داده به چه چیزی تغییر خواهد کرد.

چیزی که من دنبال آن هستم یه روش کدگذاریه که با یک کلید ثابت بتونه این داده های ثابت رو هر بار به یک چیز تغییر بده و بشه در طرف گیرنده دوباره اون رو به حالت اولش برگرداند.


ممنون میشم از دوستان اگه راهنمایی کنید.

golbafan
شنبه 10 فروردین 1398, 16:09 عصر
اغلب الگوریتم های رمزنگاری امروزی این طور هستند و نیاز شما رو براورده میکنن
برای مثال میتونی از AES + hash time + salt استفاده کنی

daryooosh
شنبه 10 فروردین 1398, 16:55 عصر
اغلب الگوریتم های رمزنگاری امروزی این طور هستند و نیاز شما رو براورده میکنن
برای مثال میتونی از AES + hash time + salt استفاده کنی

خیلی ممنون دوست عزیز

درباره ی AES اطلاعات کمی دارم,آیا HASH TIME و SALT متد های جداگانه ای هستند که باید با هم مخلوط بشند(با هم دیگه به کار گرفته شوند)؟میشه کمی بیشتر توضیح بدید؟

ممنون

daryooosh
شنبه 10 فروردین 1398, 17:42 عصر
اغلب الگوریتم های رمزنگاری امروزی این طور هستند و نیاز شما رو براورده میکنن
برای مثال میتونی از AES + hash time + salt استفاده کنی
در مورد HASH TIME مطلبی پیدا نکردم میشه در موردش توضیح بدید؟

daryooosh
شنبه 10 فروردین 1398, 20:21 عصر
اغلب الگوریتم های رمزنگاری امروزی این طور هستند و نیاز شما رو براورده میکنن
برای مثال میتونی از AES + hash time + salt استفاده کنی


اغلب الگوریتم های رمزنگاری امروزی این طور هستند و نیاز شما رو براورده میکنن
برای مثال میتونی از AES + hash time + salt استفاده کنی

ممنون دوست عزیز
در مورد سه مورد گفته شده من تحقیق کردم , هیچکدام برای کار من مفید نبود,بنابراین نتیجه میگیریم که شما منظور من رو خوب متوجه نشده اید.اجازه بدید واضح تر بگم :

من دو تا سیستم دارم که به صورت بیسیم با هم در ارتباط هستند.تکنولوژی بیسیم RF است که شنود و هک آن کار خیلی راحتی است.
روش کار سیستم ها به صورت ساده :
سیستم شماره 1 دارای یک کلید است.
سیستم شماره 2 دارای یک کلید و یک لامپ است.
زمانی که روی سیستم شماره 1 کلید رو در حالت روشن قرار میدیدم,در سیستم شماره 2 کلید به صورت اتوماتیک روی حالت روشن میره و لامپ روشن میشه,برای خاموش شدن هم همین سناریو اجرا میشه.
زمانی که روی سیستم شماره 2 کلید رو در حالت روشن قرار میدیم,لامپ روشن میشه و در سیستم شماره 1 کلید به طور اتوماتیک روی حالت روشن میره,برای خاموش شدن هم همین سناریو اجرا میشه.

هنگامی که در هر یک از این سیستم ها کلید تغییر وضعیت بده ,یک دستور که حاوی وضعیت فعلی کلید است برای سیستم دیگر ارسال میشود تا سیستم دیگر هم تغییر وضعیت دهد.

فرمت دستور به دلیل اینکه شبکه ی واقعی بیش از دو کلاینت(سیستم) دارد و هر کلاینت بیش از یک کار انجام میده به صورت زیر است:
وضعیت کلید(برای مثال ما)+آدرس کلاینت+آدرس سرور

به عنوان مثال :
آدرس سرور (سیستم شماره 1): 0xAA
آدرس کلاینت(سیستم شماره 2) : 0xBB
وضعیت کلید اگر لامپ شروع شود : 0x01
وضعیت کلید اگر لامپ خاموش شود : 0x00

در کل مدت زمان کار سیستم فقط دو دستور زیر ردوبدل میشوند :
برای روشن شدن لامپ: 0xAA+0xBB+0x01
برای خاموش شدن لامپ : 0xAA+0xBB+0x00

حالا هر کس بیاد کانال ارتباطی ما رو استراق سمع کنه(که کاری بسیار راحت است) به کد های دسترسی پیدا میکند و میتواند با ارسال همان کد ها (که باز هم کاری بسیار راحت است) شبکه رو کنترل کند.

حالا بررسی روش های مختلف :

الف hash :
مزایا برای هدف ما :
هیچ

معایب برای هدف ما :
1.دو دستور بالا دو مقدار hash ثابت تولید میکنند.که در صورت شنود آن ها دوباره ........ .
2. و .....


ب رمزنگاری با AES :
مزایا برای هدف ما :
1.در صورتی که کلید رمزگذاری ثابت باشد هیچ.

معایب برای هدف ما :
1.در صورتی که کلید رمز نگاری ثابت باشد ,دوباره برای دو دستور بالا ,دو دستور رمزگذاری شده ی ثابت داریم که اگر شنود شوند ........ .
2.برای سیستم های جاسازی شده ,از انجایی که سخت افزار محدودی دارد و روش AES نسبتا سنگین است .(در صورتی که مشکل اول حل شود,میشود از این مورد چشم پوشی کرد.).
3 و ......

ج salt :
این روش هم که مکمل hash است,وقتی hash جواب ندهد این هم فایده ای ندارد.


د روش خودم :
من خودم میخاستم از رمزنگاری به کمک XOR استفاده کنم,که باز هم در صورت ثابت بودن کلید مشکلات گفته شده رو داشت.برای رفع مشکل گفتم کلید متغییر ایجاد میکنم,به صورت زیر :

1.برای اولین ارتباط کلید به صورت از پیش تعیین شده است.
2.هر دستوری که ارسال میشود,کلید رمزنگاری دستور بعدی رو مشخص میکنه.بنابر این فرمت دستور ها هم به صورت زیر تغییر کرد :کلید برای رمز نگاری دستور بعدی +وضعیت کلید(برای مثال ما)+آدرس کلاینت+آدرس سرور
3.فقط سرور کلید های بعدی را مشخص میکند : همونطور که گفتم دستورات به صورت دستور-پاسخ هستند.دو حالت زیر را داریم:
*سرور (سیستم 1) به کلاینت (سیستم 2) دستور میدهد و کلاینت پس از دریافت دستور ,پاسخی مبنی بر در یافت دستور برای سرور ارسال میکند.
** کلاینت به سرور دستور میدهد و سرور پس از دریافت دستور,پاسخی مبنی بر دریافت دستور برای کلاینت ارسال میکند.
بنابر این در حالت * سرور در دستور ارسالی به کلاینت کلید بعدی رو رمشخص میکند و در حالت ** در پاسخی ک به کلاینت میدهد کلید بعدی رو مشخص میکند.


مشکل روش خودم اینه که در حالت * سرور به کلاینت یک دستور میدهد و کلید جدید را همراه آن ارسال میکند,کلاینت کلید جدید را ذخیره کرده و پاسخ دستور را به سرور باز میگرداند,حالا به هر دلیلی ممکن است که پاسخ به سرور نرسد,سرور چون پاسخ را دریافت نکرده فکر میکند که کلاینت هم دستور را دریافت نکرده است بنابر این از کلید جدید که در دستور بود صرف نظر میکند.حالا اگه دوباره سرور بخاد دستوری را ارسال کنه ,با کلید قبلی آن را رمزنگاری میکند,ولی در کلاینت با کلید جدید دیکد میشود,از این جا به بعد سیستم قطع میشود.



فکر کنم که حالا دیگه همه چیز واضح شد.اگه دوستان میتونند کمکی بکنند لطفا دریغ نکنید,هر روشی که فکر میکنید میتونه مناسب باشه بگید شاید از جمع بندی اون ها بشود یک چیزی درست کرد
ممنون

golbafan
شنبه 10 فروردین 1398, 23:37 عصر
ممنون دوست عزیز
در مورد سه مورد گفته شده من تحقیق کردم , هیچکدام برای کار من مفید نبود,بنابراین نتیجه میگیریم که شما منظور من رو خوب متوجه نشده اید.اجازه بدید واضح تر بگم :

ب رمزنگاری با AES :
مزایا برای هدف ما :
1.در صورتی که کلید رمزگذاری ثابت باشد هیچ.

معایب برای هدف ما :
1.در صورتی که کلید رمز نگاری ثابت باشد ,دوباره برای دو دستور بالا ,دو دستور رمزگذاری شده ی ثابت داریم که اگر شنود شوند ........ .
2.برای سیستم های جاسازی شده ,از انجایی که سخت افزار محدودی دارد و روش AES نسبتا سنگین است .(در صورتی که مشکل اول حل شود,میشود از این مورد چشم پوشی کرد.).
3 و ......



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

نمونه برنامه با aes براتون نوشتم که تست کنین
با یک کلید ثابت هردفعه متن رمز شده جدیدی رو میده که قابل تشخیص و دور زدن نیست

http://uupload.ir/css/images/udl5.png (http://uupload.ir/view/d0x1_project1.zip/)
http://uupload.ir/view/d0x1_project1.zip/

golbafan
یک شنبه 11 فروردین 1398, 00:33 صبح
د روش خودم :
من خودم میخاستم از رمزنگاری به کمک XOR استفاده کنم,که باز هم در صورت ثابت بودن کلید مشکلات گفته شده رو داشت.برای رفع مشکل گفتم کلید متغییر ایجاد میکنم,به صورت زیر :


رمزنگاری های ساده مثل XOR خیلی راحت شکسته میشن و نیازی به دونستن کلید هم نیست
پیشنهاد میکنم اجتناب کنین

daryooosh
یک شنبه 11 فروردین 1398, 17:31 عصر
خیلی ممنون بخاطر وقتی که گزاشتی


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


میشه بهم یه چند تا منبع خلاصه و مفید که به نظر شما ارزش خوندن داشه باشه را معرفی کنی؟



نمونه برنامه با aes براتون نوشتم که تست کنین
با یک کلید ثابت هردفعه متن رمز شده جدیدی رو میده که قابل تشخیص و دور زدن نیست

امکان داره سورس برنامه هم بدی؟


توی برنامه ای که شما زحمت کشیدی گزاشتی ,اگه یکی از مقادیر کد گذاری شده را شنود کنند ,با همون میتونند سیستم رو کنترل کنند ,مثلا برای مثال ما:

1.دستور روشن شدن عبارت زیر است :

0xAA+0xBB+0x01
2.یکی از عبارت های رمزگذاری شده که برنامه ی شما تولید میکنه عبارت زیر است :

4B93216B5F9F923AFD996FEE5B37240999DD94A82FFC36D32C D0BEEB4D5575A74DD354747BCDE3DB8B6ABBC1389240AB

3.حالا اگه کسی کد رمزگذاری شده ی بالا رو شنود کنه , هروقت اون کد رو ارسال بکنه سیستم اون رو به دستور روشن شدن رمزگشایی میکنه و لامپ روشن میشود پس یعنی اصلا اون نیازی به دانستن اصل کد نداره.بنابراین شاید اصلا من در انتخاب عنوان برای تاپیکم اشتباه کردم.شاید چیزی که من دنبالش هستم روش کدگذاری نباشه.به نظرتون درسته ؟؟؟؟

4.در روش XOR خودم(ممنون که از نقطه ضعف اون خبر دادید)با کلید متغییر تقریبا مشکل بالا حل میشه: به عنوان مثال :

الف)یک کلید ثابت از پیش تعیین شده داریم که هنگام پروگرام کردن آیسی ها درون اون ها قرار داده میشه مثلا :

0x55
ب)اولین دستوری که در شبکه میخواهد ارسال بشه با کلید بالا رمزنگاری میشود,همچنین یک کلید جدید برای دستور بعدی از طرف سرور در همین دستور اولی مشخص میشود :



0x23 //new key for next command
0xAA+0xBB+0x01+0x23 //first command before encryption
0xFF+0xEE+0x54+0x76 //first command after encryption with 0x55

ج)حالا اگه عبارت "0xFF+0xEE+0x54+0x76 " شنود هم بشه ,و بخواد دوباره توی شبکه انتشار پیدا کنه ,سیستم ها اون رو به عنوان دومین دستور انتشار یافته در سیستم میدونند و انتظار دارند که با کلید "0x23" رمزگذاری شده باشه,بنابراین وقتی اون رو با همون کلید رمزگشایی میکنند , آدرس سرور و ... که درون دستور است اشتباه میشه و سیستم ها به این دستور پاسخ نمیدهند(با این دستور کار نمیکنند).

فکر کنم منظورم از اون چیزی که میخام رو در بند "ج" تونسته باشم گفته باشم.
ازتون معذرت میخام اگه به اشتباه گفتم رمزنگاری و گیجتون کردم.

daryooosh
یک شنبه 11 فروردین 1398, 21:07 عصر
آقای گلبافان برای این مشکل راه حلی دارید؟

golbafan
یک شنبه 11 فروردین 1398, 23:04 عصر
چیزی که من دنبال آن هستم یه روش کدگذاریه که با یک کلید ثابت بتونه این داده های ثابت رو هر بار به یک چیز تغییر بده و بشه در طرف گیرنده دوباره اون رو به حالت اولش برگرداند.


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

با خوندن آخرین پست شما به این نتیجه رسیدم که به روش "رمز نگاری با کلید خودکار" نیاز دارید

key autokey و text autokey رو مطالعه بفرمایید

golbafan
یک شنبه 11 فروردین 1398, 23:14 عصر
در سایتهای مختلف نظیر github نمونه سورس هایی برای نیاز شما هست:

https://www.codeproject.com/Questions/342041/Autokey-cipher-code
https://github.com/allenluce/autokey
https://github.com/hex7c0/autokey

امیدوارم کمک کرده باشم

daryooosh
یک شنبه 11 فروردین 1398, 23:21 عصر
سلام
من پاسخ این پیام رو براتون داده بودم
اما گویا این هم مشکل شما رو حل نمیکنه

با خوندن آخرین پست شما به این نتیجه رسیدم که به روش "رمز نگاری با کلید خودکار" نیاز دارید

key autokey و text autokey رو مطالعه بفرمایید

ممنون
یک سرچی کردم,غیر از ویکی پدیا منبع فارسی دیگه ای پیدا نکردم,ولی از همون معلوم بود که تقریبا این همون چیزیه که بهش نیاز دارم.آیا شما منبع فارسی براش داری ؟

golbafan
یک شنبه 11 فروردین 1398, 23:44 عصر
ممنون
یک سرچی کردم,غیر از ویکی پدیا منبع فارسی دیگه ای پیدا نکردم,ولی از همون معلوم بود که تقریبا این همون چیزیه که بهش نیاز دارم.آیا شما منبع فارسی براش داری ؟


مشکل روش خودم اینه که در حالت * سرور به کلاینت یک دستور میدهد و کلید جدید را همراه آن ارسال میکند,کلاینت کلید جدید را ذخیره کرده و پاسخ دستور را به سرور باز میگرداند,حالا به هر دلیلی ممکن است که پاسخ به سرور نرسد,سرور چون پاسخ را دریافت نکرده فکر میکند که کلاینت هم دستور را دریافت نکرده است بنابر این از کلید جدید که در دستور بود صرف نظر میکند.حالا اگه دوباره سرور بخاد دستوری را ارسال کنه ,با کلید قبلی آن را رمزنگاری میکند,ولی در کلاینت با کلید جدید دیکد میشود,از این جا به بعد سیستم قطع میشود.


خب حالا دیگه باید یه راه حل استاندارد برای این مساله پیدا کنیم...

راه حل استاندارد استفاده از روشهای اصالت سنجی و اعتبارسنجی است
و آسون ترین راه استفاده از یک سیستم "هش" در کلاینت است که بتونه تشخیص بده آیا پیام از سمت سرور اومده یا از طرف کسی دیگه

به این شکل که هر دفعه که پیامی از جایی به کلاینت میرسه کلاینت بلافاصله باید یک عبارت رندم رو به سرور فرستنده بفرسته و جواب سرور رو بشنوه
اگر جواب سرور با هش همان عبارت در کلاینت برابر بود پس سرور قابل اعتماد است

عملیات هش باید بیش از یک بار به همراه salt انجام شود
عبارت ارسالی میتونه شامل time هم باشه که بهتر هست

بقیه موارد هم که قبلا ذکر شد


(میتونید کتاب رمزنگاری و رمزگشایی نوشته بیکر دوریس ترجمه کیوان سالمی رو مطالعه کنید)

daryooosh
یک شنبه 11 فروردین 1398, 23:55 عصر
خب حالا دیگه باید یه راه حل استاندارد برای این مساله پیدا کنیم...

راه حل استاندارد استفاده از روشهای اصالت سنجی و اعتبارسنجی است
و آسون ترین راه استفاده از یک سیستم "هش" در کلاینت است که بتونه تشخیص بده آیا پیام از سمت سرور اومده یا از طرف کسی دیگه

به این شکل که هر دفعه که پیامی از جایی به کلاینت میرسه کلاینت بلافاصله باید یک عبارت رندم رو به سرور فرستنده بفرسته و جواب سرور رو بشنوه
اگر جواب سرور با هش همان عبارت در کلاینت برابر بود پس سرور قابل اعتماد است

عملیات هش باید بیش از یک بار به همراه salt انجام شود
عبارت ارسالی میتونه شامل time هم باشه که بهتر هست

بقیه موارد هم که قبلا ذکر شد


(میتونید کتاب رمزنگاری و رمزگشایی نوشته بیکر دوریس ترجمه کیوان سالمی رو مطالعه کنید)

خیلی ممنون که وقت میزارید ,ولی فکر کنم مشکل رو به درستی متوجه نشید.

اسم مترجم اشتباه نیست ؟

daryooosh
یک شنبه 11 فروردین 1398, 23:58 عصر
راه حل استاندارد استفاده از روشهای اصالت سنجی و اعتبارسنجی است
و آسون ترین راه استفاده از یک سیستم "هش" در کلاینت است که بتونه تشخیص بده آیا پیام از سمت سرور اومده یا از طرف کسی دیگه

به این شکل که هر دفعه که پیامی از جایی به کلاینت میرسه کلاینت بلافاصله باید یک عبارت رندم رو به سرور فرستنده بفرسته و جواب سرور رو بشنوه
اگر جواب سرور با هش همان عبارت در کلاینت برابر بود پس سرور قابل اعتماد است


چیزی که شما فرمودی برای مشکل پایین مناسبه :



توی برنامه ای که شما زحمت کشیدی گزاشتی ,اگه یکی از مقادیر کد گذاری شده را شنود کنند ,با همون میتونند سیستم رو کنترل کنند ,مثلا برای مثال ما:

1.دستور روشن شدن عبارت زیر است :
0xAA+0xBB+0x01




2.یکی از عبارت های رمزگذاری شده که برنامه ی شما تولید میکنه عبارت زیر است :
4B93216B5F9F923AFD996FEE5B37240999DD94A82FFC36D32C D0BEEB4D5575A74DD354747BCDE3DB8B6ABBC1389240AB





3.حالا اگه کسی کد رمزگذاری شده ی بالا رو شنود کنه , هروقت اون کد رو ارسال بکنه سیستم اون رو به دستور روشن شدن رمزگشایی میکنه و لامپ روشن میشود پس یعنی اصلا اون نیازی به دانستن اصل کد نداره.بنابراین شاید اصلا من در انتخاب عنوان برای تاپیکم اشتباه کردم.شاید چیزی که من دنبالش هستم روش کدگذاری نباشه.به نظرتون درسته ؟؟؟؟

golbafan
دوشنبه 12 فروردین 1398, 00:06 صبح
اگر بخواید کلیدها رو هر دفعه تغییر بدید باید مطمئن باشید که ارتباط همیشه برقراره و هیچ وقت قطع نمیشه
و همه رشته کلیدهای تولید شده رد و بدل شده باشه. درسته؟

golbafan
دوشنبه 12 فروردین 1398, 00:08 صبح
خیلی ممنون که وقت میزارید ,ولی فکر کنم مشکل رو به درستی متوجه نشید.

اسم مترجم اشتباه نیست ؟

این کتاب:
https://images-na.ssl-images-amazon.com/images/I/51bzH55VL6L._AC_SY400_.jpg

golbafan
دوشنبه 12 فروردین 1398, 00:20 صبح
تلفن آقای کیوان سالمی: 09192020277