کلیدخصوصی به هیچ وجه نباید از طریق شبکه منتقل شود.
از روشی مشابه ssl استفاده کنید به اینصورت که از تلفیقی از رمزنگاری متقارن و نامتقارن استفاده خواهد شد. (به ازای هر کلاینت بایست عملیات زیر انجام بشه و به ازای هر کلاینت کلیدهای متفاوتی ایجاد خواهد شد)
1- در سرور یک زوچ کلید عمومی/خصوصی ایجاد کنید. کلید عمومی را به کلاینت ارسال کنید.
2- کلاینت یک کلید رمزنگاری جدید ایجاد میکند. این کلید برای ارسال و دریافت داده بین کلاینت و سرور استفاده خواهد شد پس این کلید را در حافظه نگه میدارد.
3- سپس کلاینت این کلید جدید را توسط کلیدعمومی دریافتی از سرور و توسط الگوریتم نامتقارن رمزنگاری میکند.
4- کلاینت این کلید رمزشده را به سرور ارسال میکند.
5- سرور کلید رمزشده را دریافت کرده و توسط کلید خصوصی از مرحله1 رمزگشایی میکند.
6- حالا هم سرور و هم کلاینت روی یک کلید مشترک توافق کرده اند پس عملیات handshaking تمام شده و کلاینت و سرور نیازی به کلیدهای مرحله1 ندارند چون رمزنگاری نامتقارن فقط برای ارسال امن کلید مربوط به رمزنگاری متقارن استفاده میشود.
7- از این به بعد کلاینت و سرور توسط یک الگوریتم رمزنگاری متقارن و کلید توافقی به رد و بدل کردن داده مشغول میشن.
برای امنیت بیشتر
در مرحله اول کلاینت و سرور میتوانند روی الگوریتم نامتقارن توافق کنند.
همچنین در مرحله 4 کلاینت و سرور میتوانند روی الگوریتم متقارن توافق کنند.
در بسته اطلاعاتی نباید از جداکننده به اینصورت استفاده کرد چون ممکن است خود این جداکننده جزئی از اطلاعات مورد نیاز باشه درحالی که جداکننده مرز داده را تعیین میکنه و استفاده دیگه ای نداره. معمولا برای یک داده اول اون رو به آرایه ای از بایت تبدیل میکنند. حالا میشه تعداد بایت رو بدست آورد(یک عدد int). پس اول تعداد بایت و بعد خود آرایه.
مشخصه ابتدا و انتها هم به اینصورت نیاز نیست چون مثل جداکننده ممکن هست تداخل با خود داده ها داشته باشند.
پس بسته به این شکل میشه(طول دیتا یک عدد integer هست- 4 بایت)
طول دیتا-دیتا-طول دیتا-دیتا-.......
برای اطمینان از ارسال میتونید از بسته اطلاعات یک هش تهیه کنید و به بسته اضافه کنید
طول دیتا-دیتا-طول دیتا-دیتا-.......-طول دیتای هش-دیتای هش
طرف مقابل بعد از دریافت بسته قسمت (طول دیتای هش-دیتای هش) را از بسته جدا میکند، از بسته هش می گیرد و با هش ارسالی مقایسه میکنه. اگر یکسان نبود به فرستنده اعلام میکنه.
نمونه کد:
https://www.codeproject.com/Articles...-Secure-Stream