ḾồhamểḓEl3rßawy مؤسس الموقع
عدد المساهمات : 64 نقاط : -2147483296 السٌّمعَة : 3 تاريخ التسجيل : 27/09/2012 العمر : 26 الموقع : https://arab-dv.hooxs.com
| موضوع: شرح كامل لــ تعلم تكويد السورس من الالف الى الياء الثلاثاء أكتوبر 09, 2012 3:44 pm | |
| [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة] سلسله تعلم تكويد السورس من الالف الى الياء منى انا بس محمد العرباوى Mohamed.FTW مبدئيا الموضوع ده كبير وهيحتاج صبر ومتابعه وتفاعل فياريت تشجعونى والاقى تفاعل منكم لانى انا عامل الموضوع للافاده طبيعى لو ملقتش حد مهتم مش هكمل لكن لو لقيت فى تفاعل هستمر واى سؤال ان شاء الله هجاوب عليه [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة]مشروع سيرفر من الصفر اساس الفكره عشان اساعد الناس تفهم السورس بيتكود اذاى ويقدروا يعملوا سورس خاص بيهم بدل ما كل واحد بيحط اسمه جمب اى سطر فى الكود ويقول ده سورسى وتلاقى سورسات بالملايين وكل سورس باسم مختلف لكن كلهم واحد [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة]ملحوظه : انا هشرح عمل السيرفر على اخر كلاينت لكونكر اونلاين لكن للاسف السورس مش هيكون فيه التشفير الجديد بتاع الباسوورد لان ده محتاج برمجه عكسيه عشان تجيبها من الكلاينت وانا هشرح سى شارب بس وكمان هيكون اساس الشرح على سورس امبلس وهنبدأ مشروع جديد فى السى شارب وهندرس كل حاجه بالتفصيل [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة]سبب اختيارى لسورس امبلس هو انه سورس اوبن يعنى لو حبيت انك تاخد منه حاجه فى المستقبل كوبى وبيست هتقدر ده غير ان اصلا اغلب السورسات اللى نازله هيا سورس امبلس ومتعدله معادا مجموعه قليله من السورسات مختلفه [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة]كفايه مقدمات ونبدا على بركه الله كامل تعلم تكويد السورس الالف اول حاجه هتتعمل هى السوكيت (سوكت الاتصال) كامل تعلم تكويد السورس الالف وكمعلومه عامه عن السوكت وايه وظيفته السوكت ده وسيله اتصال بين اى تطبيقين او جهازيين يعنى مثلا معايا جهاز A وجهاز B بعاد عن بعض ومحتاج ابعت بيانات من واحد للتانى فهنا بتسخدم السوكت علشان نخليهم يتصلو ببعض البيانات دى ممكن تكون صوت او صوره او نص الخ ... [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة]السوكيت نوعين synchronous (سينكلونس) وده بيبعت ويستقبل البيانات فى نفس الوقت كامل تعلم تكويد السورس الالف Asynchronous (إسينكلونس) ده بيعت ويستقبل البيانات بس مش فى نفس الوقت [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة]انظمه الاتصال هما ثلات انواع كامل تعلم تكويد السورس الالف النظام الاول duplex (دوبلكس) ده بيرسل بيانات بس ذى التليفزيون والراديو لو اتكلمت جمبه مش هيسمعك لكن هو شغال رغى رغى لما بوظ عقول البشر كامل تعلم تكويد السورس الالف كامل تعلم تكويد السورس الالف النظام الثانى half-duplex (هاف دوبلكس) ده بيستقبل بيانات ويستنه اشاره او امر علشان يبعت الرد ذى الجهاز اللاسلكى الى مع الشرطه لما بيتكلم واحد وبعد ما يخلص رسالته لازم يقول حول علشان الطرف التانى يفهم ان الرساله خلصت ويبدء يبعت هو رسالته كامل تعلم تكويد السورس الالف النظام الثالث full-duplex (فول دوبلكس) وده بيبعت ويستقبل بيانات فى نفس الوقت ذى التليفون المحمول ممكن الاتنين يتكلمو فى نفس الوقت وهيسمعو برضه فى نفس الوقت [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة]علشان نبدء نعمل السوكت هنحتاج نعلن عن net and netsocket كامل تعلم تكويد السورس الالف وهما هيكونو كده using System.Net; using System.Net.Sockets; كامل تعلم تكويد السورس الالف احنا ان شاء الله هنشتغل على سوكت Asynchronous وعموما سورس امبلس موجود فيه السوكتين وعلشان نعمل السوكت هنحتاج كامل تعلم تكويد السورس الالف SocketWrapper WinSocket AsyncSocket كامل تعلم تكويد السورس الالف كامل تعلم تكويد السورس الالف كامل تعلم تكويد السورس الالف كامل تعلم تكويد السورس الالف يتبع [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة]اهم حاجه تكون مسطب برنامج السى شارب والاب سيرفر والنافى كات اولا هيتم عمل فولدر على بارتيشن ال سى ونسميه BlackScorpion بعد كده نفتح السى شارب ونعمل مشروع جديد من قائمه File نختار New Project هيفتح نافذه جديده فيها كذا اختيار هنختار منها ConsoleApplication بعد كده نعمل سيف للمشروع فى الفلدر الى عملناه على بارتيشن ال سى علشان تعمل save من قائمه File نختار Save All هتظهر نافذه فيها اسم المشروع والمكان الى هيتخزن فيه المشروع نخلى المكان على بارتيشن ال سى فى الفولدر الى عملناه الى اسمه BlackScorpion لحد كدا تمام وعملنا سيف للمشروع بعد كده هنروح للنافذه الى على يمين البرنامج اسمها Solution Explorer وهنضغط على اسم المشروع بتاعنا باليمين الى اسمه BlackScorpion ونضيف فولدر جديد عن طريق Add - New Folder ونغير اسم الفلدر ونخليه Network وبعد كده نضيف كلاس جديده جوه فولدر Network عن طريق الضغط بالموس كليك يمين فوق فولدر Network ونختار Add بعد كده Class كده هيضيف كلاس جديده هنغير اسمها ونخليه AsyncSocket.cs ونضيف الكود ده جوة الكلاس [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة]كود PHP: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; namespace BlackScorpion.Network { public class AsyncSocket { private int backlog; private int clientbuffersize = 0xffff; private WinSocket Connection = new WinSocket(); private bool enabled; public bool GameServer = false; public event Action OnClientConnect; public event Action OnClientDisconnect; public event Action OnClientReceive; private ushort port; public AsyncSocket(ushort port) { if (!this.enabled) { this.port = port; this.Connection.Bind(new IPEndPoint(IPAddress.Any, this.port)); this.Connection.Listen(100); this.Connection.BeginAccept(new AsyncCallback(this.AsyncConnect), null); this.enabled = true; } } private void AsyncConnect(IAsyncResult res) { AsyncSocketWrapper sender = null; try { sender = new AsyncSocketWrapper(); sender.Create(this.Connection.EndAccept(res)); if (sender.Socket == null) { this.Connection.BeginAccept(new AsyncCallback(this.AsyncConnect), null); return; } if (this.OnClientConnect != null) { this.OnClientConnect(sender); } sender.Socket.BeginReceive(sender.Buffer, 0, sender.Buffer.Length, SocketFlags.None, new AsyncCallback(this.AsyncReceive), sender); this.Connection.BeginAccept(new AsyncCallback(this.AsyncConnect), null); } catch (SocketException e) { Console.WriteLine(e); if (this.enabled) { this.Connection.BeginAccept(new AsyncCallback(this.AsyncConnect), null); } } catch (ObjectDisposedException e) { Console.WriteLine(e); } } private unsafe void AsyncReceive(IAsyncResult res) { bool was = false; try { SocketError error; AsyncSocketWrapper asyncState = (AsyncSocketWrapper)res.AsyncState; int RecvSize = asyncState.Socket.EndReceive(res, out error); if ((error == SocketError.Success) && (RecvSize > 0)) { was = true; byte[] buffer = new byte[RecvSize]; for (int i = 0; i < RecvSize; i++) { buffer[i] = asyncState.Buffer[i]; } if (this.OnClientReceive != null) { this.OnClientReceive(buffer, asyncState); } asyncState.Socket.BeginReceive(asyncState.Buffer, 0, asyncState.Buffer.Length, SocketFlags.None, new AsyncCallback(this.AsyncReceive), asyncState); } else { this.InvokeDisconnect(asyncState); } } catch (SocketException e) { Console.WriteLine(e); } catch (ObjectDisposedException e) { Console.WriteLine(e); } catch (Exception e) { Console.WriteLine(e); if (was) { AsyncSocketWrapper asyncState = (AsyncSocketWrapper)res.AsyncState; asyncState.Socket.BeginReceive(asyncState.Buffer, 0, asyncState.Buffer.Length, SocketFlags.None, new AsyncCallback(this.AsyncReceive), asyncState); } } } public void Disable() { if (this.enabled) { this.Connection.Disable(); this.enabled = false; } } public void Enable() { if (!this.enabled) { this.Connection.Bind(new IPEndPoint(IPAddress.Any, this.port)); this.Connection.Listen(this.backlog); this.Connection.BeginAccept(new AsyncCallback(this.AsyncConnect), null); this.enabled = true; } } private void enabledCheck(string Variable) { if (this.enabled) { throw new Exception("Cannot modify " + Variable + " while socket is enabled."); } } public void InvokeDisconnect(AsyncSocketWrapper Client) { if (Client != null) { try { if (Client.Socket.Connected) { Client.Socket.Shutdown(SocketShutdown.Both); Client.Socket.Close(); if (this.OnClientDisconnect != null) { this.OnClientDisconnect(Client); } Client.Connector = null; Client = null; } else { if (this.OnClientDisconnect != null) { this.OnClientDisconnect(Client); } Client.Connector = null; Client = null; } } catch (ObjectDisposedException e) { Console.WriteLine(e); } } } public int Backlog { get { return this.backlog; } set { this.enabledCheck("Backlog"); this.backlog = value; } } public int ClientBufferSize { get { return this.clientbuffersize; } set { this.enabledCheck("ClientBufferSize"); this.clientbuffersize = value; } } public bool Enabled { get { return this.enabled; } } public ushort Port { get { return this.port; } set { this.enabledCheck("Port"); this.port = value; } } } }
[وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة] بعد كده نضيف كلاس تانيه بنفس الطريقه جوه فولدر Newwork ونسميها AsyncSocketWrapper.cs
ونضيف جواها الكود ده
كود:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; namespace BlackScorpion.Network { public class AsyncSocketWrapper { public int BufferSize { get; set; } public byte[] Buffer { get; set; } public WinSocket Socket { get; set; } public object Connector { get; set; } public AsyncSocketWrapper Create(Socket socket) { BufferSize = 8000; Socket = new WinSocket(socket); Buffer = new byte[BufferSize]; return this; } } }
يتبع [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة] نيجى لاخر كلاس هنضيفها لفولدر Network طبعا هنضيفها بنفس الاسلوب الى فات ونسميها WinSocket.cs ونضيف الكود ده جواها
كود:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; namespace BlackScorpion.Network { public class WinSocket { private Socket Connection; private bool disconnected = false; public bool Disabled = false; public WinSocket() { Connection = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } public WinSocket(Socket socket) { Connection = socket; } public void Bind(EndPoint point) { if (disconnected) return; Connection.Bind(point); } public void Listen(int backlog) { if (disconnected) return; Connection.Listen(backlog); } public void BeginAccept(AsyncCallback async, object state) { if (Disabled) return; try { if (disconnected) return; Connection.BeginAccept(async, state); } catch { Disabled = true; } } public void BeginReceive(byte[] buffer, int offset, int size, SocketFlags flag, AsyncCallback callback, object state) { if (Disabled) return; try { if (disconnected || !Connected) return; Connection.BeginReceive(buffer, offset, size, flag, callback, state); } catch { Disabled = true; } } public int EndReceive(IAsyncResult res, out SocketError err) { err = SocketError.Disconnecting; if (Disabled) return 0; try { if (!Usable) return 0; return Connection.EndReceive(res, out err); } catch { Disabled = true; } return 0; } public Socket EndAccept(IAsyncResult async) { if (Disabled) return null; try { if (disconnected) return null; return Connection.EndAccept(async); } catch { Disabled = true; } return null; } public Socket Accept() { if (Disabled) return null; try { if (disconnected) return null; return Connection.Accept(); } catch { Disabled = true; } return null; } public void Close() { } public void Send(byte[] buffer) { if (Disabled) return; try { if (disconnected) return; Connection.Send(buffer); } catch { Disabled = true; } } public void Disconnect(bool reuse) { if (Disabled) return; try { if (!disconnected) disconnected = true; else return; Connection.Disconnect(reuse); } catch { Disabled = true; } } public void Shutdown(SocketShutdown type) { Connection.Shutdown(type); } public bool Connected { get { if (Disabled) return false; try { if (disconnected) return false; return Connection.Connected; } catch { Disabled = true; } return false; } } public int Receive(byte[] buffer) { if (disconnected) return 0; return Connection.Receive(buffer); } public EndPoint RemoteEndPoint { get { if (Disabled) return new IPEndPoint(1, 1); try { return Connection.RemoteEndPoint; } catch { Disabled = true; } return new IPEndPoint(1, 1); } } private bool Usable { get { return !disconnected; } } public void Disable() { try { Disabled = true; Connection.Close(); } catch { Disabled = true; } } } }
[وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة] هنبدء نضيف الجزء الخاص بالتشفير وهنشرح فكره التشفير بتتم ازاى وطبعا فايده التشفير او اهميته الكلينت دايما بيبعت بكتات مشفره وعلشان السورس يفهمها بيفك تشفيرها وبعد ما بيفك تشفيرها ويملاء البيانات المطلوبه بيشفرها تانى ويبعتها للكلينت بكده السورس والكلينت يفهمو بعض [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة] ى التشفير عندنا DHKeyExchange Blowfish AuthCryptography [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة] (الاوثورايزيشن) ده تبع تشفير الباسورد واحنا كدا كدا هنعمله باى باس لكن هنسيبها لربما نعدل فيها لاحقا
بعد كدا عندنا DHKeyExchange (دى اتش كى اكستشانج) اختصار ل Diffie Hellman (DH) Key Exchange
ده عباره عن وسيله تشفير بنعمل فيها تبادل لمفتاح سرى على اتصال عام غير مؤمن وده بيستخدم لفك وتشفير البيانات باستخدام وسيله تشفير زى Blowfish علشان نفهم ايه الى بيحصل فى الجزء الخاص بتبادل المفاتيح
عايزين نتخيل مع بعض اننا معانا شبكه فيها اجهزه ..منهم اتنين عايزين يعملوا اتصال سرى هما الاتنين هيتفقوا على بيانات عامه هتترسل فى الشبكه وبالتالى كل اللى فى الشبكه هيقدروا يشوفوها وده المقصوى باتصال غير امن يعنى متاح للجميع لكن الاتنين هيعملوا حسبه معينه وهيجيبوا مفتاح مش هيتم ارساله على الشبكه وهو اللى هيستخدموه لفك التشفير وده مش هيبقى عام طبعا
مثال : اتنين معاهم شنطه الاول معاه مفتاه ازرق ... والتانى معاه مفتاح احمر وهما الاتنين عايزين يتفقوا انهم هيبعتوا مفتاح اخضر لبعض هيجى الاول هيحط المفتاح الاخضر فى الشنطه وهيقفلها بمفتاحه هو الاحمر ويبعتها للتانى التانى مش معاه المفتاح الاحمر لكن عايز المفتاح الاخضر اللى فى الشطنه فهيقفل الشنطه مره كمان بالمفتاح الازرق ويبعتها للاول يروح الاول برضه مش معاه المفتاح الازرق لكن معاه الاحمر بتاعه هو ..فهيفتح بالمفتاح الاحمر بتاعه ويبعت الشنطه تانى يروح التانى كده يفتح الشنطه بالمفتاح الازرق بتاعه وكده ياخد المفتاح الاخضر اللى هو اصلا الهدف من البدايه وكده يبقى الاتنين معاهم المفتاح الاخضر ويبدؤا يكلموا بعض بشكل سرى امن
نشوف الموضوع ده بالارقام وشغلوا مخكم معايا هنتخيل ان احنا معانا جهازين وهنسميهم PC1 --------PC2 الاتنين اتفقوا على استخدام مفتاح اساسى هنسميه P هيكون اكبر من 2 ومفتاح عام هنسميه G وهيكون اقل من P الاتنين دول هيكونوا عام يعنى اى حد ممكن يعرفهم وبعدين الاتنين هيعملوا رقم عشوائى خاص هنسميه X وده محدش هيعرفه الا صاحبه بس يعنى حتى الجهاز التانى مش هيعرفه ودى برضه لازم تكون اقل من P تعالى نقول ان P و G هيكونوا كالتالى P = 41 G = 35 وهنقول ان الجهاز الاول عمل X= 9 و الجهاز التانى عمل X= 24 يبقى المعلومات اللى معانا هيه PC1 P= 41 , G= 35 X=9 PC2 P=41 , G=35 , X=24 الخطوه اللى بعد كده اننا هنعمل G مرفوعه فى الاس بتاع X وهنقسم الناتج على P ركز هنا ... مش هناخد ناتج القسمه لكن هناخد خااااااااارج القسمه مثلا : 9 / 2 =4 والباقى واحد يبقى خارج القسمه هو واحد وبعد كده الجهازين هيبعتوا الناتج لبعض الجهاز التانى بقى هياخد الناتج ده ويعمل فيه نفس الحكايه يرفعه للاس بتاع X عنده ويطلع خارج القسمه على P والناتج هنا هو المفتاح السرى اللى هيستخدموه وعلى اساسه هيتم التشفير
نشوفها بالارقام فى اربع خطوات احنا قلنا انهم اتفقوا على P و G وكل واحد عمل X عشوائى وهما PC1 P= 41 , G= 35 , X=9 PC2 P=41 , G=35 , X=24 الخطوه الاولى
الجهاز الاول هيعمل الحسبه دى 35^9 %41= 22 يعنى 35 اس 9 وناخد خارج القسمه على41 الناتج وهو 22 هيروح للجهاز التانى الخطوه التانيه
الجهاز التانى هياخد الرقم ده ويعمل نفس الحسبه 22^24%41=18 22 اس 24 مقسوم على 41 وهنا رفعه للاس بتاع X بتاعه هو والناتج هنا 18 مش هيروح للجهاز الاول وهو ده المفتاح السرى يعنى الجهاز التانى وصل للهدف الخطوه التالته
الجهاز التانى برضه هيعمل حسبته زى الجهاز الاول كالتالى 35^24%41=16 35 اس 24 مقسوم على 41 خارج القسمه هو 16 هيبعت الرقم ده للجهاز الاول الخطوه الرابعه والاخيره
ان الجهاز الاول هيعمل الحسبه بتاعته برضه بالرقم اللى جاله وهو 16 16^9%41=18 هيقول 16 اس 9 مقسوم على 41 خارج القسمه هو برضه 18 وهو نفس الرقم السرى وده كمان وصل لهدفه وكده معاهم نفس المفتاح
ملحوظه لو حبيتوا تعملوا الحسبه دى على الاله الحاسبه هتستخدموا خارج القسمه MOD بدل من القسمه العاديه ده باختصار هو معنى تبادل المفاتيح
الارقام المستخدمه كانت للتبسيط طبعا لكن المفاتيح الحقيقيه ممكن توصل ل 128 بايت وده معناه انك شبه مستحيل انك تقدر تخمنهم يعنى زى ماهو موجود فى كونكر مثلا دول هما البى والجى P = "E7A69EBDF105F2A6BBDEAD7E798F76A209AD73FB46643 1E2E 7352ED262F8C558F10BEFEA977DE9E21DCEE9B04D245F300EC CBBA03E72630556D011023F9E857F" G = "05" [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة] ندخل على اللى بعده Blowfish
دى بقى صعبه شويه ومعقده وانا مش فاهمها قوى لكن هشرح على قدر معرفتى بيها ولو فى حد عنده اى معلومات اضافيه عنها اتمنا يفيدنا بيها
دى بتشفر بالكتله او بالبلوكات من البافر او الباكيت طول الكتله بتاعتها 64 بايت وبيكون ليها مفتاح طوله متغير ما بين 32 الى 448 بت يعنى هو انك بتستخدم المفتاح عشان تعمل تحريك للبايتات فى المصفوفه او البافر وبتقارن قيمه كل بايت مع المفتاح وبتتحرك على اساسه ومع كل بايت فى المفتاح لما هتتحرك هتشفر الجزء اللى اصلا تم تشفيره قبل كده عموما انا مش عايز اديلكم معلومات غلط فى الجزئيه دى لكن اختصارا هقولكم الفكره الاساسيه خالص للتشفير احنا عندنا الحروف ترتيبهم كده a b c d e f g h i j k l m n o p q r s t u v w x y z لو عندنا مثلا كلمه word وانا جيت شفرتها باسلوب التحريك لليمين مره وحرف واحد فهناخد الحرف الاول بس وهنقدمه خطوه بدل ما هو W هيكون X هيبقى الناتج بعد التشفير هو xord طبعا ممكن اعمل كده على الكلمه كلها فاحرك كل حرف خطوه واجيب الحرف اللى بعده فتبقى الناتج هو xpse وممكن اعملها باسلوب تانى وهو انى اشفرها حرف حرف لكن كل مره هشفر الحرف اللى كان اتشفر قبل كده تعالوا نعملها اربع مرات بس ونشوف المثال 1- word >>>> xord 2- xord >>>> ypse 3-ypse >>>> zqtf 4-zrtf >>>> asug فاحنا لما شفرناها خلينا الحرف اللى كان متشفر قبل كده يتشفر تانى وعلشان نفكها هنرجع نفس الخطوات ونفس عدد المرات اتمنى يكون المثال ده وضح الفكره العامه
يتبع
[وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة] هنبدء نضيف الاكواد الخاصه بالتشفير اولا هنضيف فولدر جديد بالضغط على اسم المشروع كليك يمين بالماوس ونضيف فولدر جديد ونسميه CryptoGraphy وهنضيف جواه 3 كلاسات يلا نمشيهم واحده واحده الكلاس الاولى هنسميها AuthCryptography.cs وهنضيف جواها الكود ده
كود PHP: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace BlackScorpion.CryptoGraphy { public class AuthCryptography { class CryptCounter { public CryptCounter() { } public CryptCounter(ushort with) { m_Counter = with; } UInt16 m_Counter = 0; public byte Key2 { get { return (byte)(m_Counter >> ; } } public byte Key1 { get { return (byte)(m_Counter & 0xFF); } } public void Increment() { m_Counter++; } } private CryptCounter _decryptCounter; private CryptCounter _encryptCounter; private static byte[] _cryptKey1; private static byte[] _cryptKey2; private static byte[] _cryptKey3; private static byte[] _cryptKey4; private static bool Decrypt2 = false; public static void PrepareAuthCryptography() { if (_cryptKey1 != null) { if (_cryptKey1.Length != 0) return; } _cryptKey1 = new byte[0x100]; _cryptKey2 = new byte[0x100]; byte i_key1 = 0x9D; byte i_key2 = 0x62; for (int i = 0; i < 0x100; i++) { _cryptKey1[i] = i_key1; _cryptKey2[i] = i_key2; i_key1 = (byte)((0x0F + (byte)(i_key1 * 0xFA)) * i_key1 + 0x13); i_key2 = (byte)((0x79 - (byte)(i_key2 * 0x5C)) * i_key2 + 0x6D); } } public AuthCryptography() { _encryptCounter = new CryptCounter(); _decryptCounter = new CryptCounter(); } public void Encrypt(byte[] buffer) { for (int i = 0; i < buffer.Length; i++) { buffer[i] ^= (byte)0xAB; buffer[i] = (byte)(buffer[i] >> 4 | buffer[i] << 4); buffer[i] ^= (byte)(_cryptKey1[_encryptCounter.Key1] ^ _cryptKey2[_encryptCounter.Key2]); _encryptCounter.Increment(); } } public void Decrypt(byte[] buffer) { if (!Decrypt2) { for (int i = 0; i < buffer.Length; i++) { buffer[i] ^= (byte)0xAB; buffer[i] = (byte)(buffer[i] >> 4 | buffer[i] << 4); buffer[i] ^= (byte)(_cryptKey2[_decryptCounter.Key2] ^ _cryptKey1[_decryptCounter.Key1]); _decryptCounter.Increment(); } } else { for (int i = 0; i < buffer.Length; i++) { buffer[i] ^= (byte)0xAB; buffer[i] = (byte)(buffer[i] >> 4 | buffer[i] << 4); buffer[i] ^= (byte)(_cryptKey4[_decryptCounter.Key2] ^ _cryptKey3[_decryptCounter.Key1]); _decryptCounter.Increment(); } } } public static void GenerateKeys(UInt32 CryptoKey, UInt32 AccountID) { UInt32 tmpkey1 = 0, tmpkey2 = 0; tmpkey1 = ((CryptoKey + AccountID) ^ (0x4321)) ^ CryptoKey; tmpkey2 = tmpkey1 * tmpkey1; _cryptKey3 = new byte[256]; _cryptKey4 = new byte[256]; for (int i = 0; i < 256; i++) { int right = ((3 - (i % 4)) * ; int left = ((i % 4)) * 8 + right; _cryptKey3[i] = (byte)(_cryptKey1[i] ^ tmpkey1 << right >> left); _cryptKey4[i] = (byte)(_cryptKey2[i] ^ tmpkey2 << right >> left); } Decrypt2 = true; } public static void GenerateKeys2(byte[] InKey1, byte[] InKey2) { byte[] addKey1 = new byte[4]; byte[] addKey2 = new byte[4]; byte[] addResult = new byte[4]; byte[] tempKey = new byte[4]; long LMULer; _cryptKey3 = new byte[256]; _cryptKey4 = new byte[256]; for (int x = 0; x < 4; x++) { addKey1[x] = InKey1[3 - x]; addKey2[x] = InKey2[3 - x]; } uint Adder1; uint Adder2; uint Adder3; Adder1 = (uint)((addKey1[3] << 24) | (addKey1[2] << 16) | (addKey1[1] << | (addKey1[0])); Adder2 = (uint)((addKey2[3] << 24) | (addKey2[2] << 16) | (addKey2[1] << | (addKey2[0])); Adder3 = Adder1 + Adder2; addResult[0] = (byte)(Adder3 & 0xff); addResult[1] = (byte)((Adder3 >> & 0xff); addResult[2] = (byte)((Adder3 >> 16) & 0xff); addResult[3] = (byte)((Adder3 >> 24) & 0xff); for (int b = 3; b >= 0; b--) { tempKey[3 - b] = addResult[b]; } tempKey[2] = (byte)(tempKey[2] ^ (byte)0x43); tempKey[3] = (byte)(tempKey[3] ^ (byte)0x21); for (int b = 0; b < 4; b++) { tempKey[b] = (byte)(tempKey[b] ^ InKey1[b]); } for (int b = 0; b < 256; b++) { _cryptKey3[b] = (byte)(tempKey[3 - (b % 4)] ^ _cryptKey1[b]); } for (int x = 0; x < 4; x++) { addResult[x] = tempKey[3 - x]; } Adder3 = (uint)((addResult[3] << 24) | (addResult[2] << 16) | (addResult[1] << | (addResult[0])); LMULer = Adder3 * Adder3; LMULer = LMULer << 32; LMULer = LMULer >> 32; Adder3 = Convert.ToUInt32(LMULer & 0xffffffff); addResult[0] = (byte)(Adder3 & 0xff); addResult[1] = (byte)((Adder3 >> & 0xff); addResult[2] = (byte)((Adder3 >> 16) & 0xff); addResult[3] = (byte)((Adder3 >> 24) & 0xff); for (int b = 3; b >= 0; b--) { tempKey[3 - b] = addResult[b]; } for (int b = 0; b < 256; b++) { _cryptKey4[b] = Convert.ToByte(tempKey[3 - (b % 4)] ^ _cryptKey2[b]); } Decrypt2 = true; } } } [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة] الكلاس التانيه وهنسميها Blowfish.cs وهنضيف الكود ده جواها
كود PHP: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace BlackScorpion.CryptoGraphy { public class GameCryptography { Blowfish _blowfish; public GameCryptography(byte[] key) { _blowfish = new Blowfish(BlowfishAlgorithm.CFB64); _blowfish.SetKey(key); } public void Decrypt(byte[] packet) { byte[] buffer = _blowfish.Decrypt(packet); System.Buffer.BlockCopy(buffer, 0, packet, 0, buffer.Length); } public void Encrypt(byte[] packet) { byte[] buffer = _blowfish.Encrypt(packet); System.Buffer.BlockCopy(buffer, 0, packet, 0, buffer.Length); } public Blowfish Blowfish { get { return _blowfish; } } public void SetKey(byte[] k) { _blowfish.SetKey(k); } public void SetIvs(byte[] i1, byte[] i2) { _blowfish.EncryptIV = i1; _blowfish.DecryptIV = i2; } } public enum BlowfishAlgorithm { ECB, CBC, CFB64, OFB64, }; public class Blowfish : IDisposable { [DllImport("libeay32.dll", CallingConvention = CallingConvention.Cdecl)] public extern static void CAST_set_key(IntPtr _key, int len, byte[] data); [DllImport("libeay32.dll", CallingConvention = CallingConvention.Cdecl)] public extern static void BF_ecb_encrypt(byte[] in_, byte[] out_, IntPtr schedule, int enc); [DllImport("libeay32.dll", CallingConvention = CallingConvention.Cdecl)] public extern static void BF_cbc_encrypt(byte[] in_, byte[] out_, int length, IntPtr schedule, byte[] ivec, int enc); [DllImport("libeay32.dll", CallingConvention = CallingConvention.Cdecl)] public extern static void CAST_cfb64_encrypt(byte[] in_, byte[] out_, int length, IntPtr schedule, byte[] ivec, ref int num, int enc); [DllImport("libeay32.dll", CallingConvention = CallingConvention.Cdecl)] public extern static void BF_ofb64_encrypt(byte[] in_, byte[] out_, int length, IntPtr schedule, byte[] ivec, out int num); [StructLayout(LayoutKind.Sequential)] struct bf_key_st { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)] public UInt32[] P; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)] public UInt32[] S; } private BlowfishAlgorithm _algorithm; private IntPtr _key; private byte[] _encryptIv; private byte[] _decryptIv; private int _encryptNum; private int _decryptNum; public Blowfish(BlowfishAlgorithm algorithm) { _algorithm = algorithm; _encryptIv = new byte[8] { 0, 0, 0, 0, 0, 0, 0, 0 }; _decryptIv = new byte[8] { 0, 0, 0, 0, 0, 0, 0, 0 }; bf_key_st key = new bf_key_st(); key.P = new UInt32[16 + 2]; key.S = new UInt32[4 * 256]; _key = Marshal.AllocHGlobal(key.P.Length * sizeof(UInt32) + key.S.Length * sizeof(UInt32)); Marshal.StructureToPtr(key, _key, false); _encryptNum = 0; _decryptNum = 0; } public void Dispose() { Marshal.FreeHGlobal(_key); } public void SetKey(byte[] data) { _encryptNum = 0; _decryptNum = 0; CAST_set_key(_key, data.Length, data); } public byte[] Encrypt(byte[] buffer) { byte[] ret = new byte[buffer.Length]; switch (_algorithm) { case BlowfishAlgorithm.ECB: BF_ecb_encrypt(buffer, ret, _key, 1); break; case BlowfishAlgorithm.CBC: BF_cbc_encrypt(buffer, ret, buffer.Length, _key, _encryptIv, 1); break; case BlowfishAlgorithm.CFB64: CAST_cfb64_encrypt(buffer, ret, buffer.Length, _key, _encryptIv, ref _encryptNum, 1); break; case BlowfishAlgorithm.OFB64: BF_ofb64_encrypt(buffer, ret, buffer.Length, _key, _encryptIv, out _encryptNum); break; } return ret; } public byte[] Decrypt(byte[] buffer) { byte[] ret = new byte[buffer.Length]; switch (_algorithm) { case BlowfishAlgorithm.ECB: BF_ecb_encrypt(buffer, ret, _key, 0); break; case BlowfishAlgorithm.CBC: BF_cbc_encrypt(buffer, ret, buffer.Length, _key, _decryptIv, 0); break; case BlowfishAlgorithm.CFB64: CAST_cfb64_encrypt(buffer, ret, buffer.Length, _key, _decryptIv, ref _decryptNum, 0); break; case BlowfishAlgorithm.OFB64: BF_ofb64_encrypt(buffer, ret, buffer.Length, _key, _decryptIv, out _decryptNum); break; } return ret; } public byte[] EncryptIV { get { return _encryptIv; } set { System.Buffer.BlockCopy(value, 0, _encryptIv, 0, ; } } public byte[] DecryptIV { get { return _decryptIv; } set { System.Buffer.BlockCopy(value, 0, _decryptIv, 0, ; } } } } [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة] الكلاس الاخيره الخاصه بالتشفير وبرضه هنضيفها فى فولدر CryptoGraphy وهنسميها DHKeyExchange.cs وهنضيف جواها الكود ده من الافضل تحميل الكود من هنا
كود PHP: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Security.Cryptography; namespace BlackScorpion.CryptoGraphy { public static class DHKeyExchange { public static Random Random = new Random(); public class ServerKeyExchange { OpenSSL.DH _keyExchange; byte[] _serverIv; byte[] _clientIv; public byte[] CreateServerKeyPacket() { _clientIv = new byte[8]; _serverIv = new byte[8]; string P = "E7A69EBDF105F2A6BBDEAD7E798F76A209AD73FB466431E2E 7352ED262F8C558F10BEFEA977DE9E21DCEE9B04D245F300EC CBBA03E72630556D011023F9E857F"; string G = "05"; _keyExchange = new OpenSSL.DH(OpenSSL.BigNumber.FromHexString(P), OpenSSL.BigNumber.FromHexString(G)); _keyExchange.GenerateKeys(); return GeneratePacket(_serverIv, _clientIv, P, G, _keyExchange.PublicKey.ToHexString()); } public GameCryptography HandleClientKeyPacket(string PublicKey, GameCryptography cryptographer) { byte[] key = _keyExchange.ComputeKey(OpenSSL.BigNumber.FromHexString(PublicKey)); string md = KeyMD5(MD5.Create().ComputeHash(key)); key = Encoding.Default.GetBytes(md); cryptographer.SetKey(key); cryptographer.SetIvs(_clientIv, _serverIv); return cryptographer; } public static string KeyMD5(byte[] object_1) { char[] chArray = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; int num = 0; int num2 = 0; int length = object_1.Length; char[] chArray2 = new char[length * 2]; while (num < length) { byte num4 = (byte)object_1[num++]; chArray2[num2++] = chArray[num4 / 0x10]; chArray2[num2++] = chArray[num4 % 0x10]; } return new string(chArray2, 0, chArray2.Length); } public byte[] GeneratePacket(byte[] ServerIV1, byte[] ServerIV2, string P, string G, string ServerPublicKey) { int PAD_LEN = 11; int _junk_len = 12; string tqs = "TQServer"; MemoryStream ms = new MemoryStream(); byte[] pad = new byte[PAD_LEN]; Random.NextBytes(pad); byte[] junk = new byte[_junk_len]; Random.NextBytes(junk); int size = 47 + P.Length + G.Length + ServerPublicKey.Length + 12 + 8 + 8; BinaryWriter bw = new BinaryWriter(ms); bw.Write(pad); bw.Write(size - PAD_LEN); bw.Write((UInt32)_junk_len); bw.Write(junk); bw.Write((UInt32)ServerIV2.Length); bw.Write(ServerIV2); bw.Write((UInt32)ServerIV1.Length); bw.Write(ServerIV1); bw.Write((UInt32)P.ToCharArray().Length); foreach (char fP in P.ToCharArray()) { bw.BaseStream.WriteByte((byte)fP); } bw.Write((UInt32)G.ToCharArray().Length); foreach (char fG in G.ToCharArray()) { bw.BaseStream.WriteByte((byte)fG); } bw.Write((UInt32)ServerPublicKey.ToCharArray().Length); foreach (char SPK in ServerPublicKey.ToCharArray()) { bw.BaseStream.WriteByte((byte)SPK); } foreach (char tq in tqs.ToCharArray()) { bw.BaseStream.WriteByte((byte)tq); } byte[] Packet = new byte[ms.Length]; Packet = ms.ToArray(); ms.Close(); return Packet; } } } } [وحدهم المديرون لديهم صلاحيات معاينة هذه الصورة]
| |
|