<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Math on kenji.blog</title><link>http://kenji.blog/ar/tags/math/</link><description>Recent content in Math on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ar</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 22:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ar/tags/math/index.xml" rel="self" type="application/rss+xml"/><item><title>【للمبتدئين】فك تشفير البنية الرياضية لنموذج Transformer</title><link>http://kenji.blog/ar/p/transformer-mathematical-structure/</link><pubDate>Fri, 11 Sep 2026 22:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/transformer-mathematical-structure/</guid><description>&lt;img src="http://kenji.blog/p/transformer-mathematical-structure/img/eyecatch.jpg" alt="Featured image of post 【للمبتدئين】فك تشفير البنية الرياضية لنموذج Transformer" />&lt;h1 id="مقدمة-لماذا-نتعلم-رياضيات-الـ-transformer">مقدمة: لماذا نتعلم رياضيات الـ Transformer؟
&lt;/h1>&lt;p>يمكن القول دون مبالغة أن &amp;ldquo;Transformer&amp;rdquo; هي البنية التي أعادت كتابة تاريخ معالجة اللغات الطبيعية (NLP) والذكاء الاصطناعي بشكل عام في العصر الحديث. تم اقتراح هذا النموذج لأول مرة في ورقة بحثية بعنوان &amp;ldquo;Attention Is All You Need&amp;rdquo; نُشرت من قبل باحثين في Google عام 2017، ويعمل كقلب نابض للنماذج اللغوية الكبيرة (LLMs) التي تجتاح العالم اليوم، مثل سلسلة GPT من OpenAI (التقنية الأساسية لـ ChatGPT)، و BERT من Google، و Claude من Anthropic.&lt;/p>
&lt;p>ومع ذلك، في حين نرى غالباً تفسيرات نوعية لآلية عمل Transformer مثل &amp;ldquo;فهم السياق باستخدام Attention (آلية الانتباه)&amp;quot;، إلا أن التفسيرات التي تتعمق في &lt;strong>البنية الرياضية&lt;/strong> الكامنة وراءها للمبتدئين قليلة بشكل مفاجئ. لفهم كيف يقوم الذكاء الاصطناعي بمعالجة &amp;ldquo;الكلمات&amp;rdquo; كـ &amp;ldquo;معادلات رياضية&amp;rdquo; وتوليد نصوص طبيعية بشكل مذهل حقاً، من الضروري فك تشفير آليته الرياضية.&lt;/p>
&lt;p>في هذا المقال، سنقوم بشرح البنية الرياضية لقلب الـ Transformer بشكل شامل ومبسط، مثل &amp;ldquo;آلية الاهتمام الذاتي (Self-Attention)&amp;quot;، ونموذج &amp;ldquo;الاستعلام والمفتاح والقيمة (Q/K/V)&amp;quot;، و&amp;quot;التسوية باستخدام دالة Softmax&amp;rdquo;، و&amp;quot;الترميز الموضعي (Positional Encoding)&amp;quot;، وذلك للأشخاص الذين لديهم معرفة أساسية بالرياضيات والبرمجة (أولئك الذين يفهمون مفاهيم المصفوفات والتفاضل على مستوى المرحلة الثانوية).&lt;/p>
&lt;p>قد تشعر بالإرهاق من سرد المعادلات الرياضية، ولكن لكل عملية حسابية &amp;ldquo;معنى&amp;rdquo; واضح. بحلول الوقت الذي تنتهي فيه من قراءة هذا المقال، يجب أن تكون قادراً على فهم أن الـ Transformer ليس مجرد صندوق أسود سحري، بل هو تبلور لرياضيات وإحصاءات مصممة بدقة.&lt;/p>
&lt;hr>
&lt;h1 id="1-حدود-الطرق-التقليدية-وابتكار-الـ-transformer">1. حدود الطرق التقليدية وابتكار الـ Transformer
&lt;/h1>&lt;p>قبل ظهور Transformer، كان الاتجاه السائد في معالجة اللغات الطبيعية هو الشبكات العصبية المتكررة (RNN) ومشتقاتها مثل LSTM (الذاكرة الطويلة قصيرة المدى). تم تصميم RNN لمعالجة بيانات السلاسل الزمنية، وتقوم بقراءة الجمل كلمة بكلمة بالترتيب من البداية.&lt;/p>
&lt;p>ومع ذلك، كان لدى RNN نقطتي ضعف قاتلتين:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>صعوبة تعلم التبعيات طويلة المدى&lt;/strong>: عندما تصبح الجملة طويلة، تتلاشى معلومات الكلمات المدخلة في البداية بحلول الوقت الذي تصل فيه إلى النهاية (مشكلة تلاشي التدرج).&lt;/li>
&lt;li>&lt;strong>استحالة الحوسبة المتوازية&lt;/strong>: نظراً لأنه يجب معالجة الكلمات بالترتيب، فإن الحوسبة المتوازية واسعة النطاق باستخدام وحدات معالجة الرسومات (GPU) تكون صعبة، ويستغرق التدريب وقتاً هائلاً.&lt;/li>
&lt;/ol>
&lt;p>تخلى الـ Transformer تماماً عن بنية الـ RNN وأحدث نقلة نوعية من خلال التقاط السياق باستخدام &amp;ldquo;الاهتمام (Attention)&amp;rdquo; فقط. بفضل هذا، لم يعد هناك فقدان للمعلومات بغض النظر عن طول السلسلة، وأصبح من الممكن موازنة العمليات الحسابية لتحقيق أقصى استفادة من أداء وحدات معالجة الرسومات.&lt;/p>
&lt;hr>
&lt;h1 id="2-البنية-العامة-لـ-transformer">2. البنية العامة لـ Transformer
&lt;/h1>&lt;p>أولاً، دعونا نلقي نظرة عامة على البنية الكلية لـ Transformer. يتكون Transformer بشكل أساسي من كتلتين: &amp;ldquo;المشفر (Encoder)&amp;rdquo; و&amp;quot;فك التشفير (Decoder)&amp;rdquo;. بأخذ مهمة الترجمة كمثال، يقوم المشفر بتحويل لغة الإدخال (مثال: الإنجليزية) إلى تمثيلات متجهة رياضية، ويقوم فك التشفير بتوليد لغة الإخراج (مثال: اليابانية) بناءً على تلك التمثيلات المتجهة.&lt;/p>
&lt;p>يوضح الشكل أدناه بنية مبسطة لكتلة المشفر من الداخل.&lt;/p>
&lt;div class="mermaid">graph TD
A["رموز الإدخال (Input Tokens)"] --> B["تضمين الإدخال (Input Embedding)"]
B --> C["الترميز الموضعي (Positional Encoding)"]
C --> D["الاهتمام الذاتي متعدد الرؤوس (Multi-Head Self-Attention)"]
D --> E["إضافة وتسوية الطبقة (Add &amp; Layer Normalization)"]
E --> F["شبكة التغذية الأمامية (Feed Forward Network)"]
F --> G["إضافة وتسوية الطبقة (Add &amp; Layer Normalization)"]
G --> H["المخرجات للطبقة التالية (Output to Next Layer)"]
C -.->|"اتصال متبقي (Residual Connection)"| E
E -.->|"اتصال متبقي (Residual Connection)"| G&lt;/div>
&lt;p>من هنا، دعونا نتبع العمليات الرياضية التي تتم في كل مكون خطوة بخطوة.&lt;/p>
&lt;hr>
&lt;h1 id="3-توجيه-الكلمات-والترميز-الموضعي-positional-encoding">3. توجيه الكلمات والترميز الموضعي (Positional Encoding)
&lt;/h1>&lt;p>لا تستطيع أجهزة الكمبيوتر فهم النصوص كما هي. يتم أولاً تقسيم النص المدخل إلى وحدات تسمى &amp;ldquo;الرموز (Tokens)&amp;quot;، ويتم تحويل كل منها إلى متجه ذي طول ثابت. هذا هو &lt;strong>تضمين الإدخال (Input Embedding)&lt;/strong>.&lt;/p>
&lt;h2 id="31-رياضيات-تضمين-الإدخال">3.1 رياضيات تضمين الإدخال
&lt;/h2>&lt;p>بفرض أن حجم المفردات هو $V$، وعدد أبعاد متجه التضمين هو $d_{model}$ (في الورقة البحثية الأصلية $d_{model} = 512$). يتم تحويل كل كلمة $w_i$ إلى متجه $x_i \in \mathbb{R}^{d_{model}}$ باستخدام مصفوفة التضمين $W_E \in \mathbb{R}^{V \times d_{model}}$.&lt;/p>
$$ x_i = W_E \cdot \text{one\_hot}(w_i) $$
&lt;p>بهذا، يتم التعبير عن الجملة بأكملها كمصفوفة $X \in \mathbb{R}^{N \times d_{model}}$ (حيث $N$ هو طول الجملة).&lt;/p>
&lt;h2 id="32-الحاجة-للترميز-الموضعي-positional-encoding-ومعادلاته">3.2 الحاجة للترميز الموضعي (Positional Encoding) ومعادلاته
&lt;/h2>&lt;p>لا يقوم Transformer بمعالجة الكلمات بشكل متسلسل مثل RNN، بل يقوم بمعالجة جميع الكلمات في وقت واحد بشكل متوازٍ. يُعد هذا ميزة كبيرة من حيث سرعة الحساب، ولكنه في الوقت نفسه يتسبب في مشكلة &lt;strong>فقدان المعلومات الهامة المتعلقة بـ &amp;ldquo;ترتيب الكلمات (سياق الكلام)&amp;rdquo;&lt;/strong>. على سبيل المثال، &amp;ldquo;الكلب يعض الرجل&amp;rdquo; و&amp;quot;الرجل يعض الكلب&amp;rdquo; لهما نفس مجموعة الكلمات المدخلة ولكن معانيهما مختلفة تماماً.&lt;/p>
&lt;p>لإعطاء النموذج معلومات ترتيب الكلمات، تم ابتكار &lt;strong>الترميز الموضعي (Positional Encoding)&lt;/strong>.
يتم حساب الترميز الموضعي $PE$ للبعد $i$ للكلمة الموجودة في الموضع $pos$ باستخدام الدوال المثلثية التالية.&lt;/p>
$$ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$
$$ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$
&lt;p>هنا، $pos$ هو موضع الكلمة ($0, 1, 2, \dots, N-1$)، و $i$ هو مؤشر أبعاد المتجه ($0, 1, \dots, d_{model}/2 - 1$).&lt;/p>
&lt;h3 id="لماذا-نستخدم-الجيب-sine-وجيب-التمام-cosine">لماذا نستخدم الجيب (Sine) وجيب التمام (Cosine)؟
&lt;/h3>&lt;p>للوهلة الأولى، تبدو معادلة معقدة وغريبة جداً، ولكن هناك أسباب رياضية عميقة لذلك. باستخدام الدوال المثلثية، يصبح من السهل على النموذج تعلم الفروق في &lt;strong>&amp;ldquo;المواضع النسبية&amp;rdquo; وليس فقط &amp;ldquo;المواضع المطلقة&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>تذكر نظرية الجمع للدوال المثلثية التي تُدرّس في رياضيات المرحلة الثانوية.
&lt;/p>
$$ \sin(\alpha + \beta) = \sin\alpha \cos\beta + \cos\alpha \sin\beta $$
$$ \cos(\alpha + \beta) = \cos\alpha \cos\beta - \sin\alpha \sin\beta $$
&lt;p>يمكن التعبير عن الترميز الموضعي للموضع $pos + k$ الذي يبعد عن موضع معين $pos$ بمقدار $k$ كتركيبة خطية للترميز الموضعي للموضع $pos$. أي باستخدام المصفوفة $M_k$، يمكن كتابته على النحو التالي.&lt;/p>
$$ PE_{pos+k} = M_k \cdot PE_{pos} $$
&lt;p>بفضل هذا، يمكن لآلية الانتباه التعرف بسهولة على المسافة النسبية أو &amp;ldquo;مدى تباعد الكلمات عن بعضها&amp;rdquo; من خلال حساب الضرب النقطي. بالإضافة إلى ذلك، من خلال الجمع بين موجات جيب وجيب تمام متعددة ذات أطوال موجية مختلفة، هناك ميزة تتمثل في القدرة على توليد متجه موضع فريد بغض النظر عن طول الجملة.&lt;/p>
&lt;p>مصفوفة الإدخال النهائية $X_{input}$ هي مجموع متجهات تضمين الكلمات مع الترميز الموضعي.&lt;/p>
$$ X_{input} = X + PE $$
&lt;hr>
&lt;h1 id="4-الرياضيات-العميقة-لآلية-الاهتمام-الذاتي-self-attention">4. الرياضيات العميقة لآلية الاهتمام الذاتي (Self-Attention)
&lt;/h1>&lt;p>أخيراً، ندخل في أهم مكون لـ Transformer وهو &lt;strong>الاهتمام الذاتي (Self-Attention)&lt;/strong>. الهدف من الاهتمام الذاتي هو &amp;ldquo;حساب درجة الارتباط بين جميع الكلمات في الجملة، وتحديث متجه كل كلمة إلى تمثيل أكثر ثراءً يأخذ السياق في الاعتبار&amp;rdquo;.&lt;/p>
&lt;p>هنا يتم استخدام تشبيه &amp;ldquo;نظام البحث&amp;rdquo;.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>الاستعلام (Query - Q)&lt;/strong>: كلمة البحث. &amp;ldquo;ما هي المعلومات التي أبحث عنها الآن؟&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>المفتاح (Key - K)&lt;/strong>: العنوان. &amp;ldquo;ما هي المعلومات التي أمتلكها؟&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>القيمة (Value - V)&lt;/strong>: الكيان الفعلي. &amp;ldquo;ما هي المعلومات التي أقدمها بالفعل؟&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;h2 id="41-توليد-المصفوفات-q-k-v">4.1 توليد المصفوفات $Q, K, V$
&lt;/h2>&lt;p>لمصفوفة الإدخال $X \in \mathbb{R}^{N \times d_{model}}$ (نتجاهل هنا حجم الدفعة لتبسيط الأمر)، نقوم بحساب الاستعلام $Q$ والمفتاح $K$ والقيمة $V$ عن طريق ضربها في مصفوفات الأوزان القابلة للتعلم $W^Q, W^K, W^V \in \mathbb{R}^{d_{model} \times d_k}$. (عادةً $d_k = d_v = d_{model} / h$)&lt;/p>
$$ Q = X W^Q $$
$$ K = X W^K $$
$$ V = X W^V $$
&lt;p>هنا، تكون المصفوفات $Q, K, V$ جميعها مصفوفات بأبعاد $\mathbb{R}^{N \times d_k}$.&lt;/p>
&lt;h2 id="42-حساب-درجة-الانتباه-الضرب-النقطي">4.2 حساب درجة الانتباه (الضرب النقطي)
&lt;/h2>&lt;p>لقياس مدى ارتباط الاستعلام لكل كلمة بمفاتيح جميع الكلمات الأخرى، نحسب &lt;strong>الضرب النقطي&lt;/strong> للمتجهات. يمكن كتابتها كعملية مصفوفة على النحو التالي.&lt;/p>
$$ \text{Scores} = Q K^T $$
&lt;p>كل عنصر $s_{ij}$ في المصفوفة $\text{Scores} \in \mathbb{R}^{N \times N}$ الناتجة عن هذا الحساب يمثل الضرب النقطي لاستعلام الكلمة $i$ ومفتاح الكلمة $j$، أي أنه يعبر عن &amp;ldquo;قوة الارتباط&amp;rdquo;.&lt;/p>
&lt;h2 id="43-القياس-scaling">4.3 القياس (Scaling)
&lt;/h2>&lt;p>هناك مشكلة واحدة في حساب الدرجة باستخدام الضرب النقطي. عندما يصبح بُعد المتجه $d_k$ كبيراً، تصبح قيمة الضرب النقطي كبيرة جداً أو صغيرة جداً.&lt;/p>
&lt;p>دعونا نثبت ذلك رياضياً.
لنفترض أن كل عنصر من عناصر الاستعلام $q \sim \mathcal{N}(0, 1)$، وكل عنصر من عناصر المفتاح $k \sim \mathcal{N}(0, 1)$ تتبع توزيعاً طبيعياً معيارياً مستقلاً.
نوجد المتوسط والتباين للضرب النقطي $q \cdot k = \sum_{i=1}^{d_k} q_i k_i$.
المتوسط: بما أن $\mathbb{E}[q_i k_i] = \mathbb{E}[q_i] \mathbb{E}[k_i] = 0 \times 0 = 0$، فإن متوسط المجموع هو أيضاً $0$.
التباين: تباين $q_i k_i$ يعطى من خلال الاستقلالية على أنه $\text{Var}(q_i k_i) = \mathbb{E}[(q_i k_i)^2] - (\mathbb{E}[q_i k_i])^2 = 1 \times 1 - 0 = 1$.
لذلك، فإن التباين الكلي للضرب النقطي يساوي عدد الأبعاد $d_k$.&lt;/p>
$$ \text{Var}(q \cdot k) = d_k $$
&lt;p>عندما يصبح التباين كبيراً، يحدث &amp;ldquo;تلاشي التدرج&amp;rdquo; في دالة Softmax التي سيتم تطبيقها لاحقاً، حيث تصبح التدرجات باستثناء القيمة القصوى صغيرة جداً، مما يؤدي إلى توقف التعلم.
لمنع حدوث ذلك، نقوم بقسمة (أو قياس) الدرجة على $\sqrt{d_k}$ للحفاظ على التباين دائماً عند $1$.&lt;/p>
$$ \text{Scaled Scores} = \frac{Q K^T}{\sqrt{d_k}} $$
&lt;h2 id="44-التحويل-إلى-احتمالات-باستخدام-دالة-softmax">4.4 التحويل إلى احتمالات باستخدام دالة Softmax
&lt;/h2>&lt;p>نطبق &lt;strong>دالة Softmax&lt;/strong> صفا بصف لتحويل الدرجات التي حصلنا عليها إلى توزيع احتمالي (أوزان) بحيث يكون مجموعها $1$.&lt;/p>
$$ a_{ij} = \text{softmax}(s_i)_j = \frac{\exp(s_{ij} / \sqrt{d_k})}{\sum_{m=1}^N \exp(s_{im} / \sqrt{d_k})} $$
&lt;p>تُسمى المصفوفة $A \in \mathbb{R}^{N \times N}$ مصفوفة أوزان الانتباه (Attention Weight). إذا نظرنا إلى كل صف $i$ من هذه المصفوفة، فهو يعبر بقيمة من 0 إلى 1 عن &amp;ldquo;مدى الانتباه الذي يجب إعطاؤه لأي كلمة أخرى $j$ من أجل فهم الكلمة $i$&amp;rdquo;.&lt;/p>
&lt;h2 id="45-المجموع-الموزون-للقيم-value">4.5 المجموع الموزون للقيم (Value)
&lt;/h2>&lt;p>أخيراً، باستخدام مصفوفة أوزان الانتباه $A$ التي تم الحصول عليها، نحسب المجموع الموزون لمصفوفة القيم $V$.&lt;/p>
$$ \text{Output} = A V = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V $$
&lt;p>المصفوفة $Z \in \mathbb{R}^{N \times d_v}$ الناتجة عن هذه العملية هي مجموعة من &amp;ldquo;التمثيلات المتجهة للكلمات المحدثة التي تأخذ السياق في الاعتبار&amp;rdquo;.
هذه هي الصورة الكاملة لـ &lt;strong>الاهتمام بالضرب النقطي المقاس (Scaled Dot-Product Attention)&lt;/strong> المعرف في الورقة البحثية.&lt;/p>
&lt;hr>
&lt;h1 id="5-الانتباه-متعدد-الرؤوس-multi-head-attention">5. الانتباه متعدد الرؤوس (Multi-Head Attention)
&lt;/h1>&lt;p>من خلال عملية حساب انتباه واحدة فقط (رأس واحد)، قد لا نتمكن من التقاط السياق إلا من وجهة نظر واحدة (على سبيل المثال &amp;ldquo;العلاقة النحوية&amp;rdquo;). لذلك، تم تقديم &lt;strong>الانتباه متعدد الرؤوس (Multi-Head Attention)&lt;/strong> من أجل التقاط العلاقات الدلالية والنحوية المتنوعة التي تمتلكها اللغة (&amp;ldquo;الفاعل والمفعول&amp;rdquo;، &amp;ldquo;الضمير ومُشار إليه&amp;rdquo;، وما إلى ذلك) في وقت واحد.&lt;/p>
&lt;p>نقوم بتوليد $Q, K, V$ وحساب الانتباه كما ذكرنا سابقاً، وذلك بشكل متوازٍ لـ $h$ من المرات (عدد الرؤوس. في الورقة الأصلية $h=8$).&lt;/p>
$$ \text{head}_i = \text{Attention}(X W_i^Q, X W_i^K, X W_i^V) $$
&lt;p>هنا، $W_i^Q, W_i^K, W_i^V \in \mathbb{R}^{d_{model} \times d_k}$ هي مصفوفات أوزان قابلة للتعلم مخصصة للرأس رقم $i$.&lt;/p>
&lt;p>يتم دمج (Concatenate) النتائج الناتجة $\text{head}_i \in \mathbb{R}^{N \times d_v}$ من كل رأس جنباً إلى جنب.&lt;/p>
$$ \text{Concat}(\text{head}_1, \dots, \text{head}_h) \in \mathbb{R}^{N \times (h \cdot d_v)} $$
&lt;p>عادةً ما يتم ضبطها بحيث تكون $h \cdot d_v = d_{model}$، لذا فإن الأبعاد بعد الدمج تعود مرة أخرى إلى $d_{model}$ كما في الإدخال. أخيراً، نضرب هذه المصفوفة في مصفوفة الأوزان $W^O \in \mathbb{R}^{d_{model} \times d_{model}}$ للحصول على المخرجات النهائية.&lt;/p>
$$ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O $$
&lt;div class="mermaid">graph TD
X["الإدخال (Input X)"] --> Q1["Q1"]
X --> K1["K1"]
X --> V1["V1"]
Q1 &amp; K1 &amp; V1 --> H1["الرأس 1 (Head 1)"]
X --> Q2["Q2"]
X --> K2["K2"]
X --> V2["V2"]
Q2 &amp; K2 &amp; V2 --> H2["الرأس 2 (Head 2)"]
X --> QN["..."]
X --> KN["..."]
X --> VN["..."]
QN &amp; KN &amp; VN --> HN["الرأس h (Head h)"]
H1 &amp; H2 &amp; HN --> C["دمج (Concatenate)"]
C --> WO["الضرب في WO (Multiply by WO)"]
WO --> OUT["مخرجات متعددة الرؤوس (Multi-Head Output)"]&lt;/div>
&lt;hr>
&lt;h1 id="6-الشبكة-العصبية-ذات-التغذية-الأمامية-feed-forward-neural-network---ffn">6. الشبكة العصبية ذات التغذية الأمامية (Feed-Forward Neural Network - FFN)
&lt;/h1>&lt;p>يتم بعد ذلك إدخال مخرجات الانتباه متعدد الرؤوس في &lt;strong>الشبكة العصبية ذات التغذية الأمامية حسب الموضع (Position-wise Feed-Forward Network - FFN)&lt;/strong>.
وهي عبارة عن شبكة عصبية متصلة بالكامل من طبقتين يتم تطبيقها &amp;ldquo;بشكل مستقل لكل موضع (كلمة)&amp;rdquo; في السلسلة.&lt;/p>
&lt;p>يمكن التعبير عنها بالمعادلة التالية.&lt;/p>
$$ \text{FFN}(x) = \max(0, x W_1 + b_1) W_2 + b_2 $$
&lt;p>هنا، تشير $\max(0, z)$ إلى دالة التنشيط ReLU (وحدة خطية مقومة) (غالباً ما تُستخدم دوال مثل GELU أو SwiGLU في النماذج الحديثة).&lt;/p>
&lt;p>دور هذه الشبكة مهم جداً. فبينما تتعلم آلية الانتباه &amp;ldquo;العلاقات بين الكلمات (العلاقات المكانية والمتسلسلة)&amp;quot;، فإن شبكة FFN مسؤولة عن &amp;ldquo;التحويل غير الخطي لخصائص كل متجه كلمة بحد ذاته&amp;rdquo;.
في العادة، يتم تكبير الأبعاد مؤقتاً بشكل كبير بواسطة أوزان الطبقة الأولى $W_1$ (على سبيل المثال، تتضاعف 4 مرات من $d_{model}=512$ إلى $d_{ff}=2048$)، وبعد إجراء عمليات حسابية معقدة في فضاء الميزات، يتم إعادتها مرة أخرى إلى أبعادها الأصلية باستخدام أوزان الطبقة الثانية $W_2$. يؤدي هذا &amp;ldquo;التوسيع والتقليص للأبعاد&amp;rdquo; إلى زيادة القدرة التعبيرية للنموذج بشكل كبير.&lt;/p>
&lt;hr>
&lt;h1 id="7-الاتصال-المتبقي-residual-connection-وتسوية-الطبقة-layer-normalization">7. الاتصال المتبقي (Residual Connection) وتسوية الطبقة (Layer Normalization)
&lt;/h1>&lt;p>في التعلم العميق، عندما يتم زيادة عمق طبقات الشبكة، تحدث مشكلة تلاشي أو انفجار التدرج أثناء التدريب، مما يعيق التعلم بشكل صحيح. لمنع حدوث ذلك، يتم وضع &lt;strong>اتصال متبقي (Residual Connection)&lt;/strong> و &lt;strong>تسوية الطبقة (Layer Normalization)&lt;/strong> حول كل طبقة فرعية (الانتباه و FFN) في الـ Transformer.&lt;/p>
&lt;p>بالمعادلات، يتم معالجة مخرجات الطبقة الفرعية على النحو التالي.&lt;/p>
$$ \text{Output} = \text{LayerNorm}(x + \text{Sublayer}(x)) $$
&lt;h2 id="71-الاتصال-المتبقي-x--textsublayerx">7.1 الاتصال المتبقي ($x + \text{Sublayer}(x)$)
&lt;/h2>&lt;p>نقوم بإضافة الإدخال $x$ مباشرة إلى مخرجات الطبقة الفرعية. بفضل هذا، ينتقل التدرج مباشرة إلى الطبقات السطحية من خلال اختصار أثناء الانتشار العكسي، مما يضمن استقرار التدريب حتى مع زيادة عمق الطبقات.&lt;/p>
&lt;h2 id="72-رياضيات-تسوية-الطبقة-layer-normalization">7.2 رياضيات تسوية الطبقة (Layer Normalization)
&lt;/h2>&lt;p>تسوية الطبقة (Layer Normalization) هي تقنية تقوم بحساب المتوسط والتباين عبر اتجاه أبعاد الميزات لتسوية البيانات. في إدخال ذو حجم دفعة $B$، وطول سلسلة $N$، وعدد أبعاد $d_{model}$، يتم إجراء التسوية على متجه كلمة واحد $x \in \mathbb{R}^{d_{model}}$.&lt;/p>
&lt;p>نحسب المتوسط $\mu$ والتباين $\sigma^2$.
&lt;/p>
$$ \mu = \frac{1}{d_{model}} \sum_{i=1}^{d_{model}} x_i $$
$$ \sigma^2 = \frac{1}{d_{model}} \sum_{i=1}^{d_{model}} (x_i - \mu)^2 $$
&lt;p>ثم نحصل على المخرجات المسواة $\hat{x}$.
&lt;/p>
$$ \text{LN}(x) = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \odot \gamma + \beta $$
&lt;p>
($\epsilon$ هو ثابت متناهي الصغر لمنع القسمة على صفر. $\gamma, \beta$ هما معلماتا المقياس والإزاحة القابلتان للتعلم)&lt;/p>
&lt;p>السبب في اعتماد تسوية الطبقة (Layer Normalization) بدلاً من تسوية الدفعة (Batch Normalization) هو أنه عند معالجة بيانات متسلسلة ذات أطوال غير ثابتة مثل الجمل، تميل الإحصاءات بين الدفعات إلى عدم الاستقرار. بفضل تسوية الطبقة، يصبح التدريب المستقر في Transformer ممكناً بغض النظر عن حجم الدفعة.&lt;/p>
&lt;hr>
&lt;h1 id="8-البنية-الخاصة-بفك-التشفير-decoder-الانتباه-المقنع-masked-attention-والانتباه-المتقاطع-cross-attention">8. البنية الخاصة بفك التشفير (Decoder): الانتباه المقنع (Masked Attention) والانتباه المتقاطع (Cross-Attention)
&lt;/h1>&lt;p>البنية التي تم شرحها حتى الآن تخص المشفر. في كتلة فك التشفير المسؤولة عن توليد الجمل، تختلف البنية قليلاً.&lt;/p>
&lt;h2 id="81-الانتباه-متعدد-الرؤوس-المقنع-masked-multi-head-attention">8.1 الانتباه متعدد الرؤوس المقنع (Masked Multi-Head Attention)
&lt;/h2>&lt;p>دور فك التشفير هو &amp;ldquo;التنبؤ بالكلمة التالية من الكلمات السابقة&amp;rdquo;. لذلك، إذا رأى &amp;ldquo;الكلمات المستقبلية&amp;rdquo; أثناء التدريب، فسيكون ذلك بمثابة غش. العملية الرياضية لمنع حدوث ذلك هي &lt;strong>القناع (Masking)&lt;/strong>.&lt;/p>
&lt;p>إلى مصفوفة الدرجات $Q K^T$، نقوم بإضافة مصفوفة قناع $M$ تعين قيماً صغيرة جداً تقترب من $-\infty$ في الجزء المثلثي العلوي (الذي يتوافق مع المعلومات المستقبلية).&lt;/p>
$$ M_{ij} = \begin{cases} 0 &amp; (i \le j) \\ -\infty &amp; (i > j) \end{cases} $$
$$ \text{Masked Attention}(Q, K, V) = \text{softmax}\left(\frac{Q K^T + M}{\sqrt{d_k}}\right) V $$
&lt;p>عند حساب دالة Softmax، نظراً لأن $\exp(-\infty) = 0$، فإن وزن الانتباه للكلمات المستقبلية يصبح $0$ تماماً. بفضل هذا، يصبح التوليد التلقائي الانحداري مع الحفاظ على السببية (Causality) ممكناً.&lt;/p>
&lt;h2 id="82-الانتباه-المتقاطع-بين-المشفر-وفك-التشفير-encoder-decoder-cross-attention">8.2 الانتباه المتقاطع بين المشفر وفك التشفير (Encoder-Decoder Cross-Attention)
&lt;/h2>&lt;p>الطبقة الفرعية الثانية من فك التشفير هي &lt;strong>الانتباه المتقاطع (Cross-Attention)&lt;/strong> التي تشير إلى مخرجات المشفر.
هنا، يتم توليد $Q$ من طبقة فك التشفير السابقة، بينما يتم توليد $K$ و $V$ من مخرجات الطبقة النهائية للمشفر.&lt;/p>
$$ Q_{decoder} = X_{dec} W^Q $$
$$ K_{encoder} = X_{enc} W^K $$
$$ V_{encoder} = X_{enc} W^V $$
&lt;p>من خلال هذا الحساب، يمكن للنموذج أن يتعلم في مهام الترجمة مثلاً &amp;ldquo;ما هو الجزء من الجملة الأجنبية الأصلية الذي ترتبط به بقوة الكلمة التي تُترجم الآن&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h1 id="9-تعقيد-الحساب-ورياضيات-التحسين-في-العصر-الحديث">9. تعقيد الحساب ورياضيات التحسين في العصر الحديث
&lt;/h1>&lt;p>يعد Transformer نموذجاً رائعاً، ولكنه يعاني أيضاً من &amp;ldquo;نقاط ضعف&amp;rdquo; بسبب بنيته الرياضية.
يرجى الانتباه إلى تعقيد حساب الانتباه الذاتي (Self-Attention). في حساب مصفوفة الدرجات $Q K^T$، يتم ضرب مصفوفة $(N \times d_k)$ في مصفوفة $(d_k \times N)$، وبالتالي فإن التعقيد الحسابي هو &lt;strong>$O(N^2 \cdot d_{model})$&lt;/strong>.&lt;/p>
&lt;p>بمعنى آخر، &lt;strong>يزداد التعقيد الحسابي واستهلاك الذاكرة بتربيع طول السلسلة $N$&lt;/strong>.
لا تمثل هذه مشكلة عندما تكون الجمل قصيرة، ولكن عند محاولة إدخال سياق طويل جداً مثل كتاب كامل في نماذج LLM، يصل $N$ إلى عشرات الآلاف أو مئات الآلاف، وفي الحسابات التقليدية للانتباه، ستنفد ذاكرة وحدة معالجة الرسومات (GPU) على الفور.&lt;/p>
&lt;p>لكسر هذه اللعنة المتمثلة في $O(N^2)$، تم اقتراح تحسينات مختلفة في السنوات الأخيرة من خلال المناهج الرياضية والأجهزة.
المثال الأبرز على ذلك هو &lt;strong>FlashAttention&lt;/strong>. إن FlashAttention هو خوارزمية تقوم بحساب الانتباه عن طريق تقسيمه إلى أجزاء (Tiling) لتقليل نقل البيانات (الوصول إلى الذاكرة) بين مستويات الذاكرة في وحدة معالجة الرسومات (SRAM و HBM). على الرغم من أنها تُخرج نفس النتيجة تماماً رياضياً مثل الانتباه القياسي (Exact Attention)، إلا أنها تحقق تسريعاً كبيراً وتقليلاً في استخدام الذاكرة من خلال تحسينات على مستوى الأجهزة، مما جعل من الممكن تحقيق نماذج سياق طويل مثل GPT-4.&lt;/p>
&lt;p>بالإضافة إلى ذلك، تُجرى أبحاث نشطة على الانتباه المتناثر (Sparse Attention) والانتباه الخطي (Linear Attention) التي تقرّب تعقيد الحساب إلى $O(N \log N)$ أو $O(N)$.&lt;/p>
&lt;hr>
&lt;h1 id="10-صورة-التنفيذ-كود-زائف-بأسلوب-pytorch">10. صورة التنفيذ (كود زائف بأسلوب PyTorch)
&lt;/h1>&lt;p>إذا قمنا بتحويل البنية الرياضية المذكورة حتى الآن إلى كود برمجي فعلي (Python / PyTorch)، سنلاحظ أنه يمكن كتابتها بشكل بسيط ومدهش. نعرض الكود الزائف للجزء الأساسي من الاهتمام الذاتي (Self-Attention).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">torch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">torch.nn.functional&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">F&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">math&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">scaled_dot_product_attention&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mask&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># أشكال q, k, v: [batch_size, num_heads, seq_length, d_k]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d_k&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">q&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 1. حساب الدرجة بالضرب النقطي: Q * K^T&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># تبديل آخر بُعدين لحساب ضرب المصفوفات&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">torch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">matmul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">transpose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 2. القياس (Scaling)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">scores&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">math&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sqrt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d_k&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 3. القناع (في حالة Masked Attention)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">mask&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">scores&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">masked_fill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mask&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mf">1e9&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 4. تحويل إلى احتمالات باستخدام Softmax&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">attention_weights&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">F&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">softmax&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">scores&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dim&lt;/span>&lt;span class="o">=-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 5. الضرب في مصفوفة القيم (Value)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">output&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">torch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">matmul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">attention_weights&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">attention_weights&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>يمكننا أن نرى أن المعادلة الرياضية $Q K^T / \sqrt{d_k}$ يتم تنفيذها بشكل حدسي كـ &lt;code>torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(d_k)&lt;/code>. إن الجانب الممتع للغاية في التعلم العميق هو أن النظريات الرياضية تتحقق في بضعة أسطر من الكود بمساعدة مكتبات التحسين المتقدمة.&lt;/p>
&lt;hr>
&lt;h1 id="خاتمة-شكل-الذكاء-المرئي-من-المعادلات-الرياضية">خاتمة: شكل &amp;ldquo;الذكاء&amp;rdquo; المرئي من المعادلات الرياضية
&lt;/h1>&lt;p>في هذا المقال، قمنا بفك تشفير البنية الرياضية العميقة لنموذج Transformer.&lt;/p>
&lt;p>التضمين (Embedding) الذي يعيّن الكلمات في فضاء متجه متعدد الأبعاد، والترميز الموضعي (Positional Encoding) الذي يعبر عن معلومات الموضع بتراكب الموجات المثلثية، وآلية الاهتمام الذاتي (Self-Attention) التي هي حساب الضرب النقطي للمصفوفات المستمدة من تشبيه استرجاع المعلومات. كل واحد من هذه المكونات ما هو إلا تراكم للرياضيات الأساسية مثل الجبر الخطي، وحساب التفاضل والتكامل، والاحتمالات والإحصاء.&lt;/p>
&lt;p>ولكن عندما تتداخل هذه العمليات المصفوفية البسيطة في طبقات عديدة، وتتعلم الأنماط من مجموعات البيانات الضخمة من خلال مليارات أو مئات المليارات من المعلمات، يظهر هناك ما يشبه &amp;ldquo;شكل من أشكال الذكاء&amp;rdquo; القادر على فهم &amp;ldquo;لغتنا&amp;rdquo;، وإجراء الاستنتاجات المنطقية، وأحياناً توليد أفكار إبداعية.&lt;/p>
&lt;p>كما يوحي العنوان الاستفزازي &amp;ldquo;Attention Is All You Need&amp;rdquo; (الاهتمام هو كل ما تحتاجه)، يمكن القول إن جمال هذه البنية، التي تخلت عن المعالجات المتكررة والالتفافية المعقدة وتخصصت في حساب &amp;ldquo;الاهتمام (درجة الارتباط)&amp;rdquo; الخالص، يكمن بالتحديد في بساطتها الرياضية.&lt;/p>
&lt;p>في المستقبل، قد تظهر بنيات جديدة تتجاوز Transformer (مثل Mamba، وهو نموذج حالة الفضاء - State Space Model)، ولكن الإطار الرياضي لـ &amp;ldquo;فهم السياق بواسطة الاهتمام&amp;rdquo; الذي بناه Transformer سيُحفر بالتأكيد إلى الأبد في تاريخ الذكاء الاصطناعي.&lt;/p>
&lt;p>إذا سنحت لك الفرصة لاستخدام نماذج LLM مثل ChatGPT أو Claude في المستقبل، فحاول أن تتخيل تريليونات المرات من ضرب المصفوفات $Q K^T$ التي تُحسب كل ثانية في الخلفية، ودالة Softmax التي تستخرج الاحتمالات. سيرتفع وعيك بالتقنية، وستجد عالم الذكاء الاصطناعي أكثر إثارة للاهتمام.&lt;/p>
&lt;h3 id="المراجع">المراجع
&lt;/h3>&lt;ul>
&lt;li>Vaswani, A., et al. (2017). &amp;ldquo;Attention Is All You Need.&amp;rdquo; &lt;em>Advances in Neural Information Processing Systems&lt;/em>.&lt;/li>
&lt;li>Alammar, J. (2018). &amp;ldquo;The Illustrated Transformer.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;em>كُتب هذا المقال كدليل لأولئك الذين يتعلمون الأسس الرياضية لمعالجة اللغات الطبيعية والذكاء الاصطناعي. إذا كان لديك أي أسئلة أو نقاشات، فلا تتردد في مشاركتها في قسم التعليقات!&lt;/em>&lt;/p></description></item><item><title>أساسيات وتنفيذ التشفير باستخدام مبرهنة فيرما الصغرى</title><link>http://kenji.blog/ar/p/fermats-little-theorem-cryptography-implementation/</link><pubDate>Fri, 11 Sep 2026 22:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/fermats-little-theorem-cryptography-implementation/</guid><description>&lt;img src="http://kenji.blog/p/fermats-little-theorem-cryptography-implementation/img/eyecatch.jpg" alt="Featured image of post أساسيات وتنفيذ التشفير باستخدام مبرهنة فيرما الصغرى" />&lt;h2 id="1-مقدمة-الغموض-الرياضي-الذي-يدعم-التشفير-الحديث">1. مقدمة: الغموض الرياضي الذي يدعم التشفير الحديث
&lt;/h2>&lt;p>في المجتمع الرقمي الحديث، وخاصة في الاتصالات عبر الإنترنت، أصبح &amp;ldquo;التشفير&amp;rdquo; تقنية أساسية لا غنى عنها. إن قدرتنا على تصفح مواقع الويب بأمان عبر HTTPS في متصفحات الويب، وإجراء المعاملات المالية عبر الخدمات المصرفية عبر الإنترنت، والتواصل الخاص عبر تطبيقات المراسلة، كلها ممكنة بفضل بروتوكولات التشفير المدعومة بنظريات رياضية متقدمة تعمل في الخلفية. من بين هذه البروتوكولات، يلعب &amp;ldquo;تشفير المفتاح العام&amp;rdquo; دورًا مهمًا للغاية، وأبرز مثال عليه هو &lt;strong>تشفير RSA&lt;/strong>.&lt;/p>
&lt;p>تعتمد سلامة وصحة العديد من خوارزميات التشفير، بما في ذلك تشفير RSA، بشكل كبير على مبرهنة جميلة وقوية جدًا اكتشفها عالم الرياضيات الفرنسي في القرن السابع عشر بيير دي فيرما (Pierre de Fermat). هذه المبرهنة هي &lt;strong>مبرهنة فيرما الصغرى (Fermat&amp;rsquo;s Little Theorem)&lt;/strong>. علاوة على ذلك، فإن مبرهنة ليونهارت أويلر (Leonhard Euler)، التي تعمم هذه المبرهنة، تلعب أيضًا دورًا حاسمًا في نظرية التشفير.&lt;/p>
&lt;p>في هذا المقال، سنشرح بالتفصيل ومن الأساسيات كيف يتم تطبيق اكتشاف رياضي بحت مثل مبرهنة فيرما الصغرى في تقنيات التشفير العملية الحديثة، وخاصة في &amp;ldquo;اختبار الأولية&amp;rdquo; و &amp;ldquo;تشفير RSA&amp;rdquo;. سيكون هذا دليلًا تقنيًا مفصلاً للغاية يغطي الإثباتات الرياضية، وآليات التشفير وفك التشفير، وصولاً إلى تطبيقات الخوارزميات المحددة باستخدام C++ و Python.&lt;/p>
&lt;hr>
&lt;h2 id="2-أساسيات-التطابق-والحساب-المعياري">2. أساسيات التطابق والحساب المعياري
&lt;/h2>&lt;p>لفهم مبرهنة فيرما الصغرى، يجب أولاً التعرف على المفهوم الرياضي لـ &amp;ldquo;الحساب المعياري (التطابق)&amp;rdquo;. الحساب المعياري هو نظام حسابي يركز على &amp;ldquo;الباقي&amp;rdquo; بعد القسمة على عدد ثابت (يسمى المعيار أو المقياس). نظرًا لأنه يشبه الحساب على مينا الساعة (التي تكمل دورة كل 12 ساعة)، يُطلق عليه أيضًا &amp;ldquo;رياضيات الساعة&amp;rdquo;.&lt;/p>
&lt;p>عندما يكون باقي قسمة العددين الصحيحين $a$ و $b$ على عدد صحيح موجب $n$ متساويًا، يتم التعبير عن ذلك رياضيًا على النحو التالي:&lt;/p>
$$
a \equiv b \pmod n
$$
&lt;p>يُقرأ هذا &amp;quot; $a$ و $b$ متطابقان بمقياس $n$ &amp;ldquo;. على سبيل المثال، باقي قسمة 17 على 5 هو 2، وباقي قسمة 12 على 5 هو 2 أيضًا. لذلك، يمكننا كتابة ما يلي:&lt;/p>
$$
17 \equiv 12 \pmod 5 \equiv 2 \pmod 5
$$
&lt;p>في الحساب المعياري، تنطبق العمليات الحسابية الأساسية الأربع (الجمع والطرح والضرب) كما هي:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>الجمع&lt;/strong>: إذا كان $a \equiv b \pmod n$ و $c \equiv d \pmod n$، فإن $a + c \equiv b + d \pmod n$&lt;/li>
&lt;li>&lt;strong>الطرح&lt;/strong>: إذا كان $a \equiv b \pmod n$ و $c \equiv d \pmod n$، فإن $a - c \equiv b - d \pmod n$&lt;/li>
&lt;li>&lt;strong>الضرب&lt;/strong>: إذا كان $a \equiv b \pmod n$ و $c \equiv d \pmod n$، فإن $a \times c \equiv b \times d \pmod n$&lt;/li>
&lt;li>&lt;strong>الأسس&lt;/strong>: إذا كان $a \equiv b \pmod n$، فإنه لأي عدد طبيعي $k$، يكون $a^k \equiv b^k \pmod n$&lt;/li>
&lt;/ol>
&lt;p>ومع ذلك، يجب توخي الحذر فيما يتعلق بـ &lt;strong>القسمة&lt;/strong>. بشكل عام، فقط لأن $a \times c \equiv b \times c \pmod n$، فهذا لا يعني أنه يمكنك قسمة كلا الجانبين على $c$ للحصول على $a \equiv b \pmod n$. هذا ينطبق فقط عندما يكون $c$ و $n$ أوليين فيما بينهما (القاسم المشترك الأكبر هو 1). هذا المفهوم لـ &amp;ldquo;المعكوس الضربي المعياري&amp;rdquo; سيكون في غاية الأهمية في توليد مفاتيح تشفير RSA، والذي سيتم مناقشته لاحقًا.&lt;/p>
&lt;hr>
&lt;h2 id="3-الخلفية-الرياضية-لمبرهنة-فيرما-الصغرى-وإثباتها">3. الخلفية الرياضية لمبرهنة فيرما الصغرى وإثباتها
&lt;/h2>&lt;p>الآن وقد فهمنا أساسيات الحساب المعياري، دعونا ننتقل إلى الموضوع الرئيسي وهو مبرهنة فيرما الصغرى.&lt;/p>
&lt;h3 id="31-تعريف-المبرهنة">3.1 تعريف المبرهنة
&lt;/h3>&lt;p>تُصاغ مبرهنة فيرما الصغرى على النحو التالي:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>مبرهنة فيرما الصغرى (Fermat&amp;rsquo;s Little Theorem)&lt;/strong>
ليكن $p$ عددًا أوليًا، و $a$ أي عدد صحيح ليس من مضاعفات $p$ (بمعنى أن $a$ و $p$ أوليان فيما بينهما). عندئذ، تتحقق علاقة التطابق التالية:
&lt;/p>
$$ a^{p-1} \equiv 1 \pmod p $$
&lt;/blockquote>
&lt;p>من الشائع أيضًا التعبير عنها بشكل ينطبق على جميع الأعداد الصحيحة $a$ عن طريق إزالة شرط &amp;quot; $a$ ليس من مضاعفات $p$ &amp;ldquo;. في هذه الحالة، نضرب كلا الجانبين في $a$ لنحصل على:&lt;/p>
$$
a^p \equiv a \pmod p
$$
&lt;h3 id="32-التحقق-باستخدام-أمثلة-محددة">3.2 التحقق باستخدام أمثلة محددة
&lt;/h3>&lt;p>دعونا نستخدم أرقامًا محددة للتحقق مما إذا كانت المبرهنة صحيحة حقًا.
لنفترض أن العدد الأولي $p = 5$. إذن $p-1 = 4$. سنختار عددًا صحيحًا لـ $a$ ليس من مضاعفات $p$.&lt;/p>
&lt;ul>
&lt;li>في حالة $a = 2$: $2^{5-1} = 2^4 = 16$. $16 \div 5 = 3$ والباقي $1$. لذلك $16 \equiv 1 \pmod 5$. (صحيح)&lt;/li>
&lt;li>في حالة $a = 3$: $3^{5-1} = 3^4 = 81$. $81 \div 5 = 16$ والباقي $1$. لذلك $81 \equiv 1 \pmod 5$. (صحيح)&lt;/li>
&lt;li>في حالة $a = 4$: $4^{5-1} = 4^4 = 256$. $256 \div 5 = 51$ والباقي $1$. لذلك $256 \equiv 1 \pmod 5$. (صحيح)&lt;/li>
&lt;/ul>
&lt;p>وبهذه الطريقة، بغض النظر عن قيمة $a$ التي تختارها (طالما أنها ليست من مضاعفات 5)، فإن رفعها للقوة الرابعة وقسمتها على 5 سيؤدي دائمًا إلى باقي مقداره 1. يبدو الأمر كالسحر، لكن هذا ينبع من الخصائص الجميلة للأعداد الأولية.&lt;/p>
&lt;h3 id="33-الإثبات-الرياضي-للمبرهنة">3.3 الإثبات الرياضي للمبرهنة
&lt;/h3>&lt;p>لماذا هذا صحيح؟ هنا سنقدم إثباتًا أنيقًا باستخدام فئات البواقي.&lt;/p>
&lt;p>لننظر في المجموعة $S = \{1, 2, 3, \dots, p-1\}$. هذه هي ممثلات الأعداد الصحيحة التي يكون باقي قسمتها على $p$ من $1$ إلى $p-1$.
الآن، لننظر في مجموعة جديدة $T$ عن طريق ضرب كل عنصر في عدد صحيح $a$ أولي نسبيًا مع $p$.
&lt;/p>
$$ T = \{1a, 2a, 3a, \dots, (p-1)a\} $$
&lt;p>لننظر في باقي قسمة كل عنصر من عناصر هذه المجموعة $T$ على $p$. والمثير للدهشة أن هذه البواقي، على الرغم من أن ترتيبها قد يتغير، تتطابق تمامًا مع عناصر المجموعة الأصلية $S$.
والسبب هو:&lt;/p>
&lt;ol>
&lt;li>عناصر $T$ لا تكون أبدًا من مضاعفات $p$ (لأن كلاً من $a$ والعناصر الأصلية ليست من مضاعفات $p$).&lt;/li>
&lt;li>لا يوجد عنصران مختلفان في $T$ متطابقان بمقياس $p$. إذا افترضنا أن $ia \equiv ja \pmod p$ ($i \neq j$)، بما أن $a$ و $p$ أوليان نسبيًا، يمكننا القسمة على $a$ للحصول على $i \equiv j \pmod p$، وهو تناقض.&lt;/li>
&lt;/ol>
&lt;p>لذلك، حاصل ضرب جميع عناصر $S$ متطابق مع حاصل ضرب جميع عناصر $T$ بمقياس $p$.&lt;/p>
$$
(1a) \times (2a) \times \dots \times ((p-1)a) \equiv 1 \times 2 \times \dots \times (p-1) \pmod p
$$
&lt;p>بترتيب الجانب الأيسر، يوجد $p-1$ من $a$، لذلك:&lt;/p>
$$
a^{p-1} \cdot (p-1)! \equiv (p-1)! \pmod p
$$
&lt;p>بما أن $(p-1)!$ أولي نسبيًا مع $p$، يمكننا قسمة كلا الجانبين على $(p-1)!$ لنحصل في النهاية على المبرهنة التالية:&lt;/p>
$$
a^{p-1} \equiv 1 \pmod p
$$
&lt;p>هذا هو إثبات مبرهنة فيرما الصغرى.&lt;/p>
&lt;hr>
&lt;h2 id="4-دالة-مؤشر-أويلر-ومبرهنة-أويلر">4. دالة مؤشر أويلر ومبرهنة أويلر
&lt;/h2>&lt;p>مبرهنة فيرما الصغرى هي مبرهنة تتعلق بـ &amp;ldquo;الأعداد الأولية $p$&amp;quot;، ولكن تم تعميمها على &amp;ldquo;أي عدد صحيح موجب $n$&amp;rdquo; بواسطة ليونهارت أويلر. لفهم تشفير RSA، هذا التوسيع ضروري.&lt;/p>
&lt;h3 id="41-دالة-مؤشر-أويلر-phin">4.1 دالة مؤشر أويلر $\phi(n)$
&lt;/h3>&lt;p>دالة مؤشر أويلر (أو دالة فاي لأويلر) $\phi(n)$ هي دالة تمثل &amp;ldquo;عدد الأعداد الصحيحة من $1$ إلى $n$ التي هي أولية نسبيًا مع $n$&amp;rdquo;.&lt;/p>
&lt;ul>
&lt;li>في حالة العدد الأولي $p$، جميع الأعداد الصحيحة من $1$ إلى $p-1$ أولية نسبيًا مع $p$، لذلك $\phi(p) = p - 1$.&lt;/li>
&lt;li>بالنسبة لعددين أوليين مختلفين $p, q$، وحاصلهما $n = p \times q$، يمكن إيجاد $\phi(n)$ بصيغة بسيطة جدًا:
$$ \phi(p \times q) = \phi(p) \times \phi(q) = (p - 1)(q - 1) $$&lt;/li>
&lt;/ul>
&lt;p>هذه الخاصية هي المنطق الأساسي في توليد مفاتيح تشفير RSA.&lt;/p>
&lt;h3 id="42-مبرهنة-أويلر">4.2 مبرهنة أويلر
&lt;/h3>&lt;p>عمم أويلر مبرهنة فيرما الصغرى على النحو التالي:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>مبرهنة أويلر (Euler&amp;rsquo;s Theorem)&lt;/strong>
لأي عدد صحيح موجب $n$ وعدد صحيح $a$ أولي نسبيًا معه، يتحقق ما يلي:
&lt;/p>
$$ a^{\phi(n)} \equiv 1 \pmod n $$
&lt;/blockquote>
&lt;p>إذا كان $n$ عددًا أوليًا $p$، فإن $\phi(p) = p - 1$، وبالتالي تصبح هذه المبرهنة هي مبرهنة فيرما الصغرى نفسها ($a^{p-1} \equiv 1 \pmod p$). وبعبارة أخرى، مبرهنة فيرما الصغرى ليست سوى حالة خاصة من مبرهنة أويلر.&lt;/p>
&lt;hr>
&lt;h2 id="5-العثور-على-أعداد-أولية-ضخمة-اختبار-فيرما-للأولية">5. العثور على أعداد أولية ضخمة: اختبار فيرما للأولية
&lt;/h2>&lt;p>في تقنيات التشفير (مثل تشفير RSA وتبادل مفاتيح Diffie-Hellman)، من الضروري العثور بسرعة على &amp;ldquo;أعداد أولية ضخمة&amp;rdquo; قد تصل إلى مئات الأرقام. ومع ذلك، لتحديد ما إذا كان رقم ضخم $N$ أوليًا، فإن &amp;ldquo;طريقة القسمة التجريبية&amp;rdquo;، والتي تختبر قابلية القسمة على كل الأرقام من $2$ إلى $\sqrt{N}$، ستستغرق وقتًا يعادل عمر الكون.&lt;/p>
&lt;p>هنا يأتي دور &amp;ldquo;اختبار الأولية الاحتمالي&amp;rdquo; الذي يعكس مبرهنة فيرما الصغرى، وهو &lt;strong>اختبار فيرما (Fermat Primality Test)&lt;/strong>.&lt;/p>
&lt;h3 id="51-ما-هو-اختبار-الأولية-الاحتمالي">5.1 ما هو اختبار الأولية الاحتمالي
&lt;/h3>&lt;p>وفقًا لمبرهنة فيرما الصغرى، إذا كان $p$ أوليًا، فبالنسبة لأي $a$ ($1 &lt; a &lt; p$)، فإن $a^{p-1} \equiv 1 \pmod p$ يتحقق دائمًا.
بأخذ المعاكس الإيجابي لهذا، يمكننا القول: &amp;ldquo;إذا كان $a^{p-1} \not\equiv 1 \pmod p$ بالنسبة لـ $a$ معين، فإن $p$ &lt;strong>ليس عددًا أوليًا بالتأكيد (إنه عدد مركب)&lt;/strong>&amp;rdquo;.&lt;/p>
&lt;p>لذلك، إذا أردنا تحديد ما إذا كان $N$ أوليًا أم لا، نختار عددًا قليلاً من قيم $a$ عشوائيًا ونحسب $a^{N-1} \pmod N$ للتحقق مما إذا كان يساوي $1$. إذا كانت الإجابة بخلاف $1$ ولو مرة واحدة، فهذا يؤكد أن $N$ هو عدد مركب. وإذا كانت النتيجة $1$ بغض النظر عن عدد المرات التي نختبر فيها ذلك، فيمكننا استنتاج باحتمال كبير أن $N$ هو &amp;ldquo;على الأرجح عدد أولي&amp;rdquo;.&lt;/p>
&lt;h3 id="52-شرح-الخوارزمية-ومخطط-الانسياب">5.2 شرح الخوارزمية ومخطط الانسياب
&lt;/h3>&lt;p>خوارزمية اختبار فيرما هي كما يلي:&lt;/p>
&lt;div class="mermaid">flowchart TD
Start["البداية"] --> Input["إدخال العدد p المراد اختباره، وعدد مرات الاختبار k"]
Input --> LoopStart["حلقة من i = 0 إلى k-1"]
LoopStart --> Condition{"i &lt; k ؟"}
Condition -- "نعم" --> RandomA["اختيار عدد صحيح عشوائي a في النطاق 1 &lt; a &lt; p-1"]
RandomA --> Calc["حساب الأس المعياري a^(p-1) mod p"]
Calc --> CheckPrime{"هل النتيجة هي 1 ؟"}
CheckPrime -- "لا" --> ReturnComposite["p هو عدد مركب (مؤكد)"]
CheckPrime -- "نعم" --> Increment["زيادة i"]
Increment --> Condition
Condition -- "لا" --> ReturnPrime["p على الأرجح عدد أولي (احتمالي)"]
ReturnComposite --> End["النهاية"]
ReturnPrime --> End&lt;/div>
&lt;h3 id="53-فخ-أرقام-كارمايكل-الأعداد-شبه-الأولية">5.3 فخ أرقام كارمايكل (الأعداد شبه الأولية)
&lt;/h3>&lt;p>اختبار فيرما سريع للغاية، ولكن به عيب خطير. وهو وجود أرقام شيطانية تحقق $a^{N-1} \equiv 1 \pmod N$ لجميع قيم $a$ على الرغم من أنها أعداد مركبة. تسمى هذه بـ &lt;strong>أرقام كارمايكل (Carmichael numbers)&lt;/strong>. أصغر رقم كارمايكل هو $561$ ($3 \times 11 \times 17$).&lt;/p>
&lt;p>نظرًا لوجود أرقام كارمايكل، لا يمكن لاختبار فيرما النقي وحده تقديم تحديد قاطع للأولية. لذلك، في أنظمة التشفير الفعلية (مثل OpenSSL)، يُستخدم عادةً &lt;strong>اختبار ميلر-رابين للأولية (Miller-Rabin)&lt;/strong>، وهو نسخة محسنة من اختبار فيرما. يمكن لاختبار ميلر-رابين اكتشاف أرقام كارمايكل، مما يقلل بشكل فعال احتمال التحديد الخاطئ إلى الصفر.&lt;/p>
&lt;h3 id="54-الأس-المعياري-السريع-طريقة-التربيع-المتكرر">5.4 الأس المعياري السريع (طريقة التربيع المتكرر)
&lt;/h3>&lt;p>يتطلب خوارزمية اختبار الأولية حساب $a^{N-1} \pmod N$، ولكن عندما يكون $N$ ضخمًا، يصبح $a^{N-1}$ عددًا هائلاً بأرقام فلكية، ولن يتسع في ذاكرة الكمبيوتر.
يتم حل هذه المشكلة بواسطة &lt;strong>التربيع المتكرر (Exponentiation by Squaring)&lt;/strong> أو حساب الأس المعياري. من خلال أخذ الباقي (mod N) في كل خطوة من العملية الحسابية، تظل القيمة دائمًا أقل من $N$، مما يتيح حسابها بسرعة كبيرة (تعقيد زمني $O(\log N)$).&lt;/p>
&lt;hr>
&lt;h2 id="6-تنفيذ-اختبار-الأولية-والأس-المعياري">6. تنفيذ اختبار الأولية والأس المعياري
&lt;/h2>&lt;p>دعونا ننفذ اختبار فيرما للأولية والتربيع المتكرر في C++ و Python.&lt;/p>
&lt;h3 id="61-التنفيذ-بلغة-c">6.1 التنفيذ بلغة C++
&lt;/h3>&lt;p>في C++، تكون أنواع الأعداد الصحيحة القياسية عرضة لتجاوز السعة (overflow)، لذلك هناك حاجة إلى مكتبة أعداد صحيحة متعددة الدقة (مثل GMP) للتعامل مع الأرقام الضخمة. ومع ذلك، لفهم الخوارزمية، سنعرض التنفيذ ضمن نطاق الأعداد الصحيحة 64 بت (&lt;code>unsigned long long&lt;/code>).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;random&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// حساب الأس المعياري السريع (a^b mod m) - طريقة التربيع المتكرر
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">power_mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// إذا كان البت الأقل أهمية لـ b هو 1، نضرب النتيجة في a
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">__int128&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">result&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// تمديد لـ 128 بت لمنع تجاوز السعة
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// تربيع a
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">__int128&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// إزاحة b لليمين (قسمة على 2)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// اختبار فيرما للأولية
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">bool&lt;/span> &lt;span class="nf">fermat_is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">iterations&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">random_device&lt;/span> &lt;span class="n">rd&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mt19937_64&lt;/span> &lt;span class="n">gen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rd&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uniform_int_distribution&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">dis&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">iterations&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dis&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">gen&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// إذا كان a^(p-1) mod p لا يساوي 1، فهو عدد مركب
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">power_mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// على الأرجح أولي
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1000000007&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// عدد أولي معروف
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">fermat_is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; is probably prime.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; is composite.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="62-التنفيذ-بلغة-python">6.2 التنفيذ بلغة Python
&lt;/h3>&lt;p>تدعم أنواع الأعداد الصحيحة القياسية في Python الدقة المتعددة، لذلك لا داعي للقلق بشأن تجاوز السعة. علاوة على ذلك، تستخدم الدالة المدمجة &lt;code>pow(a, b, m)&lt;/code> في Python التربيع المتكرر داخليًا، مما يجعلها سريعة للغاية.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">random&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">fermat_is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">iterations&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> اختبار الأولية الاحتمالي باستخدام اختبار فيرما
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iterations&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># اختيار عدد عشوائي a بين 2 و p-2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># حساب a^(p-1) mod p. الدالة المدمجة pow سريعة.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span> &lt;span class="c1"># عدد مركب مؤكد&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span> &lt;span class="c1"># على الأرجح أولي&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># اختبار&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">number_to_test&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">104729&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="n">fermat_is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">number_to_test&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">number_to_test&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> على الأرجح عدد أولي.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">number_to_test&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> هو عدد مركب.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-التطبيق-في-تشفير-rsa-حيث-تلتقي-أفكار-فيرما-وأويلر">7. التطبيق في تشفير RSA: حيث تلتقي أفكار فيرما وأويلر
&lt;/h2>&lt;p>إن التطبيق الأعظم لمبرهنة فيرما الصغرى (ومبرهنة أويلر) هو &lt;strong>تشفير RSA&lt;/strong>، الذي طوره ريفست (Rivest)، وشامير (Shamir)، وأدلمان (Adleman) في عام 1977.
تشفير RSA هو نظام رائد يُعرف باسم &amp;ldquo;تشفير المفتاح العام&amp;rdquo;، حيث يتم نشر مفتاح التشفير (المفتاح العام) للعالم بأسره، بينما مفتاح فك التشفير (المفتاح الخاص) لا يعرفه سوى المستلم نفسه.&lt;/p>
&lt;p>يعتمد عدم التماثل هذا على الأمان الحسابي المتمثل في أن &amp;ldquo;تحليل الأعداد المركبة الضخمة إلى عواملها الأولية أمر صعب للغاية&amp;rdquo;.&lt;/p>
&lt;h3 id="71-آلية-تشفير-rsa-توليد-المفتاح-التشفير-فك-التشفير">7.1 آلية تشفير RSA (توليد المفتاح، التشفير، فك التشفير)
&lt;/h3>&lt;p>دعونا نتحقق من سير الاتصال الشامل لتشفير RSA باستخدام مخطط تسلسل Mermaid.&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Alice["أليس (المستلم)"]
participant Bob["بوب (المرسل)"]
Alice->>Alice: "توليد عددين أوليين ضخمين p, q"
Alice->>Alice: "حساب N = p * q و φ(N) = (p-1)(q-1)"
Alice->>Alice: "حساب المفتاح العام e والمفتاح الخاص d (e*d ≡ 1 mod φ(N))"
Alice->>Bob: "إرسال المفتاح العام (N, e)"
Note over Bob: "تجهيز النص الواضح M (M &lt; N)"
Bob->>Bob: "حساب النص المشفر C = M^e mod N"
Bob->>Alice: "إرسال النص المشفر C"
Alice->>Alice: "حساب النص الواضح M = C^d mod N وفك التشفير"&lt;/div>
&lt;p>فيما يلي، سنشرح الخطوات الرياضية التفصيلية.&lt;/p>
&lt;h4 id="الخطوة-1-توليد-المفتاح-مهمة-المستلم-أليس">الخطوة 1: توليد المفتاح (مهمة المستلم أليس)
&lt;/h4>&lt;ol>
&lt;li>قم بتوليد عددين أوليين ضخمين عشوائيًا $p$ و $q$ (هنا يتم استخدام اختبار الأولية المذكور أعلاه).&lt;/li>
&lt;li>احسب حاصل ضربهما $N = p \times q$. هذا الـ $N$ يصبح علنيًا.&lt;/li>
&lt;li>باستخدام دالة مؤشر أويلر، احسب $\phi(N) = (p-1)(q-1)$.&lt;/li>
&lt;li>اختر عددًا صحيحًا $e$ (الأس العام) يكون أوليًا نسبيًا مع $\phi(N)$ (غالبًا ما يُستخدم $e = 65537$).&lt;/li>
&lt;li>احسب المعكوس الضربي المعياري $d$ لـ $e$ (الأس الخاص). أي، أوجد $d$ بحيث يتحقق ما يلي:
$$ e \cdot d \equiv 1 \pmod{\phi(N)} $$
يُستخدم &lt;strong>خوارزمية إقليدس الممتدة&lt;/strong> في هذه العملية الحسابية.&lt;/li>
&lt;/ol>
&lt;p>بهذا، يكون &lt;strong>المفتاح العام هو $(N, e)$&lt;/strong>، و&lt;strong>المفتاح الخاص هو $(N, d)$&lt;/strong>. (يجب التخلص من $p, q, \phi(N)$ على الفور أو إخفائها بصرامة).&lt;/p>
&lt;h4 id="الخطوة-2-التشفير-مهمة-المرسل-بوب">الخطوة 2: التشفير (مهمة المرسل بوب)
&lt;/h4>&lt;p>لنفترض أن بوب يريد إرسال الرسالة $M$ إلى أليس (يتم تحويل $M$ من حروف إلى أرقام، حيث $0 \le M &lt; N$).
يستخدم بوب المفتاح العام لأليس $(N, e)$ لإجراء العملية الحسابية التالية لإنشاء النص المشفر $C$.&lt;/p>
$$
C \equiv M^e \pmod N
$$
&lt;p>يرسل بوب هذا الـ $C$ إلى أليس عبر الشبكة.&lt;/p>
&lt;h4 id="الخطوة-3-فك-التشفير-مهمة-المستلم-أليس">الخطوة 3: فك التشفير (مهمة المستلم أليس)
&lt;/h4>&lt;p>تقوم أليس، التي تستقبل النص المشفر $C$، بإجراء العملية الحسابية التالية باستخدام مفتاحها الخاص $d$ الذي تعرفه وحدها.&lt;/p>
$$
M' \equiv C^d \pmod N
$$
&lt;p>بشكل مثير للدهشة، تتطابق نتيجة هذا الحساب $M'$ تمامًا مع الرسالة الأصلية $M$.&lt;/p>
&lt;h3 id="72-لماذا-يمكن-فك-التشفير-إثبات-رياضي">7.2 لماذا يمكن فك التشفير؟ (إثبات رياضي)
&lt;/h3>&lt;p>هنا، تظهر مبرهنة فيرما الصغرى (ومبرهنة أويلر) قيمتها الحقيقية. لماذا يعود $C^d \pmod N$ إلى $M$؟&lt;/p>
&lt;p>دعونا نوسع معادلة فك التشفير.
بما أن $C \equiv M^e \pmod N$، إذن:
&lt;/p>
$$ C^d \equiv (M^e)^d \equiv M^{ed} \pmod N $$
&lt;p>في خطوة توليد المفتاح، اخترنا $d$ بحيث يكون $e \cdot d \equiv 1 \pmod{\phi(N)}$. هذا يعني أنه يوجد عدد صحيح $k$ بحيث يمكن كتابته على النحو التالي:
&lt;/p>
$$ e \cdot d = 1 + k \cdot \phi(N) $$
&lt;p>نعوض بهذا في المعادلة السابقة:
&lt;/p>
$$ M^{ed} = M^{1 + k \cdot \phi(N)} = M \cdot M^{k \cdot \phi(N)} = M \cdot (M^{\phi(N)})^k \pmod N $$
&lt;p>هنا تظهر &lt;strong>مبرهنة أويلر&lt;/strong> ($M^{\phi(N)} \equiv 1 \pmod N$). (※ بدقة، يجب أن يكون $M$ و $N$ أوليين نسبيًا، ولكن في RSA، فإن احتمال عدم كون $M$ و $N$ أوليين نسبيًا منخفض فلكيًا، وباستخدام مبرهنة الباقي الصينية، يمكن إثبات أنها تظل صحيحة حتى لو لم يكونا أوليين نسبيًا).&lt;/p>
&lt;p>وبتطبيق مبرهنة أويلر، حيث $M^{\phi(N)} \equiv 1$:
&lt;/p>
$$ M \cdot (1)^k \equiv M \pmod N $$
&lt;p>لقد تم استعادة $M$ بنجاح! إن خصائص الأرقام التي اكتشفها فيرما وأويلر قبل مئات السنين تضمن تمامًا سرية الاتصالات الرقمية الحديثة.&lt;/p>
&lt;hr>
&lt;h2 id="8-تنفيذ-مبسط-لتشفير-rsa-بلغة-python">8. تنفيذ مبسط لتشفير RSA بلغة (Python)
&lt;/h2>&lt;p>نظرًا لأن النظرية وحدها قد تكون صعبة الاستيعاب، دعونا نستخدم Python لتنفيذ عملية توليد مفتاح تشفير RSA والتشفير وفك التشفير بالفعل. هذا &amp;ldquo;تنفيذ مبسط (لعبة)&amp;rdquo; للأغراض التعليمية، لكن الرياضيات المستخدمة فيه مطابقة تمامًا لتلك الحقيقية.&lt;/p>
&lt;p>سنقوم أيضًا بتضمين &amp;ldquo;خوارزمية إقليدس الممتدة&amp;rdquo; لإيجاد المعكوس الضربي المعياري $d$.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;span class="lnt">70
&lt;/span>&lt;span class="lnt">71
&lt;/span>&lt;span class="lnt">72
&lt;/span>&lt;span class="lnt">73
&lt;/span>&lt;span class="lnt">74
&lt;/span>&lt;span class="lnt">75
&lt;/span>&lt;span class="lnt">76
&lt;/span>&lt;span class="lnt">77
&lt;/span>&lt;span class="lnt">78
&lt;/span>&lt;span class="lnt">79
&lt;/span>&lt;span class="lnt">80
&lt;/span>&lt;span class="lnt">81
&lt;/span>&lt;span class="lnt">82
&lt;/span>&lt;span class="lnt">83
&lt;/span>&lt;span class="lnt">84
&lt;/span>&lt;span class="lnt">85
&lt;/span>&lt;span class="lnt">86
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">random&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># إيجاد القاسم المشترك الأكبر&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># خوارزمية إقليدس الممتدة (إيجاد x, y في ax + by = gcd(a,b))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تُستخدم لإيجاد d في e*d ≡ 1 (mod φ(N))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">extended_gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">extended_gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">extended_gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">g&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">Exception&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;المعكوس الضربي غير موجود&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">phi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># دالة توليد الأعداد الأولية (نسخة مبسطة: توليد أعداد أولية صغيرة)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">generate_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getrandbits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># استخدام اختبار مبسط بدلاً من اختبار فيرما المذكور سابقاً&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">p&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># توليد مفاتيح RSA&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">generate_keypair&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">generate_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">generate_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># التأكد من أن p و q غير متساويين&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">q&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">generate_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># غالباً ما يُستخدم 65537 للأس e، ولكن هنا سنختاره عشوائياً&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randrange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">g&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randrange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># حساب المفتاح الخاص d&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># المفتاح العام (e, n)، المفتاح الخاص (d, n)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">plaintext&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># حساب plaintext^e mod n&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cipher&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">ord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">char&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">char&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">plaintext&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">cipher&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ciphertext&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># حساب cipher^d mod n وتحويله مرة أخرى إلى حروف&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">plain&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="nb">chr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">char&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">char&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">ciphertext&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># مثال على التنفيذ&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;__main__&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;--- تنفيذ مبسط لتشفير RSA ---&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">public_key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">private_key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">generate_keypair&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># استخدام أعداد أولية 12 بت&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;المفتاح العام (e, n): &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">public_key&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;المفتاح الخاص (d, n): &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">private_key&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;Hello Math!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">الرسالة الأصلية: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># التشفير&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">encrypted_msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">public_key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">message&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;النص المشفر: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">encrypted_msg&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># فك التشفير&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">decrypted_msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">private_key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encrypted_msg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;الرسالة التي تم فك تشفيرها: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">decrypted_msg&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>عند تشغيل هذا الكود، ستتمكن من رؤية كيف تتحول مصفوفة من الأحرف إلى مصفوفة من الأرقام غير المألوفة (نص مشفر)، وكيف يتم استعادتها ببراعة إلى السلسلة الأصلية بواسطة المفتاح الخاص.&lt;/p>
&lt;hr>
&lt;h2 id="9-خاتمة-تقاطع-الجمال-الرياضي-مع-التطبيق-العملي">9. خاتمة: تقاطع الجمال الرياضي مع التطبيق العملي
&lt;/h2>&lt;p>في القرن السابع عشر، عندما اكتشف بيير دي فيرما هذه &amp;ldquo;المبرهنة الصغرى&amp;rdquo;، لم يعتقد أحد أنها ستكون مفيدة لأي شيء. فيرما نفسه أجرى أبحاثه في نظرية الأعداد بدافع من الفضول الرياضي البحت.&lt;/p>
&lt;p>ومع ذلك، بعد حوالي 300 عام، وتحديدًا في السبعينيات أثناء فجر شبكات الكمبيوتر، عادت مبرهنة فيرما للظهور بشكل دراماتيكي كتقنية تشفير لا غنى عنها لإنشاء بروتوكولات اتصال آمنة. تقنيات اختبار الأولية القائمة على مبرهنة فيرما الصغرى، وتشفير RSA القائم على مبرهنة أويلر، تدعم حرفياً البنية التحتية للإنترنت الحديثة.&lt;/p>
&lt;p>إن رسائل LINE التي نرسلها دون تفكير كل يوم، ومشترياتنا من أمازون، كلها ترقص على أنغام هذه الصيغة البسيطة والجميلة $a^{p-1} \equiv 1 \pmod p$. تعلمنا مبرهنة فيرما الصغرى أنه مهما كانت الرياضيات مجردة، فسيأتي يوم تكون فيه مفيدة للبشرية.&lt;/p>
&lt;p>أثناء دراسة البرمجة ونظرية التشفير، فإن فهم الهياكل الرياضية التي تكمن في أساسها سيكون سلاحًا رائعًا لفهم سلوك المكتبات المقدمة كـ &amp;ldquo;صناديق سوداء&amp;rdquo; بعمق، ولتصميم أنظمة أكثر أمانًا.&lt;/p></description></item><item><title>الحدس الرياضي للتشفير القائم على الشبكة (Lattice-based cryptography)</title><link>http://kenji.blog/ar/p/lattice-based-cryptography-math-intuition/</link><pubDate>Fri, 11 Sep 2026 21:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/lattice-based-cryptography-math-intuition/</guid><description>&lt;img src="http://kenji.blog/p/lattice-based-cryptography-math-intuition/img/eyecatch.jpg" alt="Featured image of post الحدس الرياضي للتشفير القائم على الشبكة (Lattice-based cryptography)" />&lt;h1 id="1-مقدمة-فجر-التشفير-ما-بعد-الكوانتوم-pqc-وصعود-التشفير-القائم-على-الشبكة">1. مقدمة: فجر التشفير ما بعد الكوانتوم (PQC) وصعود التشفير القائم على الشبكة
&lt;/h1>&lt;p>يتم دعم البنية التحتية الرقمية لمجتمعنا الحديث من خلال تقنيات تشفير المفتاح العام مثل تشفير RSA وتشفير المنحنى الإهليلجي (ECC). تعتمد هذه الأساليب التشفيرية في أمانها على صعوبة مسائل رياضية مثل &amp;ldquo;مسألة التحليل إلى عوامل أولية&amp;rdquo; و&amp;quot;مسألة اللوغاريتم المنفصل&amp;quot;، والتي يُعتقد أنه لا يمكن حلها بكفاءة (تتطلب وقتاً أسياً) بواسطة أجهزة الكمبيوتر الكلاسيكية التقليدية.&lt;/p>
&lt;p>ومع ذلك، أحدثت &amp;ldquo;خوارزمية شور&amp;rdquo; (Shor&amp;rsquo;s Algorithm) التي نشرها بيتر شور (Peter Shor) في عام 1994 صدمة في عالم التشفير. أثبتت هذه الخوارزمية رياضياً أنه عند تحقيق أجهزة كمبيوتر كمومية واسعة النطاق، سيكون من الممكن حل مسألة التحليل إلى عوامل أولية ومسألة اللوغاريتم المنفصل في وقت كثير الحدود. وهذا يعني أن تشفير المفتاح العام المستخدم على نطاق واسع حالياً سيصبح قابلاً لفك التشفير بالكامل في المستقبل.&lt;/p>
&lt;p>لمواجهة &amp;ldquo;التهديد الكمومي&amp;rdquo; (Quantum Threat)، أصبح من الملح إجراء أبحاث حول طرق تشفير جديدة يصعب فك تشفيرها حتى باستخدام أجهزة الكمبيوتر الكمومية. يُطلق على هذا المجال اسم &amp;ldquo;التشفير ما بعد الكوانتوم&amp;rdquo; (Post-Quantum Cryptography: PQC) أو &amp;ldquo;التشفير المقاوم للحوسبة الكمومية&amp;rdquo;.&lt;/p>
&lt;p>هناك عدة مرشحين أقوياء في PQC. تشمل هذه التشفير القائم على التجزئة، والتشفير القائم على الكود، وتشفير متعدد الحدود متعدد المتغيرات، وتشفير التماثل الفائق. ومع ذلك، فإن التشفير الذي يحظى بأكبر قدر من الاهتمام حالياً ويحتل مركز الصدارة في عملية توحيد معايير PQC من قبل المعهد الوطني للمعايير والتكنولوجيا (NIST) هو &amp;ldquo;التشفير القائم على الشبكة&amp;rdquo; (Lattice-based cryptography). يتميز التشفير القائم على الشبكة بسرعات معالجة سريعة جداً للتشفير وفك التشفير مقارنة بالطرق الأخرى، كما يتميز بامتلاكه دليلاً أمنياً قوياً للغاية في نظرية التشفير، وهو تقليل &amp;ldquo;التعقيد في أسوأ الحالات&amp;rdquo; (Worst-case complexity) إلى &amp;ldquo;التعقيد في الحالة المتوسطة&amp;rdquo; (Average-case complexity).&lt;/p>
&lt;p>في هذا المقال، سننطلق من التعريف الرياضي لـ &amp;ldquo;الشبكة&amp;rdquo; (Lattice) الذي يشكل أساس التشفير القائم على الشبكة، وسنشرح بتعمق المشاكل الصعبة على الشبكة مثل SVP (مسألة المتجه الأقصر) و CVP (مسألة المتجه الأقرب)، بالإضافة إلى &amp;ldquo;مسألة LWE&amp;rdquo; (التعلم مع الأخطاء - Learning With Errors) التي تعد قلب التشفير القائم على الشبكة الحديث، باستخدام المعادلات الرياضية والحدس الهندسي والأمثلة العددية المحددة.&lt;/p>
&lt;h1 id="2-التعريف-الرياضي-والحدس-الهندسي-للشبكة-lattice">2. التعريف الرياضي والحدس الهندسي للشبكة (Lattice)
&lt;/h1>&lt;h2 id="21-الفضاء-المتجهي-والشبكة">2.1 الفضاء المتجهي والشبكة
&lt;/h2>&lt;p>في الرياضيات، تشير &amp;ldquo;الشبكة&amp;rdquo; (Lattice) إلى مجموعة من النقاط المنفصلة المرتبة بانتظام داخل فضاء متجهي حقيقي ذو $n$ بُعد $\mathbb{R}^n$. إنها تشبه الفضاء المتجهي (Vector Space) الذي ندرسه في الجبر الخطي، ولكن هناك فرق حاسم. في حين أن الفضاء المتجهي هو فضاء مستمر يتم التعبير عنه بتركيبة خطية ذات &amp;ldquo;معاملات حقيقية&amp;rdquo; لمتجهات الأساس، فإن الشبكة هي فضاء منفصل يتم التعبير عنه بتركيبة خطية ذات &amp;ldquo;معاملات صحيحة&amp;rdquo; لمتجهات الأساس.&lt;/p>
&lt;p>دعونا نقدم تعريفاً رياضياً دقيقاً. نعتبر $n$ ($n \le m$) من المتجهات المستقلة خطياً $\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n$ في فضاء متجهي حقيقي ذو $m$ بُعد $\mathbb{R}^m$. نضع المصفوفة التي تحتوي على هذه المتجهات كمتجهات عمودية كـ $B = [\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n] \in \mathbb{R}^{m \times n}$. تُسمى هذه $B$ &amp;ldquo;أساس&amp;rdquo; (Basis) الشبكة.&lt;/p>
&lt;p>الشبكة $\mathcal{L}(B)$ الناتجة عن هذا الأساس $B$ تُعرّف على النحو التالي:&lt;/p>
$$
\mathcal{L}(B) = \left\{ \sum_{i=1}^{n} x_i \mathbf{b}_i \mathrel{\bigg|} x_i \in \mathbb{Z} \right\} = \{ B \mathbf{x} \mid \mathbf{x} \in \mathbb{Z}^n \}
$$
&lt;p>النقطة المهمة هنا هي أن المعاملات $x_i$ تقتصر على الأعداد الصحيحة $\mathbb{Z}$ بدلاً من الأعداد الحقيقية $\mathbb{R}$. ونتيجة لذلك، تتشكل &amp;ldquo;مجموعة من النقاط المنفصلة&amp;rdquo; مثل نقاط التقاطع المتباعدة بمسافات متساوية، بدلاً من النقاط المستمرة التي توجد بأعداد لا حصر لها في الفضاء.&lt;/p>
&lt;h2 id="22-الصورة-الهندسية">2.2 الصورة الهندسية
&lt;/h2>&lt;p>دعونا نفكر في مثال على المستوى ثنائي الأبعاد $\mathbb{R}^2$. إذا اخترنا متجهات الأساس $\mathbf{b}_1 = \begin{pmatrix} 1 \\ 0 \end{pmatrix}$ و $\mathbf{b}_2 = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$، فإن الشبكة الناتجة عنها ستكون مجموعة من جميع الإحداثيات الصحيحة $(x, y) \in \mathbb{Z}^2$ على مستوى الإحداثيات. هذه هي أبسط &amp;ldquo;شبكة مربعة&amp;rdquo;.&lt;/p>
&lt;p>ومع ذلك، لا تكون الشبكات متعامدة دائماً. على سبيل المثال، إذا أخذنا الأساس $\mathbf{b}_1 = \begin{pmatrix} 2 \\ 1 \end{pmatrix}$ و $\mathbf{b}_2 = \begin{pmatrix} 1 \\ 3 \end{pmatrix}$، فستكون النقاط الناتجة أشبه بنقاط تقاطع شبكة مائلة ومائلة.&lt;/p>
&lt;h2 id="23-عدم-تفرد-الأساس-والتحويل-الأحادي-المعيار-unimodular">2.3 عدم تفرد الأساس والتحويل الأحادي المعيار (Unimodular)
&lt;/h2>&lt;p>هناك خاصية مهمة تتعلق بأساس أمان التشفير القائم على الشبكة. وهي &amp;ldquo;وجود عدد لا حصر له من الأسس التي تولد نفس الشبكة&amp;rdquo;.&lt;/p>
&lt;p>على سبيل المثال، الشبكة $\mathbb{Z}^2$ الناتجة عن الأساس المذكور أعلاه $\mathbf{b}_1 = (1, 0)^T, \mathbf{b}_2 = (0, 1)^T$، يمكن إنتاجها أيضاً بشكل مطابق للشبكة $\mathbb{Z}^2$ باستخدام الأساس $\mathbf{b}'_1 = (1, 1)^T, \mathbf{b}'_2 = (2, 3)^T$.&lt;/p>
&lt;p>الشرط الضروري والكافي لأساس معين $B$ وأساس آخر $B'$ لتوليد نفس الشبكة هو وجود مصفوفة ذات عناصر صحيحة $U \in \mathbb{Z}^{n \times n}$، بحيث تكون المحددات $\det(U) = \pm 1$، ويُعبَّر عنها بـ:
&lt;/p>
$$ B' = B U $$
&lt;p>
تُسمى مثل هذه المصفوفة $U$ بـ &amp;ldquo;مصفوفة أحادية المعيار&amp;rdquo; (Unimodular matrix).&lt;/p>
&lt;p>الفكرة الأساسية في تطبيقات التشفير هي استخدام &amp;ldquo;أساس جيد&amp;rdquo; (أساس قريب من التعامد ومكون من متجهات قصيرة) كمفتاح سري، واستخدام &amp;ldquo;أساس سيء&amp;rdquo; (أساس مائل بشكل متبادل للغاية ومكون من متجهات طويلة جداً) كمفتاح عام. يصبح حساب الأساس الجيد من الأساس السيء أمراً صعباً للغاية عندما يزداد البعد. هذا هو الحدس الأساسي للتشفير القائم على الشبكة.&lt;/p>
&lt;h1 id="3-مسائل-صعبة-الحساب-في-الشبكة">3. مسائل صعبة الحساب في الشبكة
&lt;/h1>&lt;p>يعتمد أمان التشفير القائم على الشبكة على صعوبة حل مسائل رياضية معينة على الشبكة. هنا نقدم اثنتين من المسائل الأساسية والأكثر شهرة.&lt;/p>
&lt;h2 id="31-مسألة-المتجه-الأقصر-shortest-vector-problem-svp">3.1 مسألة المتجه الأقصر (Shortest Vector Problem: SVP)
&lt;/h2>&lt;p>تعد مسألة SVP هي المسألة الأكثر كلاسيكية وشهرة في نظرية الشبكة.&lt;/p>
&lt;p>&lt;strong>التعريف (SVP):&lt;/strong>
بالنظر إلى أي أساس شبكة $B$، ابحث عن المتجه $\mathbf{v}$ الذي له أصغر معيار إقليدي (طول) من بين المتجهات غير الصفرية التي تنتمي إلى تلك الشبكة $\mathcal{L}(B)$.&lt;/p>
&lt;p>مُعبّراً عنها رياضياً، إنها مسألة إيجاد المتجه $\mathbf{v}$ الذي يحقق $\min_{\mathbf{v} \in \mathcal{L}(B) \setminus \{\mathbf{0}\}} \| \mathbf{v} \|$. يُكتب هذا الطول الأدنى $\lambda_1(\mathcal{L})$ ويُسمى &amp;ldquo;الحد الأدنى المتتالي الأول للشبكة&amp;rdquo; (First successive minimum).&lt;/p>
&lt;p>في الأبعاد المنخفضة مثل الأبعاد الثنائية أو الثلاثية، يمكن العثور على أقصر متجه بصرياً عن طريق رسم شكل. أو يمكن حله بكفاءة باستخدام خوارزميات مثل خوارزمية تقليل شبكة غاوس. ومع ذلك، عندما تصبح الأبعاد $n$ عالية في نطاق مئات إلى آلاف، فمن المعروف أن حل مسألة SVP بدقة هي مسألة NP-صعبة (NP-hard).&lt;/p>
&lt;p>في التشفير الحقيقي، بدلاً من المتجه الأقصر الدقيق، يتم استخدام مسألة SVP التقريبية ($\gamma$-SVP) التي تعثر على &amp;ldquo;متجه قصير تقريباً&amp;rdquo;. عندما يكون معامل التقريب $\gamma$ بحجم كثير الحدود، لا تزال هذه المسألة تعتبر صعبة للغاية.&lt;/p>
&lt;h2 id="32-مسألة-المتجه-الأقرب-closest-vector-problem-cvp">3.2 مسألة المتجه الأقرب (Closest Vector Problem: CVP)
&lt;/h2>&lt;p>مسألة CVP هي أيضاً مسألة بالغة الأهمية في التشفير القائم على الشبكة.&lt;/p>
&lt;p>&lt;strong>التعريف (CVP):&lt;/strong>
بالنظر إلى أي أساس شبكة $B$ وأي متجه مستهدف $\mathbf{t} \in \mathbb{R}^m$ في الفضاء (ليس بالضرورة نقطة شبكة)، ابحث عن نقطة الشبكة $\mathbf{v} \in \mathcal{L}(B)$ الأقرب إلى $\mathbf{t}$ من بين نقاط الشبكة.&lt;/p>
&lt;p>رياضياً، هي مسألة البحث عن نقطة الشبكة $\mathbf{v}$ التي تحقق $\min_{\mathbf{v} \in \mathcal{L}(B)} \| \mathbf{v} - \mathbf{t} \|$.&lt;/p>
&lt;p>على غرار مسألة SVP، فإن CVP هي مسألة NP-صعبة في الأبعاد العالية. من وجهة نظر التطبيق التشفيري، فإن مسألة LWE، التي سيتم وصفها لاحقاً، مرتبطة ارتباطاً وثيقاً بمتغير خاص من CVP يُعرف باسم &amp;ldquo;فك التشفير ذي المسافة المحدودة&amp;rdquo; (Bounded Distance Decoding: BDD).&lt;/p>
&lt;h2 id="33-لماذا-لا-يمكن-حلها-عندما-تصبح-الأبعاد-عالية-حدود-lll-و-bkz">3.3 لماذا لا يمكن حلها عندما تصبح الأبعاد عالية؟ (حدود LLL و BKZ)
&lt;/h2>&lt;p>خوارزمية LLL (خوارزمية Lenstra-Lenstra-Lovász) هي خوارزمية مشهورة لحل مسائل الشبكة ذات الأبعاد العالية. تعمل خوارزمية LLL في وقت كثير الحدود ويمكنها تقليل (Reduction) أساس الشبكة إلى &amp;ldquo;أساس جيد&amp;rdquo; إلى حد ما. ومع ذلك، فإن أقصر متجه يمكن أن تجده خوارزمية LLL له معامل تقريب أسي ($2^{\mathcal{O}(n)}$) بالنسبة لطول المتجه الأقصر الحقيقي، وبالتالي لا يصل إلى مستوى كسر أمان التشفير.&lt;/p>
&lt;p>باستخدام خوارزميات تقليل الأساس الأقوى مثل خوارزمية BKZ (Block Korkine-Zolotarev)، وهي تحسين لـ LLL، يمكن العثور على متجهات أقصر، ولكن كمية الحسابات تزداد بشكل أسي مع حجم الكتلة. في التشفير القائم على الشبكة، يتم تحديد البارامترات الآمنة (مثل حجم البعد $n$) عن طريق تقدير وقت تنفيذ خوارزمية BKZ. في المعايير القياسية الحالية لـ PQC، يتم اختيار قيم للبعد $n$ تتراوح من 500 إلى أكثر من 1000، ويقال إن فك التشفير سيستغرق وقتاً أطول من عمر الكون، حتى باستخدام أجهزة الكمبيوتر العملاقة أو الحواسيب الكمومية المستقبلية.&lt;/p>
&lt;h1 id="4-الصياغة-الرياضية-لمسألة-lwe-التعلم-مع-الأخطاء---learning-with-errors">4. الصياغة الرياضية لمسألة LWE (التعلم مع الأخطاء - Learning With Errors)
&lt;/h1>&lt;p>تعتمد معظم التشفيرات الحديثة القائمة على الشبكة على &amp;ldquo;مسألة LWE&amp;rdquo; (التعلم مع الأخطاء) التي اقترحها عوديد ريغيف (Oded Regev) في عام 2005. يكمن جمال مسألة LWE في بساطة صياغتها، وحقيقة أنها تمتلك دليلاً رياضياً قوياً يسمى &amp;ldquo;التقليل من التعقيد في أسوأ الحالات إلى التعقيد في الحالة المتوسطة&amp;rdquo;.&lt;/p>
&lt;h2 id="41-نظام-المعادلات-الخطية-بدون-ضوضاء">4.1 نظام المعادلات الخطية بدون ضوضاء
&lt;/h2>&lt;p>لفهم مسألة LWE، دعونا نفكر أولاً في نظام بسيط من المعادلات الخطية المتزامنة بدون ضوضاء.
لنفترض أن هناك متجهاً سرياً غير معروف $\mathbf{s} \in \mathbb{Z}_q^n$ (كل مكون هو عدد صحيح من $0$ إلى $q-1$). حيث $q$ هو عدد أولي.&lt;/p>
&lt;p>نختار متجهات معاملات عشوائية $\mathbf{a}_1, \mathbf{a}_2, \dots \in \mathbb{Z}_q^n$، ونحسب الضرب النقطي (الجداء الداخلي) مع المتجه السري $\mathbf{s}$ في المعيار $q$ (mod $q$).
$b_1 = \langle \mathbf{a}_1, \mathbf{s} \rangle \pmod q$
$b_2 = \langle \mathbf{a}_2, \mathbf{s} \rangle \pmod q$
$\vdots$&lt;/p>
&lt;p>إذا أُعطينا عدداً كافياً (أكثر من $n$) من أزواج $(\mathbf{a}_i, b_i)$، يمكننا بسهولة استعادة المتجه السري $\mathbf{s}$ باستخدام &amp;ldquo;الحذف الغاوسي&amp;rdquo; (Gaussian elimination) في الجبر الخطي. هذه مسألة يمكن حلها بسهولة في وقت كثير الحدود.&lt;/p>
&lt;h2 id="42-تعريف-مسألة-lwe-إضافة-الضوضاء">4.2 تعريف مسألة LWE: إضافة الضوضاء
&lt;/h2>&lt;p>الآن، ماذا سيحدث إذا أضفنا &amp;ldquo;ضوضاء&amp;rdquo; (خطأ) طفيفة إلى هذه المسألة؟
هذا هو جوهر مسألة LWE.&lt;/p>
&lt;p>بالنسبة للمتجه السري غير المعروف $\mathbf{s} \in \mathbb{Z}_q^n$، نضيف خطأً صغيراً $e_i \in \mathbb{Z}_q$ إلى نتيجة كل معادلة.
$b_i = \langle \mathbf{a}_i, \mathbf{s} \rangle + e_i \pmod q$&lt;/p>
&lt;p>هنا، $e_i$ هو قيمة صحيحة صغيرة بمتوسط 0 وانحراف معياري صغير نسبياً (على سبيل المثال، يتم اختياره من توزيع غاوسي منفصل يشبه التوزيع الطبيعي).
المعلومات المعطاة هي قائمة بأزواج من المتجهات العشوائية $\mathbf{a}_i$ والقيمة المحسوبة $b_i$ مع الخطأ المضاف إليها.
$( \mathbf{a}_1, b_1 ), ( \mathbf{a}_2, b_2 ), \dots, ( \mathbf{a}_m, b_m )$&lt;/p>
&lt;p>التعبير عن هذا كمصفوفة يجعله أنيقاً جداً.
باستخدام مصفوفة عشوائية $A \in \mathbb{Z}_q^{m \times n}$، والمتجه السري $\mathbf{s} \in \mathbb{Z}_q^n$، ومتجه الخطأ $\mathbf{e} \in \mathbb{Z}_q^m$، يمكن كتابته كـ:
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q $$
&lt;p>
يُعطى فقط $A$ و $\mathbf{b}$. إيجاد $\mathbf{s}$ من هذه المعلومات هو &amp;ldquo;مسألة LWE البحثية&amp;rdquo; (Search LWE problem).&lt;/p>
&lt;p>نظراً لوجود الخطأ $e_i$، إذا حاولت استخدام الحذف الغاوسي، فسوف يتضخم الخطأ بشكل أسي أثناء عملية جمع وطرح المعادلات، ولن تتمكن من الوصول إلى الإجابة الصحيحة. على الرغم من أنها تبدو للوهلة الأولى وكأنها معادلات خطية متزامنة بسيطة، إلا أن إضافة هذه الضوضاء الصغيرة ترفع مستوى صعوبة المسألة إلى مستوى NP-صعب.&lt;/p>
&lt;h2 id="43-مسألة-lwe-التقريرية-decision-lwe">4.3 مسألة LWE التقريرية (Decision LWE)
&lt;/h2>&lt;p>غالباً ما يُستخدم في إثباتات نظرية التشفير متغير من مسألة LWE البحثية يسمى &amp;ldquo;مسألة LWE التقريرية&amp;rdquo; (Decision LWE problem).&lt;/p>
&lt;p>مسألة LWE التقريرية هي مسألة تحديد من أي التوزيعين التاليين تم أخذ قائمة معينة من العينات:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>توزيع LWE&lt;/strong>: $(A, \mathbf{b} = A\mathbf{s} + \mathbf{e} \pmod q)$ المحسوب عمداً.&lt;/li>
&lt;li>&lt;strong>توزيع عشوائي منتظم&lt;/strong>: $(A, \mathbf{u})$ يتكون من مصفوفة مختارة عشوائياً بالكامل $A$ ومتجه $\mathbf{u}$.&lt;/li>
&lt;/ol>
&lt;p>المدهش هو أنه إذا تم اختيار بارامترات مسألة LWE بشكل مناسب، فإن الأزواج التي يتم الحصول عليها من توزيع LWE تصبح &amp;ldquo;غير قابلة للتمييز حسابياً&amp;rdquo; (Computationally Indistinguishable) عن أزواج البيانات العشوائية تماماً. تُشكل هذه الخاصية الأساس الذي يجعل التشفير القائم على LWE قادراً على توليد &amp;ldquo;نصوص مشفرة لا يمكن تمييزها عن الأرقام العشوائية&amp;rdquo;.&lt;/p>
&lt;h2 id="44-التقليل-من-التعقيد-في-أسوأ-الحالات-إلى-التعقيد-في-الحالة-المتوسطة-مبرهنة-regev">4.4 التقليل من التعقيد في أسوأ الحالات إلى التعقيد في الحالة المتوسطة (مبرهنة Regev)
&lt;/h2>&lt;p>الإنجاز الأكبر لعوديد ريغيف كان الربط الرياضي لصعوبة مسألة LWE هذه بصعوبة مسائل الشبكة المذكورة أعلاه (SVP و CVP).&lt;/p>
&lt;p>لقد استخدم التقليل الكمومي (Quantum reduction) لإثبات أنه &amp;ldquo;إذا كانت هناك خوارزمية ذات وقت كثير الحدود يمكنها حل مسألة LWE في المتوسط (لـ $A$ و $\mathbf{e}$ المختارة عشوائياً)، فهناك خوارزمية كمومية ذات وقت كثير الحدود يمكنها حل مسألة Gap-SVP في الحالة الأسوأ (أصعب حالة) لأي شبكة.&amp;rdquo; (في وقت لاحق، أوضح Peikert وآخرون تقليلاً كلاسيكياً أيضاً).&lt;/p>
&lt;p>هذه خاصية حالمة في نظرية التشفير. وذلك لأنها تبدد المخاوف القائلة بأن &amp;ldquo;التشفير قد يُكسر لأننا ربما اخترنا بالصدفة مفتاحاً ضعيفاً (جزء من الحالة المتوسطة)&amp;quot;، وتوفر ضماناً قوياً بأنه &amp;ldquo;إذا كان من الممكن حل LWE المتوسط، فسيتم حل جميع المسائل الصعبة للشبكة (لذلك فإن LWE صعب بالتأكيد)&amp;rdquo;.&lt;/p>
&lt;div class="mermaid">graph TD
A["مسائل الشبكة في أسوأ الحالات (Gap-SVP, SIVP)"] -->|تقليل كمومي/كلاسيكي| B["مسألة LWE في الحالة المتوسطة"]
B -->|البناء التشفيري| C["أنظمة التشفير القائمة على LWE (PKE, KEM, FHE)"]
style A fill:#ffcccc,stroke:#ff0000,stroke-width:2px,color:#000
style B fill:#ccffcc,stroke:#00aa00,stroke-width:2px,color:#000
style C fill:#ccccff,stroke:#0000ff,stroke-width:2px,color:#000&lt;/div>
&lt;h1 id="5-بناء-نظام-تشفير-المفتاح-العام-باستخدام-lwe-تشفير-regev">5. بناء نظام تشفير المفتاح العام باستخدام LWE (تشفير Regev)
&lt;/h1>&lt;p>الآن وقد فهمنا صعوبة مسألة LWE، دعونا نرى كيف يتم استخدامها للتشفير وفك التشفير في نظام تشفير المفتاح العام الأساسي الذي اقترحه عوديد ريغيف. سنشرح هنا الآلية الأساسية لتشفير رسالة من بت واحد $M \in \{0, 1\}$.&lt;/p>
&lt;h2 id="51-توليد-المفتاح-key-generation">5.1 توليد المفتاح (Key Generation)
&lt;/h2>&lt;ol>
&lt;li>كمعلمات للنظام، نحدد العدد الأولي الأساسي $q$، والبعد $n$، وعدد المعادلات $m$ ($m > n \log q$).&lt;/li>
&lt;li>كمفتاح سري، نختار بشكل عشوائي متجهاً $\mathbf{s} \in \mathbb{Z}_q^n$.&lt;/li>
&lt;li>نقوم بتوليد مصفوفة عشوائية $A \in \mathbb{Z}_q^{m \times n}$.&lt;/li>
&lt;li>نختار متجه خطأ صغيراً $\mathbf{e} \in \mathbb{Z}_q^m$ من توزيع أخطاء مثل التوزيع الغاوسي المنفصل.&lt;/li>
&lt;li>نحسب المتجه $\mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q$.&lt;/li>
&lt;li>المفتاح العام (Public Key) هو $(A, \mathbf{b})$.&lt;/li>
&lt;li>المفتاح السري (Secret Key) هو $\mathbf{s}$.&lt;/li>
&lt;/ol>
&lt;p>المفتاح العام هو بالضبط &amp;ldquo;مثيل لمسألة LWE&amp;rdquo; بحد ذاتها. إيجاد المفتاح السري $\mathbf{s}$ من المفتاح العام $(A, \mathbf{b})$ يعادل حل مسألة LWE البحثية، مما يضمن الأمان.&lt;/p>
&lt;h2 id="52-التشفير-encryption">5.2 التشفير (Encryption)
&lt;/h2>&lt;p>تقوم أليس بتشفير رسالة من بت واحد $M \in \{0, 1\}$ باستخدام المفتاح العام لبوب $(A, \mathbf{b})$.&lt;/p>
&lt;ol>
&lt;li>تختار متجهاً ثنائياً عشوائياً (مكوناته 0 أو 1) $\mathbf{r} \in \{0, 1\}^m$.&lt;/li>
&lt;li>كجزء أول من النص المشفر، تحسب المتجه $\mathbf{u} = A^T \mathbf{r} \pmod q$. ($A^T$ هي المصفوفة المنقولة لـ $A$. بعبارة أخرى، تقوم بجمع صفوف $A$ التي يكون فيها المكون المقابل في $\mathbf{r}$ يساوي 1).&lt;/li>
&lt;li>كجزء ثانٍ من النص المشفر، تحسب العدد القياسي (scalar) $v = \mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q$.
(إذا كانت الرسالة $M$ هي 0 فلا تجمع شيئاً، وإذا كانت $1$ تجمع قيمة نصف $q$ تماماً $\lfloor \frac{q}{2} \rfloor$).&lt;/li>
&lt;li>النص المشفر (Ciphertext) هو $(\mathbf{u}, v)$.&lt;/li>
&lt;/ol>
&lt;p>المعنى الحدسي للتشفير هو أخذ &amp;ldquo;مجموع مجموعة فرعية عشوائية&amp;rdquo; لمتجه المفتاح العام المصفوفة $A$ والمتجه $\mathbf{b}$. نظراً لصعوبة مسألة LWE التقريرية، يبدو هذا النص المشفر $(\mathbf{u}, v)$ غير قابل للتمييز عن متجه عشوائي تماماً وعدد عشوائي منتظم (الأمان الدلالي: Semantic Security).&lt;/p>
&lt;div class="mermaid">flowchart LR
M["رسالة M في {0,1}"] --> Enc
PK["مفتاح عام (A, b)"] --> Enc
r["متجه ثنائي عشوائي r"] --> Enc
subgraph Enc ["عملية التشفير"]
direction TB
u_calc["u = A^T * r mod q"]
v_calc["v = b^T * r + M * floor(q/2) mod q"]
end
Enc --> CT["نص مشفر (u, v)"]&lt;/div>
&lt;h2 id="53-فك-التشفير-decryption">5.3 فك التشفير (Decryption)
&lt;/h2>&lt;p>يقوم بوب بفك تشفير النص المشفر $(\mathbf{u}, v)$ باستخدام مفتاحه السري $\mathbf{s}$.&lt;/p>
&lt;ol>
&lt;li>يحسب القيمة التالية: $D = v - \mathbf{s}^T \mathbf{u} \pmod q$&lt;/li>
&lt;li>إذا كانت النتيجة المحسوبة قريبة من $0$، فإنه يُخرج $M=0$. وإذا كانت قريبة من $\lfloor \frac{q}{2} \rfloor$، فإنه يُخرج $M=1$.&lt;/li>
&lt;/ol>
&lt;p>لماذا يمكن فك التشفير بهذه الطريقة؟ دعونا نوسع ذلك رياضياً.
تذكر أن $\mathbf{b} = A \mathbf{s} + \mathbf{e}$.&lt;/p>
$$
\begin{aligned}
v - \mathbf{s}^T \mathbf{u} &amp;= (\mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T (A^T \mathbf{r}) \\
&amp;= ((A \mathbf{s} + \mathbf{e})^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= (\mathbf{s}^T A^T \mathbf{r} + \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q
\end{aligned}
$$
&lt;p>هنا، تم إلغاء $\mathbf{s}^T A^T \mathbf{r}$ بشكل جميل من المعادلة!
ما تبقى هو $\mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor$.&lt;/p>
&lt;p>$\mathbf{e}$ هو متجه ضوضاء بمكونات صغيرة جداً، و $\mathbf{r}$ هو متجه ثنائي بمكونات 0 أو 1. لذلك، فإن حاصل الضرب النقطي $\mathbf{e}^T \mathbf{r}$ يظل أيضاً قيمة صغيرة نسبياً (إذا تم اختيار المعلمات بشكل مناسب).&lt;/p>
&lt;ul>
&lt;li>إذا كان $M=0$، فإن النتيجة تكون $\mathbf{e}^T \mathbf{r}$، وهي قيمة صغيرة قريبة من $0$.&lt;/li>
&lt;li>إذا كان $M=1$، فإن النتيجة تكون $\mathbf{e}^T \mathbf{r} + \lfloor \frac{q}{2} \rfloor$، وستقع حول قيمة نصف $q$ وهي $\lfloor \frac{q}{2} \rfloor$.&lt;/li>
&lt;/ul>
&lt;p>إذا تم تصميم المعلمات بحيث تظل القيمة المطلقة للخطأ $\mathbf{e}^T \mathbf{r}$ أقل من $\frac{q}{4}$، فيمكن لبوب تحديد (فك تشفير) الرسالة $M$ بدقة بمجرد النظر إلى ما إذا كانت نتيجة الحساب أقرب إلى $0$ أو $\lfloor \frac{q}{2} \rfloor$. هذه هي الآلية الجميلة التي يعمل بها التشفير القائم على LWE.&lt;/p>
&lt;div class="mermaid">flowchart LR
CT["نص مشفر (u, v)"] --> Dec
SK["مفتاح سري s"] --> Dec
subgraph Dec ["عملية فك التشفير"]
direction TB
calc["حساب D = v - s^T * u mod q"]
check["تحقق مما إذا كان D أقرب إلى 0 أو q/2"]
end
calc --> check
Dec --> M_out["رسالة مستردة M"]&lt;/div>
&lt;h1 id="6-مثال-لعبة-toy-example-لتشفير-lwe-باستخدام-قيم-عددية-محددة">6. مثال لعبة (Toy Example) لتشفير LWE باستخدام قيم عددية محددة
&lt;/h1>&lt;p>نظراً لأن سلسلة المعادلات وحدها قد تجعل من الصعب استيعاب المفهوم، دعونا نتبع الحساب من التشفير إلى فك التشفير عن طريق تعيين قيم عددية صغيرة جداً بالفعل.
(※ في أنظمة التشفير الحقيقية، لضمان الأمان، يتم استخدام $n$ بقيمة 500 أو أكثر، و $q$ بقيمة آلاف أو أكثر).&lt;/p>
&lt;p>&lt;strong>【إعداد البارامترات】&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>المعيار $q = 17$ (عدد أولي. وبالتالي تأخذ القيم النطاق من $0$ إلى $16$)&lt;/li>
&lt;li>البعد $n = 2$&lt;/li>
&lt;li>عدد المعادلات $m = 4$&lt;/li>
&lt;li>لنفترض أننا نريد تشفير الرسالة $M = 1$.&lt;/li>
&lt;li>مقدار إزاحة الرسالة: $\lfloor \frac{q}{2} \rfloor = \lfloor \frac{17}{2} \rfloor = 8$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【1. مرحلة توليد المفتاح】&lt;/strong>
يختار بوب المفتاح السري $\mathbf{s}$ والمصفوفة $A$ ومتجه الخطأ $\mathbf{e}$ عشوائياً.
&lt;/p>
$$ \mathbf{s} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} \in \mathbb{Z}_{17}^2 $$
$$ A = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \in \mathbb{Z}_{17}^{4 \times 2} $$
$$ \mathbf{e} = \begin{pmatrix} 1 \\ -1 \\ 0 \\ 2 \end{pmatrix} \equiv \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} \pmod{17} $$
&lt;p>ثم يحسب المفتاح العام $\mathbf{b}$.
&lt;/p>
$$ A \mathbf{s} = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 2\times 3 + 15\times 4 \\ 1\times 3 + 8\times 4 \\ 14\times 3 + 5\times 4 \\ 9\times 3 + 10\times 4 \end{pmatrix} = \begin{pmatrix} 6 + 60 \\ 3 + 32 \\ 42 + 20 \\ 27 + 40 \end{pmatrix} = \begin{pmatrix} 66 \\ 35 \\ 62 \\ 67 \end{pmatrix} $$
&lt;p>
نحسب هذا بالنسبة للمعيار 17. (على سبيل المثال $66 = 17 \times 3 + 15$)
&lt;/p>
$$ A \mathbf{s} \pmod{17} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} $$
&lt;p>
نضيف متجه الخطأ $\mathbf{e}$.
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} + \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} = \begin{pmatrix} 16 \\ 17 \\ 11 \\ 18 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 0 \\ 11 \\ 1 \end{pmatrix} \pmod{17} $$
&lt;p>المفتاح العام هو $A$ و $\mathbf{b} = (16, 0, 11, 1)^T$.&lt;/p>
&lt;p>&lt;strong>【2. مرحلة التشفير】&lt;/strong>
تقوم أليس بتشفير الرسالة $M = 1$.
تختار متجهاً عشوائياً $\mathbf{r}$. هنا نفترض $\mathbf{r} = (1, 0, 1, 0)^T$.&lt;/p>
&lt;p>تحسب $\mathbf{u}$.
&lt;/p>
$$ \mathbf{u} = A^T \mathbf{r} = \begin{pmatrix} 2 &amp; 1 &amp; 14 &amp; 9 \\ 15 &amp; 8 &amp; 5 &amp; 10 \end{pmatrix} \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 2 \times 1 + 14 \times 1 \\ 15 \times 1 + 5 \times 1 \end{pmatrix} = \begin{pmatrix} 16 \\ 20 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 3 \end{pmatrix} \pmod{17} $$
&lt;p>تحسب $v$.
&lt;/p>
$$ \mathbf{b}^T \mathbf{r} = (16, 0, 11, 1) \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = 16 \times 1 + 11 \times 1 = 27 \equiv 10 \pmod{17} $$
&lt;p>
تضيف القيمة $\lfloor 17/2 \rfloor = 8$ المطابقة للرسالة $M=1$.
&lt;/p>
$$ v = \mathbf{b}^T \mathbf{r} + M \cdot 8 = 10 + 1 \times 8 = 18 \equiv 1 \pmod{17} $$
&lt;p>ترسل أليس النص المشفر $(\mathbf{u}, v) = \left( \begin{pmatrix} 16 \\ 3 \end{pmatrix}, 1 \right)$ إلى بوب.&lt;/p>
&lt;p>&lt;strong>【3. مرحلة فك التشفير】&lt;/strong>
يقوم بوب، الذي استلم النص المشفر، بفك التشفير باستخدام المفتاح السري $\mathbf{s} = (3, 4)^T$.
معادلة فك التشفير: يحسب $D = v - \mathbf{s}^T \mathbf{u} \pmod{17}$.&lt;/p>
$$ \mathbf{s}^T \mathbf{u} = (3, 4) \begin{pmatrix} 16 \\ 3 \end{pmatrix} = 3 \times 16 + 4 \times 3 = 48 + 12 = 60 \equiv 9 \pmod{17} $$
$$ D = v - \mathbf{s}^T \mathbf{u} = 1 - 9 = -8 \pmod{17} $$
&lt;p>هنا، في عالم المعيار 17، $-8$ تساوي $9$ (لأن $-8 + 17 = 9$).
يحدد بوب ما إذا كانت القيمة الناتجة $D = 9$ أقرب إلى $0$ أو $8$ ($\lfloor 17/2 \rfloor$).
نظراً لأن $9$ هي بالتأكيد أقرب إلى $8$ من $0$، فقد تمكن بوب من استعادة $M = 1$ بنجاح!&lt;/p>
&lt;p>لماذا أصبحت $9$؟ لنتذكر الإثبات السابق.
جزء الخطأ هو $\mathbf{e}^T \mathbf{r} = (1, -1, 0, 2) (1, 0, 1, 0)^T = 1 \times 1 + 0 \times 1 = 1$.
لذلك، فإن نتيجة الحساب هي $\mathbf{e}^T \mathbf{r} + M \cdot 8 = 1 + 8 = 9$، وتم تأكيد حساب القيمة كما هو متوقع نظرياً.&lt;/p>
&lt;h1 id="7-التطور-نحو-التطبيق-العملي-ring-lwe-و-module-lwe">7. التطور نحو التطبيق العملي: Ring-LWE و Module-LWE
&lt;/h1>&lt;p>في حين أن مسألة LWE القياسية (Standard LWE) التي تم شرحها حتى الآن تحتوي على إثبات أمان قوي للغاية، إلا أن لها عيوباً قاتلة في التطبيق العملي. هذه العيوب هي &amp;ldquo;حجم المفتاح يصبح ضخماً&amp;rdquo; و &amp;ldquo;تكلفة الحساب عالية&amp;rdquo;.&lt;/p>
&lt;p>في LWE القياسية، يتضمن المفتاح العام مصفوفة ضخمة $A \in \mathbb{Z}_q^{m \times n}$. عندما تصل المعلمة $n$ إلى المئات أو الآلاف، يصل حجم هذه المصفوفة إلى عدة ميغابايت، مما يجعلها ثقيلة جداً بحيث لا يمكن إرسالها واستقبالها في كل مرة على بروتوكولات الاتصال عبر الإنترنت (مثل TLS). بالإضافة إلى ذلك، يتطلب ضرب المصفوفات والمتجهات تعقيداً حسابياً قدره $\mathcal{O}(n^2)$.&lt;/p>
&lt;p>لحل هذه المشكلة، تم تقديم &amp;ldquo;Ring-LWE (RLWE)&amp;rdquo; و &amp;ldquo;Module-LWE (MLWE)&amp;quot;، والتي تدمج بنية جبرية تسمى حلقات متعددات الحدود (Polynomial rings) في الشبكة.&lt;/p>
&lt;h2 id="71-حدس-ring-lwe">7.1 حدس Ring-LWE
&lt;/h2>&lt;p>في Ring-LWE، يتم استبدال المتجهات والمصفوفات بعناصر (متعددات حدود) في حلقة متعددة الحدود $\mathcal{R}_q = \mathbb{Z}_q[X]/(X^n + 1)$. (حيث يتم اختيار $n$ كقوة للعدد 2).&lt;/p>
&lt;p>في حين كان المفتاح العام في LWE القياسية هو المصفوفة $A$، فإن Ring-LWE يستخدم متعددة حدود واحدة $a(x)$. كما يصبح المفتاح السري $s(x)$ والخطأ $e(x)$ أيضاً متعددات حدود.
تصبح المعادلة كما يلي:
&lt;/p>
$$ b(x) = a(x) \cdot s(x) + e(x) \pmod q $$
&lt;p>نظراً لأن هذا ضرب متعددات الحدود، باستخدام &amp;ldquo;تحويل العدد النظري&amp;rdquo; (Number Theoretic Transform: NTT) المشابه لتحويل فورييه السريع (FFT)، يمكن تقليل التعقيد الحسابي بشكل كبير إلى $\mathcal{O}(n \log n)$. علاوة على ذلك، نظراً لأن حجم المفتاح العام يتضاءل من مصفوفة إلى متعددة حدود مفردة، يتم تقليل حجم البيانات إلى $\mathcal{O}(n)$. يوفر هذا ميزة ساحقة في النطاق الترددي للاتصالات.&lt;/p>
&lt;p>من الناحية الرياضية، لا تنتمي Ring-LWE إلى شبكة عامة، بل يتم إرجاعها إلى مسألة على شبكة ذات تماثل خاص تسمى &amp;ldquo;الشبكة المثالية&amp;rdquo; (Ideal Lattice).&lt;/p>
&lt;h2 id="72-module-lwe-ومعايير-nist-kyber--ml-kem">7.2 Module-LWE ومعايير NIST (Kyber / ML-KEM)
&lt;/h2>&lt;p>في حين أن Ring-LWE فعالة، كان هناك قلق بسيط من أن البنية الجبرية الخاصة للشبكة المثالية قد تصبح نقطة انطلاق لهجمات مستقبلية. لذلك، فإن &amp;ldquo;Module-LWE (MLWE)&amp;rdquo; هو الذي أخذ &amp;ldquo;أفضل ما في العالمين&amp;rdquo;: الأمان المحافظ لـ LWE القياسية وكفاءة Ring-LWE.&lt;/p>
&lt;p>في Module-LWE، نأخذ في الاعتبار مصفوفات ومتجهات صغيرة حيث تكون عناصرها متعددات حدود. بعبارة أخرى، نتعامل مع وحدات (Modules) فوق حلقات.
حالياً، تعتمد &amp;ldquo;CRYSTALS-Kyber&amp;rdquo; (الاسم الموحد: ML-KEM)، التي اختارها NIST كمعيار لخوارزمية تبادل المفاتيح (KEM) لـ PQC، بالضبط على صعوبة مسألة Module-LWE هذه.&lt;/p>
&lt;h1 id="8-لماذا-يعتبر-آمنا-ضد-أجهزة-الكمبيوتر-الكمومية">8. لماذا يعتبر آمناً ضد أجهزة الكمبيوتر الكمومية؟
&lt;/h1>&lt;p>أخيراً، سنتطرق إلى النقطة الأساسية: &amp;ldquo;لماذا يُعتقد أن التشفير القائم على الشبكة لا يمكن فك تشفيره حتى باستخدام جهاز كمبيوتر كمومي؟&amp;rdquo;.&lt;/p>
&lt;p>إن خوارزمية شور، التي يستخدمها الكمبيوتر الكمومي لكسر تشفير RSA وتشفير المنحنى الإهليلجي، هي في جوهرها خوارزمية تحل &amp;ldquo;مسألة المجموعة الفرعية المخفية&amp;rdquo; (Hidden Subgroup Problem: HSP). تتمتع البنية الرياضية (المجموعات الأبيلية المحدودة - Finite abelian groups) وراء RSA و ECC بدورية (Periodicity)، ومن خلال استخدام عملية كمومية خاصة تسمى تحويل فورييه الكمومي (QFT)، يمكن استخراج هذه الفترة (المجموعة الفرعية المخفية) دفعة واحدة.&lt;/p>
&lt;p>ومع ذلك، فإن مسائل الشبكة تختلف بشكل أساسي. في حين أن للشبكات أيضاً دورية، فإن المطلوب في SVP و CVP هو خصائص هندسية غير خطية مثل &amp;ldquo;أقصر مسافة&amp;rdquo; و &amp;ldquo;إزالة الضوضاء&amp;rdquo;. حتى لو تم تطبيق &amp;ldquo;تحويل فورييه الكمومي على مجموعة أبيلية&amp;rdquo; كما هو الحال في خوارزمية شور مباشرة، لا يمكن استخراج المعلومات المفيدة التي يمكن أن تشكل حلاً لمسألة الشبكة بكفاءة. حتى يومنا هذا، لم يتم اكتشاف أي خوارزمية كمومية يمكنها حل SVP أو LWE في وقت كثير الحدود، ويُعتقد على نطاق واسع أنه حتى مع قوة الحوسبة المتوازية لأجهزة الكمبيوتر الكمومية، فإن الاستكشاف الذي يقترب من القوة الغاشمة (فقط تحسين الجذر التربيعي بواسطة خوارزمية غروفر - Grover&amp;rsquo;s algorithm) هو الطريقة الوحيدة الفعالة.&lt;/p>
&lt;h1 id="9-الخلاصة">9. الخلاصة
&lt;/h1>&lt;p>في هذا المقال، شرحنا بالتفصيل الحدس الرياضي للتشفير القائم على الشبكة، بدءاً من التعريف الهندسي للشبكة، وصياغة مسألة LWE، ووصولاً إلى بناء تشفير المفتاح العام.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>الشبكة (Lattice)&lt;/strong> هي فضاء منفصل يتم التعبير عنه بتركيبة خطية ذات معاملات صحيحة لمتجهات الأساس، وفي الأبعاد العالية، يصبح من الصعب العثور على &amp;ldquo;أساس جيد&amp;rdquo; قريب من التعامد (SVP).&lt;/li>
&lt;li>&lt;strong>مسألة LWE (التعلم مع الأخطاء)&lt;/strong> هي مسألة حل نظام من المعادلات الخطية المتزامنة مع الضوضاء، ونظراً لأن هذه المسألة مرتبطة بصعوبة أسوأ حالة لمسائل الشبكة، فإنها توفر أساساً قوياً للأمان.&lt;/li>
&lt;li>باستخدام مسألة LWE، يتم تحقيق التشفير وفك التشفير (&lt;strong>تشفير Regev&lt;/strong>) من خلال آلية بارعة لإضافة وإزالة الضوضاء عمداً.&lt;/li>
&lt;li>في البروتوكولات الحقيقية، لزيادة كفاءة الاتصال وسرعة الحساب، يتم اعتماد &lt;strong>Ring-LWE&lt;/strong> و &lt;strong>Module-LWE&lt;/strong> باستخدام حلقات متعددة الحدود، وهي تُشكل أساس &lt;strong>ML-KEM&lt;/strong> القياسي لـ NIST.&lt;/li>
&lt;/ol>
&lt;p>في خضم اقتراب نقلة نموذجية حسابية غير مسبوقة متمثلة في أجهزة الكمبيوتر الكمومية، من الرومانسي للغاية أن نرى &amp;ldquo;التشفير القائم على الشبكة&amp;rdquo;، الذي نشأ من أعماق الجبر الخطي الكلاسيكي ونظرية الأعداد، يتولى دور الأساس لأمن الإنترنت في المستقبل. الرياضيات التي تكمن وراء التشفير القائم على الشبكة ليست غامضة للغاية بأي حال من الأحوال، ومع المعرفة الأساسية بالجبر الخطي والاحتمالات، يمكن فهم بنيتها الجميلة بالكامل. نأمل أن يكون هذا المقال قد ساعدك على فهم التشفير القائم على الشبكة، الذي يشكل نواة PQC.&lt;/p></description></item><item><title>فرضية ريمان وتوزيع الأعداد الأولية: علاقة عميقة مع تقنيات التشفير الحديثة</title><link>http://kenji.blog/ar/p/riemann-hypothesis-prime-distribution-cryptography/</link><pubDate>Fri, 11 Sep 2026 16:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/riemann-hypothesis-prime-distribution-cryptography/</guid><description>&lt;img src="http://kenji.blog/p/riemann-hypothesis-prime-distribution-cryptography/img/eyecatch.jpg" alt="Featured image of post فرضية ريمان وتوزيع الأعداد الأولية: علاقة عميقة مع تقنيات التشفير الحديثة" />&lt;h1 id="1-مقدمة-غموض-الأعداد-الأولية-في-الكون-وفرضية-ريمان">1. مقدمة: غموض الأعداد الأولية في الكون وفرضية ريمان
&lt;/h1>&lt;p>&amp;ldquo;الأعداد الأولية (Prime Numbers)&amp;rdquo; هي الأعداد الطبيعية التي لا تقبل القسمة إلا على 1 وعلى نفسها، وتُعرف أيضاً بـ &amp;ldquo;ذرات&amp;rdquo; عالم الرياضيات. تبدو هذه السلسلة من الأعداد 2, 3, 5, 7, 11, 13&amp;hellip; عشوائية وبدون نظام واضح للوهلة الأولى. منذ أن أثبت عالم الرياضيات اليوناني القديم إقليدس أن &amp;ldquo;الأعداد الأولية لا نهائية&amp;rdquo;، حاول عدد لا يحصى من علماء الرياضيات كشف القواعد الخفية وراء تسلسل هذه الأعداد.&lt;/p>
&lt;p>أقرب محاولة لحل لغز الأعداد الأولية كانت &lt;strong>&amp;ldquo;فرضية ريمان (Riemann Hypothesis)&amp;rdquo;&lt;/strong> التي اقترحها عالم الرياضيات الألماني برنارد ريمان (Bernhard Riemann) في عام 1859. تعتبر فرضية ريمان واحدة من أهم المسائل المستعصية في الرياضيات الحديثة، وهي إحدى مسائل جائزة الألفية التي حددها معهد كلاي للرياضيات بجائزة قدرها مليون دولار.&lt;/p>
&lt;p>للوهلة الأولى، قد يبدو لغز التوزيع للأعداد الأولية في الرياضيات البحتة غير ذي صلة بحياتنا اليومية. ومع ذلك، فإن أمن الإنترنت الذي يدعم البنية التحتية للمجتمع الحديث، وخاصة &lt;strong>تقنيات التشفير الحديثة مثل تشفير RSA وتشفير المنحنيات الإهليلجية (ECC)&lt;/strong>، يعتمد بشدة على خصائص الأعداد الأولية الضخمة.&lt;/p>
&lt;p>في هذا المقال، سنقوم برحلة رياضية من توزيع الأعداد الأولية إلى مبرهنة الأعداد الأولية، ودالة زيتا لريمان، وصولاً إلى جوهر فرضية ريمان، وسنتعمق بالتفصيل في كيفية ارتباطها بتقنيات التشفير الحديثة، وماذا سيحدث للعالم إذا تم إثبات فرضية ريمان.&lt;/p>
&lt;hr>
&lt;h1 id="2-مبرهنة-الأعداد-الأولية-وتوزيع-الأعداد-الأولية-اكتشاف-غاوس">2. مبرهنة الأعداد الأولية وتوزيع الأعداد الأولية: اكتشاف غاوس
&lt;/h1>&lt;p>لفهم كيفية توزيع الأعداد الأولية، فكر علماء الرياضيات في &lt;strong>دالة عد الأعداد الأولية (Prime-counting function)&lt;/strong> $\pi(x)$ التي تعبر عن &amp;ldquo;عدد الأعداد الأولية الموجودة أقل من أو تساوي عدداً معيناً $x$&amp;rdquo;.&lt;/p>
&lt;p>على سبيل المثال:&lt;/p>
&lt;ul>
&lt;li>$\pi(10) = 4$ (2, 3, 5, 7)&lt;/li>
&lt;li>$\pi(100) = 25$&lt;/li>
&lt;li>$\pi(1000) = 168$&lt;/li>
&lt;/ul>
&lt;p>اكتشف عالم الرياضيات العبقري كارل فريدريش غاوس (Carl Friedrich Gauss) في سن الخامسة عشرة، بعد حساب جداول ضخمة للأعداد الأولية، أن تكرار ظهور الأعداد الأولية يتناقص بشكل يتناسب عكسياً مع اللوغاريتم الطبيعي $\ln x$. بمعنى آخر، توقع أن احتمال العثور على عدد أولي بالقرب من عدد معين $x$ هو حوالي $\frac{1}{\ln x}$.&lt;/p>
&lt;p>تم التعبير عن هذا باستخدام التكامل في &lt;strong>التكامل اللوغاريتمي (Logarithmic integral)&lt;/strong> $\text{Li}(x)$:&lt;/p>
$$ \text{Li}(x) = \int_{2}^{x} \frac{dt}{\ln t} $$
&lt;p>تم إثبات توقع غاوس لاحقاً وبشكل مستقل من قبل جاك هادامار وشارل جان دو لا فالي بوسان في عام 1896، وتأسست كـ &lt;strong>مبرهنة الأعداد الأولية (Prime Number Theorem, PNT)&lt;/strong>:&lt;/p>
$$ \lim_{x \to \infty} \frac{\pi(x)}{\text{Li}(x)} = 1 $$
&lt;p>أو يمكن التعبير عنها تقريبياً على النحو التالي:&lt;/p>
$$ \pi(x) \sim \frac{x}{\ln x} $$
&lt;p>بفضل هذه المبرهنة، أصبح من الواضح أن الأعداد الأولية، عند النظر إليها على نطاق واسع (ماكروسكوبي)، تمتلك توزيعاً سلساً للغاية ويمكن التنبؤ به. ومع ذلك، عند النظر إليها على نطاق ضيق (ميكروسكوبي)، هناك دائماً &amp;ldquo;خطأ&amp;rdquo; أو &amp;ldquo;تذبذب&amp;rdquo; بين $\pi(x)$ و $\text{Li}(x)$. الهوية الحقيقية لهذا التذبذب هي اللغز الأكبر الذي تحاول فرضية ريمان حله.&lt;/p>
&lt;hr>
&lt;h1 id="3-دالة-زيتا-لريمان-وحاصل-ضرب-أويلر">3. دالة زيتا لريمان وحاصل ضرب أويلر
&lt;/h1>&lt;p>أقوى سلاح في تحليل توزيع الأعداد الأولية هو &lt;strong>دالة زيتا لريمان (Riemann Zeta Function)&lt;/strong>. في الأصل، كانت متسلسلة لانهائية تم تعريفها من قبل ليونهارت أويلر (Leonhard Euler) للأعداد الحقيقية $s > 1$:&lt;/p>
$$ \zeta(s) = \sum_{n=1}^\infty \frac{1}{n^s} = 1 + \frac{1}{2^s} + \frac{1}{3^s} + \frac{1}{4^s} + \dots $$
&lt;p>أحد أعظم إنجازات أويلر هو إثباته أن هذه المتسلسلة اللانهائية يمكن التعبير عنها كحاصل ضرب لانهائي يشمل جميع الأعداد الأولية $p$. هذا هو &lt;strong>حاصل ضرب أويلر (Euler Product Formula)&lt;/strong>:&lt;/p>
$$ \zeta(s) = \prod_{p \text{ prime}} \frac{1}{1 - p^{-s}} = \left( \frac{1}{1 - 2^{-s}} \right) \left( \frac{1}{1 - 3^{-s}} \right) \left( \frac{1}{1 - 5^{-s}} \right) \dots $$
&lt;p>الفهم الحدسي لهذا الإثبات هو أنه إذا قمنا بنشر كل حد في الجانب الأيمن كمتسلسلة هندسية وضربناها معاً، فبفضل المبرهنة الأساسية في الحساب (كل عدد طبيعي يمكن التعبير عنه بشكل فريد كحاصل ضرب أعداد أولية)، يتم إعادة بناء مجموع مقلوبات الأعداد الطبيعية في الجانب الأيسر بالكامل.&lt;/p>
&lt;p>&lt;strong>هذه المعادلة الرياضية الواحدة أصبحت جسراً يربط بين التحليل الرياضي (المتسلسلات اللانهائية والدوال المستمرة) ونظرية الأعداد (الأعداد الأولية والأعداد المنفصلة).&lt;/strong> دراسة دالة زيتا مرادفة لدراسة توزيع الأعداد الأولية.&lt;/p>
&lt;hr>
&lt;h1 id="4-الامتداد-التحليلي-والتوسيع-إلى-المستوى-المركب">4. الامتداد التحليلي والتوسيع إلى المستوى المركب
&lt;/h1>&lt;p>تكمن عبقرية ريمان في أنه وسع المتغير $s$ في الدالة $\zeta(s)$، الذي كان أويلر يعتبره عدداً حقيقياً فقط، ليصبح &lt;strong>عدداً مركباً $s = \sigma + it$ ($\sigma$ هو الجزء الحقيقي و $t$ هو الجزء التخيلي)&lt;/strong>.&lt;/p>
&lt;p>المتسلسلة اللانهائية الأصلية تتقارب فقط عندما يكون $\sigma > 1$، ولكن باستخدام تقنية &amp;ldquo;الامتداد التحليلي (Analytic Continuation)&amp;quot;، وسع ريمان التعريف بحيث أصبح للدالة $\zeta(s)$ معنى في كل المستوى المركب باستثناء القطب عند $s = 1$.&lt;/p>
&lt;p>وعلاوة على ذلك، استنتج معادلة دالية (Functional equation) جميلة تحققها دالة زيتا:&lt;/p>
$$ \zeta(s) = 2^s \pi^{s-1} \sin\left(\frac{\pi s}{2}\right) \Gamma(1-s) \zeta(1-s) $$
&lt;p>حيث $\Gamma(x)$ هي دالة غاما. من خلال هذه المعادلة، يمكننا معرفة خصائص النصف الأيسر من المستوى بناءً على خصائص النصف الأيمن.&lt;/p>
&lt;h3 id="الأصفار-zeros-of-the-zeta-function">الأصفار (Zeros of the Zeta Function)
&lt;/h3>&lt;p>تُسمى الأعداد المركبة $s$ التي تجعل قيمة دالة زيتا تساوي 0 بـ &amp;ldquo;الأصفار&amp;rdquo;.
من المعادلة الدالية، عندما يكون $s$ عدداً زوجياً سالباً ($-2, -4, -6, \dots$)، تصبح $\sin(\pi s / 2)$ صفراً، وبالتالي تكون $\zeta(s) = 0$. وتُعرف هذه بـ &lt;strong>الأصفار البديهية (Trivial zeros)&lt;/strong>.&lt;/p>
&lt;p>ومع ذلك، ما يهم في توزيع الأعداد الأولية هي الأصفار الأخرى، وتحديداً &lt;strong>الأصفار غير البديهية (Non-trivial zeros)&lt;/strong> التي تقع في &amp;ldquo;الشريط الحرج (Critical strip)&amp;rdquo; حيث $0 \le \sigma \le 1$.&lt;/p>
&lt;hr>
&lt;h1 id="5-جوهر-فرضية-ريمان-والصيغة-الصريحة">5. جوهر فرضية ريمان والصيغة الصريحة
&lt;/h1>&lt;p>حسب ريمان عدداً قليلاً من الأصفار وطرح فرضية مذهلة. هذه هي &lt;strong>فرضية ريمان&lt;/strong>.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>فرضية ريمان (Riemann Hypothesis)&lt;/strong>
جميع الأصفار غير البديهية لدالة زيتا لريمان $\zeta(s)$ تقع على خط مستقيم جزؤه الحقيقي يساوي $1/2$ (أي $\text{Re}(s) = 1/2$).&lt;/p>
&lt;/blockquote>
&lt;p>يسمى هذا الخط الذي يكون فيه الجزء الحقيقي 1/2 بـ &amp;ldquo;الخط الحرج (Critical line)&amp;rdquo;.&lt;/p>
&lt;div class="mermaid">graph TD
A["دالة زيتا لريمان ζ(s)"] --> B["التوسيع إلى المستوى المركب بواسطة الامتداد التحليلي"]
B --> C["الأصفار البديهية (s = -2, -4, -6 ...)"]
B --> D["الأصفار غير البديهية (0 &lt;= Re(s) &lt;= 1)"]
D --> E["فرضية ريمان"]
E --> F["جميع الأصفار غير البديهية تقع على Re(s) = 1/2"]
F --> G["تؤدي إلى إثبات نهاية مصطلح الخطأ في توزيع الأعداد الأولية"]&lt;/div>
&lt;p>لماذا تعتبر فرضية ريمان على هذا القدر من الأهمية؟ لأن أصفار دالة زيتا تحدد &lt;strong>بالكامل&lt;/strong> توزيع الأعداد الأولية.&lt;/p>
&lt;p>استنتج ريمان ولاحقاً عالم الرياضيات فون مانجولدت &amp;ldquo;الصيغة الصريحة (Explicit formula)&amp;rdquo; التي تصف توزيع الأعداد الأولية بدقة. باستخدام دالة تشيبيشيف $\psi(x)$، يمكن التعبير عنها كما يلي:&lt;/p>
$$ \psi(x) = x - \sum_{\rho} \frac{x^\rho}{\rho} - \ln(2\pi) - \frac{1}{2}\ln(1 - x^{-2}) $$
&lt;p>حيث $\rho$ يمثل المجموع عبر جميع الأصفار غير البديهية لدالة زيتا.
المصطلح الرئيسي هو $x$ (والذي يتوافق مع مبرهنة الأعداد الأولية)، ومن خلال إضافة أو طرح المصطلحات الشبيهة بالتموجات التي تعتمد على الأصفار $\rho$، يتم إعادة بناء التوزيع الدقيق المتدرج للأعداد الأولية. يمكن القول إن الأصفار غير البديهية تمثل &amp;ldquo;ترددات (موجات)&amp;rdquo; توزيع الأعداد الأولية.&lt;/p>
&lt;p>إذا كانت فرضية ريمان صحيحة، وكان الجزء الحقيقي لجميع الأصفار غير البديهية $\rho$ هو بالضبط $1/2$، فإن مصطلح الخطأ في مبرهنة الأعداد الأولية سيندرج ضمن أصغر نطاق يمكن تصوره نظرياً.&lt;/p>
$$ |\pi(x) - \text{Li}(x)| \le \frac{1}{8\pi} \sqrt{x} \ln x \quad \text{for} \quad x \ge 2657 $$
&lt;p>بعبارة أخرى، &lt;strong>إذا كانت فرضية ريمان صحيحة، فسيثبت ذلك أن الأعداد الأولية موزعة بأكثر الطرق &amp;ldquo;انتظاماً وجمالاً&amp;rdquo; التي يمكننا تخيلها&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h1 id="6-العلاقة-التي-لا-تنفصل-بين-تقنيات-التشفير-الحديثة-والأعداد-الأولية">6. العلاقة التي لا تنفصل بين تقنيات التشفير الحديثة والأعداد الأولية
&lt;/h1>&lt;p>حتى هذه النقطة كنا في عالم الرياضيات البحتة العميق، ولكن هذه الخصائص للأعداد الأولية تدعم من الأساس مجتمعنا الرقمي الحديث. والمثال الأبرز على ذلك هو تشفير المفتاح العام مثل &lt;strong>تشفير RSA&lt;/strong>.&lt;/p>
&lt;p>تعتمد أمان كافة الاتصالات مثل مدفوعات بطاقات الائتمان على الإنترنت، وإرسال كلمات المرور، والتوقيعات الإلكترونية لتقنية البلوك تشين على &amp;ldquo;الأعداد الأولية&amp;rdquo;.&lt;/p>
&lt;h3 id="كيفية-عمل-تشفير-rsa">كيفية عمل تشفير RSA
&lt;/h3>&lt;p>يعتمد أمان تشفير RSA على الحقيقة الرياضية القائلة بأن &amp;ldquo;تحليل رقم مركب كبير جداً إلى عوامله الأولية يمثل صعوبة بالغة&amp;rdquo; (مسألة التحليل إلى العوامل الأولية).&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>توليد المفاتيح&lt;/strong>:
يتم اختيار عددين أوليين ضخمين بشكل عشوائي $p$ و $q$ (مثلاً 2048 بت لكل منهما).
يتم ضربهما معاً لحساب $N = p \times q$. هذا الـ $N$ يصبح جزءاً من المفتاح العام.
باستخدام دالة مؤشر أويلر $\phi(N) = (p-1)(q-1)$، يتم توليد المفتاح الخاص $d$.&lt;/p>
$$ e \times d \equiv 1 \pmod{\phi(N)} $$
&lt;/li>
&lt;li>
&lt;p>&lt;strong>التشفير وفك التشفير&lt;/strong>:
يتم تحويل النص الواضح $M$ إلى نص مشفر $C$ باستخدام المفتاح العام $e, N$.
&lt;/p>
$$ C \equiv M^e \pmod{N} $$
&lt;p>
فقط من يمتلك المفتاح الخاص $d$ يمكنه فك التشفير.
&lt;/p>
$$ M \equiv C^d \pmod{N} $$
&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph LR
A["النص الواضح (Plaintext)"] --> B["التشفير بالمفتاح العام (e, N)"]
B --> C["النص المشفر (Ciphertext)"]
C --> D["فك التشفير بالمفتاح الخاص (d)"]
D --> E["النص الواضح الأصلي"]
F["المهاجم (Attacker)"] -- "محاولة تحليل N إلى عوامله الأولية" --> C
F -.-> G["بدون معرفة p و q، لا يمكن حساب d"]&lt;/div>
&lt;p>لكسر تشفير RSA، من الضروري إيجاد الأعداد الأولية الأصلية $p$ و $q$ (التحليل إلى عوامل) انطلاقاً من العدد الضخم $N$. حتى باستخدام الخوارزميات السائدة حالياً (مثل منخل حقل الأعداد العام: GNFS)، فإن تحليل عدد يتكون من مئات الأرقام قد يستغرق وقتاً يتجاوز بكثير عمر الكون، حتى باستخدام أجهزة الكمبيوتر الفائقة.&lt;/p>
&lt;hr>
&lt;h1 id="7-تأثير-فرضية-ريمان-على-تقنيات-التشفير">7. تأثير فرضية ريمان على تقنيات التشفير
&lt;/h1>&lt;p>إذن، كيف تتقاطع &amp;ldquo;فرضية ريمان&amp;rdquo; الموجودة في قمة الرياضيات البحتة مع &amp;ldquo;تقنيات التشفير&amp;rdquo;؟&lt;/p>
&lt;h3 id="71-خوارزميات-توليد-الأعداد-الأولية-اختبار-الأولية-وفرضية-ريمان-المعممة-grh">7.1. خوارزميات توليد الأعداد الأولية (اختبار الأولية) وفرضية ريمان المعممة (GRH)
&lt;/h3>&lt;p>لتشغيل تشفير RSA، يجب أولاً توليد أعداد أولية ضخمة $p$ و $q$. ومع ذلك، فإن التحديد السريع والمؤكد لـ &amp;ldquo;ما إذا كان عدد ما أولياً أم لا&amp;rdquo; ليس أمراً سهلاً.&lt;/p>
&lt;p>حالياً، تستخدم الخوارزمية الاحتمالية المعروفة بـ &lt;strong>اختبار ميلر-رابين لأولية عدد (Miller-Rabin primality test)&lt;/strong> بشكل عملي. هذه الخوارزمية سريعة جداً، ولكنها تحمل خطراً ضئيلاً جداً لحدوث &amp;ldquo;أعداد شبه أولية&amp;rdquo;، حيث يتم تحديد عدد مركب بشكل خاطئ على أنه عدد أولي.&lt;/p>
&lt;p>ومع ذلك، إذا افترضنا أن &lt;strong>&amp;ldquo;فرضية ريمان المعممة (Generalized Riemann Hypothesis, GRH)&amp;rdquo;&lt;/strong>، التي توسع فرضية ريمان إلى دوال L لدركليه، صحيحة، فإن القصة تتغير بشكل جذري.
إذا كانت GRH صحيحة، فإن الحد الأقصى لعدد الاختبارات في خوارزمية ميلر-رابين يصبح مضموناً رياضياً، وترتقي من خوارزمية احتمالية إلى &lt;strong>&amp;ldquo;خوارزمية حتمية ذات وقت كثير الحدود&amp;rdquo;&lt;/strong> (كانت هذه حقيقة مهمة معروفة قبل اكتشاف اختبار AKS للأولية).&lt;/p>
&lt;p>بمعنى آخر، تلعب فرضية ريمان (وتعميماتها) دوراً في إعطاء ضمانات مباشرة وقاطعة لتوليد الأعداد الأولية الضخمة بسرعة وموثوقية مطلقة، وهو ما يمثل الأساس لتوليد التشفير.&lt;/p>
&lt;h3 id="72-العلاقة-بخوارزميات-التحليل-إلى-العوامل">7.2. العلاقة بخوارزميات التحليل إلى العوامل
&lt;/h3>&lt;p>تعتبر معرفة توزيع الأعداد الأولية أمراً حتمياً عند تقييم التعقيد الحسابي للخوارزميات المستخدمة لفك التشفير (مثل منخل حقل الأعداد العام). تعتمد العديد من خوارزميات التحليل إلى عوامل على توزيع &amp;ldquo;الأعداد السلسة (Smooth numbers: الأعداد التي تحتوي فقط على عوامل أولية صغيرة)&amp;rdquo;.&lt;/p>
&lt;p>لتقييم مدى تكرار ظهور الأعداد السلسة بدقة، يلزم وجود فهم عميق لتوزيع الأعداد الأولية، وهنا أيضاً يتم استخدام تقنيات نظرية الأعداد التحليلية المرتبطة مباشرة بدالة زيتا وفرضية ريمان. إذا تم إثبات فرضية ريمان وتم تحديد خطأ توزيع الأعداد الأولية بالكامل، فسيصبح من الممكن تحديد حدود الأداء لخوارزميات التحليل إلى عوامل بشكل أكثر دقة.&lt;/p>
&lt;hr>
&lt;h1 id="8-إذا-تم-إثبات-فرضية-ريمان-هل-سيتم-كسر-التشفير">8. إذا تم إثبات فرضية ريمان، هل سيتم كسر التشفير؟
&lt;/h1>&lt;p>غالباً ما يُقال كنوع من الأساطير الحضرية: &amp;ldquo;إذا حُلت فرضية ريمان، سينهار تشفير RSA في لحظة&amp;rdquo;، ولكن &lt;strong>هذا غير دقيق رياضياً&lt;/strong>.&lt;/p>
&lt;p>إثبات فرضية ريمان بحد ذاته لا يخلق فوراً خوارزمية سحرية تسرع بشكل كبير من التحليل إلى عوامل أولية. فرضية ريمان هي مجرد نظرية حول &amp;ldquo;الانتظام الماكروسكوبي لتوزيع&amp;rdquo; الأعداد الأولية، ولا تخبرنا مباشرة (كخاصية محلية) عن الأعداد الأولية التي تقسم عدداً معيناً $N$.&lt;/p>
&lt;p>ومع ذلك، فإن التأثير ليس صفراً.
لأنه في عملية إثبات فرضية ريمان، هناك احتمال كبير جداً لاكتشاف &lt;strong>&amp;ldquo;أدوات رياضية جديدة&amp;rdquo; أو &amp;ldquo;أساليب تحليل غير معروفة&amp;rdquo;&lt;/strong>. بالنظر إلى التاريخ، عندما تم إثبات مبرهنة فيرما الأخيرة أو حدسية بوانكاريه، فإن النظريات الجديدة التي طُورت خلال تلك العملية دفعت الرياضيات بأكملها إلى قفزات هائلة.&lt;/p>
&lt;p>إذا تم تأسيس طرق هندسية جبرية غير معروفة أو أساليب هندسية غير تبادلية قادرة على التحكم الكامل في خصائص أصفار دالة زيتا لريمان، فلا يمكن إنكار احتمال أن يؤدي ذلك كنتيجة إلى اكتشاف خوارزميات ثورية للتحليل إلى العوامل (على سبيل المثال، خوارزمية كلاسيكية تقلل وقت الحساب إلى وقت كثير الحدود). بهذا المعنى، لا يمكن لعلماء التشفير أن يغضوا الطرف أبداً عن تطورات فرضية ريمان.&lt;/p>
&lt;h3 id="الحواسيب-الكمومية-وخوارزمية-شور">الحواسيب الكمومية وخوارزمية شور
&lt;/h3>&lt;p>التهديد الأكثر مباشرة وواقعية لتقنيات التشفير ليس إثبات فرضية ريمان، بل &lt;strong>الحواسيب الكمومية&lt;/strong>. &amp;ldquo;خوارزمية شور&amp;rdquo; التي نشرها بيتر شور (Peter Shor) في عام 1994، أثبتت أنه بوجود حاسوب كمي ذو أداء كافٍ، يمكن حل التحليل إلى العوامل في وقت كثير الحدود. هذا يعني أن تشفير RSA وتشفير المنحنيات الإهليلجية سيتم كسرهما بشكل جذري.&lt;/p>
&lt;p>حالياً، يجري التحول عالمياً نحو &amp;ldquo;تشفير ما بعد الكوانتم (Post-Quantum Cryptography, PQC)&amp;rdquo; الذي لا يمكن فك تشفيره حتى بواسطة الحواسيب الكمومية (مثل التشفير القائم على الشبكات). ربما يقترب العصر الذهبي لتقنيات التشفير المعتمدة على الأعداد الأولية من نهايته بطريقة ما، لكن القيمة الرياضية للأعداد الأولية بحد ذاتها لن تضيع أبداً.&lt;/p>
&lt;hr>
&lt;h1 id="9-الخاتمة-تقاطع-التجريد-الرياضي-مع-المجتمع-الواقعي">9. الخاتمة: تقاطع التجريد الرياضي مع المجتمع الواقعي
&lt;/h1>&lt;div class="mermaid">graph TD
A["استكشاف الرياضيات البحتة"] --> B["توضيح فرضية ريمان"]
B --> C["فهم كامل لتوزيع الأعداد الأولية"]
C --> D["تطور هائل في نظرية الأعداد والهندسة الجبرية"]
D -.-> E["إمكانية خوارزميات جديدة للتحليل إلى العوامل"]
E -.-> F["تحديث تقييم أمان تقنيات التشفير"]
A --> G["الرياضيات التطبيقية وعلوم الكمبيوتر"]
G --> H["تحسين كفاءة اختبار الأولية وتوليد التشفير"]
H --> F&lt;/div>
&lt;p>الاستكشاف اللانهائي للأعداد الأولية، والذي استمر منذ اليونان القديمة، ارتقى بفضل العبقري ريمان ليصبح سيمفونية جميلة على المستوى المركب (أصفار دالة زيتا). ومن المثير للدهشة أن هذه البلورة الرياضية النقية، بعد مرور قرون، تُستخدم كأقوى درع لضمان أمن مجتمع الإنترنت.&lt;/p>
&lt;p>فرضية ريمان هي رمز يجسد في وقت واحد &amp;ldquo;الجمال التجريدي&amp;rdquo; للرياضيات و &amp;ldquo;القدرة المذهلة على التطبيق في العالم المادي والمجتمع الواقعي&amp;rdquo;.&lt;/p>
&lt;p>عندما يتم قهر هذا الجبل الرياضي الضخم الذي لم يصل إلى قمته أحد بعد، سنفهم تماماً الحقيقة الكونية المتمثلة في الأعداد الأولية، وسنمتلك منظوراً جديداً لبنية مجتمع المعلومات. إن دراسة تقنيات التشفير هي، في حد ذاتها، رحلة لتتبع تاريخ حكمة البشرية.&lt;/p></description></item><item><title>【شرح رياضيات】شرح آلية عمل تشفير RSA بطريقة يفهمها حتى طلاب الثانوية</title><link>http://kenji.blog/ar/p/rsa-encryption-math-explained-for-beginners/</link><pubDate>Fri, 11 Sep 2026 13:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/rsa-encryption-math-explained-for-beginners/</guid><description>&lt;img src="http://kenji.blog/p/rsa-encryption-math-explained-for-beginners/img/eyecatch.jpg" alt="Featured image of post 【شرح رياضيات】شرح آلية عمل تشفير RSA بطريقة يفهمها حتى طلاب الثانوية" />&lt;p>إحدى التقنيات التي تدعم أمن مجتمع الإنترنت من جذوره هي &amp;ldquo;تشفير RSA&amp;rdquo;. العديد من الاتصالات التي نستخدمها يوميًا دون تفكير، مثل مدفوعات بطاقات الائتمان في التسوق عبر الإنترنت، والتواصل مع الأصدقاء على شبكات التواصل الاجتماعي، وإرسال واستقبال المعلومات السرية للشركات، محمية بواسطة تشفير RSA أو التقنيات التي خلفته.&lt;/p>
&lt;p>ولكن عندما تسمع كلمة &amp;ldquo;تشفير&amp;rdquo;، قد تتخيل آلات تشفير معقدة كتلك التي تظهر في أفلام الجواسيس، أو رياضيات متقدمة للغاية لا يفهمها سوى بعض العباقرة. صحيح أن نظرية التشفير الحديثة تعتمد على رياضيات متقدمة، إلا أن &lt;strong>الآلية الأساسية لتشفير RSA يمكن فهمها تمامًا إذا كان لديك معرفة برياضيات المرحلة الثانوية (خصائص الأعداد الصحيحة، الأعداد الأولية، التطابق وغيرها)&lt;/strong>.&lt;/p>
&lt;p>في هذا المقال، ومن منطلق المعرفة برياضيات المرحلة الثانوية، سنشرح خطوة بخطوة وبشكل شامل المبادئ الرياضية التي يعمل بها تشفير RSA، ولماذا يصعب فك تشفيره. سنشرح بعناية مع استخدام أمثلة ملموسة حتى يتمكن حتى من يجدون صعوبة قليلة في الرياضيات من الفهم.&lt;/p>
&lt;hr>
&lt;h2 id="1-التشفير-بالمفتاح-المتماثل-والتشفير-بالمفتاح-المعلن">1. التشفير بالمفتاح المتماثل والتشفير بالمفتاح المعلن
&lt;/h2>&lt;p>قبل الخوض في الآلية الرياضية لتشفير RSA، دعونا أولاً ننظم الفكرة الأساسية للتشفير. تنقسم طرق التشفير بشكل عام إلى نوعين: &amp;ldquo;التشفير بالمفتاح المتماثل (المشترك)&amp;rdquo; و&amp;quot;التشفير بالمفتاح المعلن (العام)&amp;quot;.&lt;/p>
&lt;h3 id="11-حدود-طريقة-التشفير-بالمفتاح-المتماثل">1.1 حدود طريقة التشفير بالمفتاح المتماثل
&lt;/h3>&lt;p>العديد من الشفرات المستخدمة منذ القدم تسمى &amp;ldquo;طريقة التشفير بالمفتاح المتماثل&amp;rdquo;. وهي طريقة &lt;strong>تستخدم نفس المفتاح في &amp;ldquo;التشفير (تحويل الرسالة إلى نص مشفر سري)&amp;rdquo; و&amp;quot;فك التشفير (إعادة النص المشفر إلى الرسالة الأصلية)&amp;quot;&lt;/strong>.&lt;/p>
&lt;p>على سبيل المثال، لنفترض أن أليس تريد إرسال رسالة سرية إلى بوب. تضع أليس الرسالة في صندوق وتغلقه باستخدام قفل (مفتاح متماثل). لكي يفتح بوب ذلك الصندوق، يحتاج إلى امتلاك نفس المفتاح الذي استخدمته أليس.&lt;/p>
&lt;p>هذه الطريقة بها مشكلة كبيرة، وهي &amp;ldquo;مشكلة توزيع المفاتيح&amp;rdquo;. عندما تتواصل أليس وبوب، اللذان تفصل بينهما مسافة كبيرة، لأول مرة، كيف يمكنهما مشاركة المفتاح دون أن يتم التنصت عليهما؟ إذا سُرق المفتاح من قبل طرف ثالث أثناء إرساله بالبريد، فإن جميع الاتصالات المشفرة اللاحقة ستكون مكشوفة تمامًا.&lt;/p>
&lt;h3 id="12-الاختراع-الثوري-طريقة-التشفير-بالمفتاح-المعلن">1.2 الاختراع الثوري &amp;ldquo;طريقة التشفير بالمفتاح المعلن&amp;rdquo;
&lt;/h3>&lt;p>تم ابتكار &amp;ldquo;طريقة التشفير بالمفتاح المعلن&amp;rdquo; لحل مشكلة توزيع المفاتيح هذه. وتشفير RSA هو نوع من هذا التشفير.&lt;/p>
&lt;p>في طريقة التشفير بالمفتاح المعلن، يتم استخدام &lt;strong>مفتاحين مختلفين: &amp;ldquo;مفتاح للتشفير (المفتاح المعلن/العام)&amp;rdquo; و&amp;quot;مفتاح لفك التشفير (المفتاح السري/الخاص)&amp;quot;&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>يقوم المتلقي بوب بإنشاء زوج من &amp;ldquo;المفتاح المعلن&amp;rdquo; و&amp;quot;المفتاح السري&amp;quot;.&lt;/li>
&lt;li>ينشر بوب &amp;ldquo;المفتاح المعلن&amp;rdquo; للعالم أجمع (لا يهم من يحصل عليه).&lt;/li>
&lt;li>تستخدم المرسلة أليس &amp;ldquo;المفتاح المعلن&amp;rdquo; الخاص ببوب لتشفير رسالتها وإرسالها.&lt;/li>
&lt;li>لا يمكن فك تشفير الرسالة المشفرة إلا بواسطة &amp;ldquo;المفتاح السري&amp;rdquo; الذي يمتلكه بوب فقط.&lt;/li>
&lt;/ol>
&lt;p>إذا شبهنا ذلك بالقفل، فإن بوب يصنع الكثير من &amp;ldquo;الأقفال المفتوحة (المفاتيح المعلنة)&amp;rdquo; وينثرها في جميع أنحاء العالم. تضع أليس رسالتها الموجهة لبوب في صندوق وتغلقه باستخدام أحد أقفال بوب التي وجدتها. بمجرد إغلاق القفل، لا يمكن فتحه إلا باستخدام &amp;ldquo;المفتاح الرئيسي (المفتاح السري)&amp;rdquo; الذي يمتلكه بوب. حتى لو سرق شخص ما الصندوق في الطريق، فلا يمكنه فتحه لأنه لا يمتلك المفتاح الرئيسي.&lt;/p>
&lt;div class="mermaid">graph TD
A["أليس (المرسلة)"] --> B["نص صريح (رسالة)"]
B --> C["عملية التشفير"]
D["مفتاح بوب المعلن (متاح للجميع)"] --> C
C --> E["إرسال عبر الإنترنت: نص مشفر"]
E --> F["عملية فك التشفير"]
G["مفتاح بوب السري (يمتلكه بوب فقط)"] --> F
F --> H["النص الصريح المسترجع (الرسالة)"]
H --> I["بوب (المتلقي)"]&lt;/div>
&lt;p>لتحقيق هذا النظام الثوري، نحتاج إلى نوع من &lt;strong>&amp;ldquo;الدوال أحادية الاتجاه (لغز رياضي في اتجاه واحد)&amp;rdquo;&lt;/strong>، حيث &amp;ldquo;يمكن التشفير بسهولة باستخدام المفتاح المعلن، ولكن من المستحيل مطلقًا فك التشفير بدون المفتاح السري&amp;rdquo;. القطعة التي تم التركيز عليها لحل هذا اللغز هي &amp;ldquo;الأعداد الأولية&amp;rdquo; التي نعرفها جيدًا.&lt;/p>
&lt;hr>
&lt;h2 id="2-الأساس-الرياضي-الذي-يدعم-تشفير-rsa-1-الأعداد-الأولية-والتحليل-إلى-العوامل-الأولية">2. الأساس الرياضي الذي يدعم تشفير RSA 1: الأعداد الأولية والتحليل إلى العوامل الأولية
&lt;/h2>&lt;p>يعتمد أمان تشفير RSA على حقيقة رياضية مفادها أن &lt;strong>&amp;ldquo;تحليل الأعداد الضخمة إلى عواملها الأولية أمر صعب للغاية&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;h3 id="21-ما-هو-العدد-الأولي">2.1 ما هو العدد الأولي
&lt;/h3>&lt;p>العدد الأولي هو &amp;ldquo;عدد طبيعي أكبر من 1، لا يقبل القسمة إلا على 1 وعلى نفسه&amp;rdquo;.
مثال: $2, 3, 5, 7, 11, 13, 17, 19, 23...$&lt;/p>
&lt;p>الأعداد الأولية تشبه &amp;ldquo;الذرات&amp;rdquo; لجميع الأعداد الصحيحة. يمكن تحليل أي عدد طبيعي إلى شكل ضرب أعداد أولية. وهذا ما يسمى &lt;strong>التحليل إلى العوامل الأولية&lt;/strong>. على سبيل المثال، إمكانية التحليل إلى عوامل أولية بطريقة واحدة فقط (إذا تجاهلنا الترتيب) كما في $60 = 2^2 \times 3 \times 5$ تُعرف باسم &amp;ldquo;المبرهنة الأساسية في الحساب&amp;rdquo;.&lt;/p>
&lt;h3 id="22-صعوبة-التحليل-إلى-العوامل-الأولية-الدالة-أحادية-الاتجاه">2.2 صعوبة التحليل إلى العوامل الأولية (الدالة أحادية الاتجاه)
&lt;/h3>&lt;p>المهم هنا هو عدم التماثل حيث أن &lt;strong>&amp;ldquo;عملية الضرب سهلة، لكن التحليل إلى العوامل الأولية صعب&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>على سبيل المثال، حاول حساب حاصل ضرب العددين الأوليين التاليين ذهنيًا:
$11 \times 13 = ?$
هذا سهل، أليس كذلك؟ الجواب هو $143$.&lt;/p>
&lt;p>إذًا، ماذا عن العدد التالي؟
حلل العدد $323$ إلى عوامله الأولية.
ما رأيك؟ سيستغرق الأمر بعض الوقت. (الجواب هو $17 \times 19$).&lt;/p>
&lt;p>إذا كانت الأعداد صغيرة، فيمكن للإنسان حسابها بطريقة ما، ولكن عندما تصبح الأعداد كبيرة، يصبح الحساب صعبًا بشكل هائل حتى باستخدام أجهزة الكمبيوتر. في تشفير RSA السائد حاليًا، يتم استخدام عدد $N = p \times q$ ناتج عن ضرب عددين أوليين ضخمين بشكل لا يصدق $p$ و $q$ بحجم 2048 بت (حوالي 600 رقم بالنظام العشري).&lt;/p>
&lt;p>عند إعطاء عددين أوليين ضخمين $p$ و $q$، فإن حساب $N$ يستغرق جزءًا من الثانية بالنسبة للكمبيوتر (أقل من مللي ثانية). ولكن على العكس من ذلك، إذا تم إعطاء $N$ فقط لإيجاد $p$ و $q$ الأصليين، فسيستغرق الأمر وقتًا طويلاً لا يمكن لأسرع حاسوب عملاق حالي حله حتى لو استمر في العمل لترليونات السنين.&lt;/p>
&lt;p>هذا &lt;strong>&amp;ldquo;عدم التماثل في الحساب (طريق الذهاب سهل، وطريق العودة صعب)&amp;rdquo;&lt;/strong> هو الأساس الذي يخلق العلاقة بين المفتاح المعلن والمفتاح السري.&lt;/p>
&lt;hr>
&lt;h2 id="3-الأساس-الرياضي-الذي-يدعم-تشفير-rsa-2-التطابق-حساب-المقياس">3. الأساس الرياضي الذي يدعم تشفير RSA 2: التطابق (حساب المقياس)
&lt;/h2>&lt;p>لا تتم حسابات تشفير RSA بالجمع والضرب حيث تكبر الأعداد بشكل لا نهائي كما نستخدمها عادة، بل تتم في عالم &amp;ldquo;البواقي&amp;rdquo; بعد القسمة على عدد معين. وهذا ما يسمى &lt;strong>التطابق (حساب المقياس أو الحساب المعياري)&lt;/strong>.&lt;/p>
&lt;h3 id="31-رياضيات-الساعة">3.1 رياضيات الساعة
&lt;/h3>&lt;p>غالبًا ما يُشبه حساب المقياس بـ &amp;ldquo;رياضيات الساعة&amp;rdquo;. إذا كانت الساعة الآن 10، فكم ستكون الساعة بعد 5 ساعات؟ إنها $10 + 5 = 15$، ولكن في نظام الساعة المعتاد المكون من 12 ساعة، نجيب &amp;ldquo;الساعة 3&amp;rdquo;. هذا لأن باقي قسمة 15 على 12 هو 3.&lt;/p>
&lt;p>في عالم الرياضيات، يُكتب هذا على النحو التالي:
&lt;/p>
$$ 15 \equiv 3 \pmod{12} $$
&lt;p>
ويُقرأ: &amp;ldquo;15 و 3 متطابقان بمقياس 12 (باقي قسمتهما على 12 متساوٍ)&amp;rdquo;.&lt;/p>
&lt;h3 id="32-الخصائص-الأساسية-للتطابق">3.2 الخصائص الأساسية للتطابق
&lt;/h3>&lt;p>للتطابق خصائص مفيدة جدًا تشبه إلى حد كبير خصائص المعادلة ($=$). لنفترض أن المقياس (القاسم) هو $N$.
عندما يكون $a \equiv b \pmod N$ و $c \equiv d \pmod N$، يتحقق ما يلي:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>الجمع:&lt;/strong> $a + c \equiv b + d \pmod N$&lt;/li>
&lt;li>&lt;strong>الطرح:&lt;/strong> $a - c \equiv b - d \pmod N$&lt;/li>
&lt;li>&lt;strong>الضرب:&lt;/strong> $a \times c \equiv b \times d \pmod N$&lt;/li>
&lt;li>&lt;strong>الرفع لأس:&lt;/strong> $a^k \equiv b^k \pmod N$ (حيث $k$ عدد طبيعي)&lt;/li>
&lt;/ol>
&lt;p>الخاصية الأكثر أهمية هي &amp;ldquo;الرفع لأس&amp;rdquo;. هذا يعني أن &lt;strong>&amp;ldquo;أس الباقي يساوي باقي الأس&amp;rdquo;&lt;/strong>.
على سبيل المثال، لنفترض أننا نريد إيجاد باقي قسمة $7^{100}$ على $5$. سيكون من الصعب جدًا ضرب $7$ في نفسها 100 مرة ثم القسمة على $5$، ولكن باستخدام خصائص التطابق، نظرًا لأن $7 \equiv 2 \pmod 5$، فإن $7^{100} \equiv 2^{100} \pmod 5$، مما يبسط الحساب بشكل هائل. هذه الخاصية لا غنى عنها في عالم التشفير لأننا نتعامل مع أسس لأعداد كبيرة جدًا.&lt;/p>
&lt;hr>
&lt;h2 id="4-الأساس-الرياضي-الذي-يدعم-تشفير-rsa-3-مؤشر-أويلر-ومبرهنة-أويلر">4. الأساس الرياضي الذي يدعم تشفير RSA 3: مؤشر أويلر ومبرهنة أويلر
&lt;/h2>&lt;p>من هنا تبدأ الرياضيات السحرية التي تشكل جوهر تشفير RSA. ستظهر &amp;ldquo;مبرهنة أويلر&amp;rdquo;، وهي تعميم لـ &amp;ldquo;مبرهنة فيرما الصغرى&amp;rdquo;.&lt;/p>
&lt;h3 id="41-دالة-مؤشر-أويلر-دالة-توتنت-phin">4.1 دالة مؤشر أويلر (دالة توتنت) $\phi(N)$
&lt;/h3>&lt;p>دالة مؤشر أويلر (دالة $\phi$) هي دالة تعيد، بالنسبة لعدد طبيعي معين $N$، &lt;strong>&amp;ldquo;عدد الأعداد الطبيعية من 1 إلى $N$ التي تكون أولية نسبيًا مع $N$ (أي القاسم المشترك الأكبر بينهما هو 1)&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>دعونا نلقي نظرة على بعض الأمثلة:&lt;/p>
&lt;ul>
&lt;li>$\phi(5)$: من بين الأعداد 1, 2, 3, 4, 5، الأعداد الأولية نسبيًا مع 5 هي 1, 2, 3, 4 (عددها 4). إذن $\phi(5) = 4$.&lt;/li>
&lt;li>$\phi(6)$: من بين الأعداد 1, 2, 3, 4, 5, 6، الأعداد الأولية نسبيًا مع 6 هي 1, 5 (عددها 2). إذن $\phi(6) = 2$.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【خاصية مميزة في حالة العدد الأولي】&lt;/strong>
إذا كان $p$ عددًا أوليًا، فإن جميع الأعداد من 1 إلى $p-1$ تكون أولية نسبيًا مع $p$. وبالتالي:
&lt;/p>
$$ \phi(p) = p - 1 $$
&lt;p>&lt;strong>【خاصية مميزة في حالة حاصل ضرب عددين أوليين】&lt;/strong>
بالنسبة لعددين أوليين مختلفين $p$ و $q$، إذا كان $N = p \times q$، فيمكن حساب $\phi(N)$ بسهولة كالتالي:
&lt;/p>
$$ \phi(N) = \phi(p) \times \phi(q) = (p - 1)(q - 1) $$
&lt;p>
هذه الخاصية تعمل كـ &amp;ldquo;باب خلفي سري (Trapdoor)&amp;rdquo; لتشفير RSA. فالشخص الذي يعرف $p$ و $q$ (منشئ المفتاح) يمكنه حساب $\phi(N)$ في لحظة، لكن الطرف الثالث الذي يعرف $N$ فقط لا يمكنه حساب $\phi(N)$ ما لم يقم بتحليل $N$ إلى عوامله الأولية.&lt;/p>
&lt;h3 id="42-مبرهنة-أويلر">4.2 مبرهنة أويلر
&lt;/h3>&lt;p>أثبت ليونهارد أويلر هذه المبرهنة الجميلة باستخدام $\phi(N)$:&lt;/p>
&lt;p>&lt;strong>مبرهنة أويلر:&lt;/strong>
عندما يكون العددان الصحيحان $a$ و $N$ أوليين نسبيًا، يتحقق التطابق التالي:
&lt;/p>
$$ a^{\phi(N)} \equiv 1 \pmod N $$
&lt;p>هذه خاصية مذهلة تعني أن &amp;ldquo;حاصل ضرب أي عدد $a$ في نفسه $\phi(N)$ مرة ثم قسمته على $N$، سيعطي باقيًا يساوي $1$ دائمًا&amp;rdquo;. (إذا كان $N$ عددًا أوليًا $p$، فإنها تصبح $a^{p-1} \equiv 1 \pmod p$، وتُعرف باسم مبرهنة فيرما الصغرى).&lt;/p>
&lt;p>دعونا نعدل مبرهنة أويلر هذه. سنضرب كلا الطرفين في $a$ مرة أخرى:
&lt;/p>
$$ a^{\phi(N) + 1} \equiv a \pmod N $$
&lt;p>علاوة على ذلك، بالنسبة لأي عدد صحيح $k$، فإن $a^{k \cdot \phi(N)}$ سيكون أيضًا $1^k = 1$، وبالتالي تتحقق المعادلة التالية:
&lt;/p>
$$ a^{k \cdot \phi(N) + 1} \equiv a \pmod N $$
&lt;p>هذه المعادلة بالذات هي المبدأ الأساسي الذي يجعل سحر تشفير RSA &lt;strong>&amp;ldquo;العودة إلى الحالة الأصلية بعد التشفير وفك التشفير&amp;rdquo;&lt;/strong> ممكنًا.&lt;/p>
&lt;hr>
&lt;h2 id="5-خوارزمية-تشفير-rsa-خطوات-إنشاء-المفتاح-التشفير-وفك-التشفير">5. خوارزمية تشفير RSA: خطوات إنشاء المفتاح، التشفير، وفك التشفير
&lt;/h2>&lt;p>بعد أن اكتملت المعرفة الأساسية، دعونا أخيرًا نلقي نظرة على الخطوات المحددة لتشفير RSA. ينقسم تشفير RSA بشكل رئيسي إلى ثلاث مراحل: &amp;ldquo;1. إنشاء المفتاح&amp;rdquo;، &amp;ldquo;2. التشفير&amp;rdquo;، و&amp;quot;3. فك التشفير&amp;quot;.&lt;/p>
&lt;div class="mermaid">flowchart TD
A1["1. اختيار عددين أوليين p, q"] --> A2["حساب N = p × q"]
A1 --> A3["حساب φ(N) = (p-1)(q-1)"]
A3 --> A4["اختيار e بحيث يكون أوليًا نسبيًا مع φ(N)"]
A3 --> A5["حساب d بحيث يتحقق التطابق e × d ≡ 1 (mod φ(N))"]
A2 --> A6["المفتاح المعلن (N, e)"]
A4 --> A6
A5 --> A7["المفتاح السري d"]
B1["2. النص الصريح (رسالة) M"] --> B2["حساب C ≡ M^e (mod N)"]
A6 -.-> B2
B2 --> B3["إرسال النص المشفر C"]
B3 --> C1["3. النص المشفر المُستلَم C"]
C1 --> C2["حساب M ≡ C^d (mod N)"]
A7 -.-> C2
C2 --> C3["الحصول على النص الصريح الأصلي M"]&lt;/div>
&lt;h3 id="51-إنشاء-المفتاح-key-generation">5.1 إنشاء المفتاح (Key Generation)
&lt;/h3>&lt;p>يقوم المتلقي بوب بإنشاء &amp;ldquo;مفتاح معلن&amp;rdquo; و&amp;quot;مفتاح سري&amp;quot; خاص به.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>اختيار الأعداد الأولية:&lt;/strong> يختار عشوائيًا عددين أوليين كبيرين $p$ و $q$.&lt;/li>
&lt;li>&lt;strong>حساب المقياس $N$:&lt;/strong> يحسب $N = p \times q$. هذا الـ $N$ سيتم إعلانه للجميع.&lt;/li>
&lt;li>&lt;strong>حساب $\phi(N)$:&lt;/strong> يحسب دالة أويلر $\phi(N) = (p - 1)(q - 1)$. هذا هو رقم بوب السري.&lt;/li>
&lt;li>&lt;strong>اختيار المفتاح المعلن $e$:&lt;/strong> يختار عددًا صحيحًا $e$ بحيث $1 &lt; e &lt; \phi(N)$ ويكون أوليًا نسبيًا مع $\phi(N)$.&lt;/li>
&lt;li>&lt;strong>حساب المفتاح السري $d$:&lt;/strong> يجد عددًا صحيحًا $d$ يحقق الشرط التالي:
$$ e \times d \equiv 1 \pmod{\phi(N)} $$
وهذا يعني، &amp;ldquo;العدد $d$ الذي يجعل باقي قسمة $e \times d$ على $\phi(N)$ يساوي $1$&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;p>وبهذا تكتمل تجهيزات المفاتيح.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>المفتاح المعلن:&lt;/strong> الزوج $(N, e)$. يتم نشره للعالم أجمع.&lt;/li>
&lt;li>&lt;strong>المفتاح السري:&lt;/strong> $d$. لا يخبر به أحداً على الإطلاق.&lt;/li>
&lt;/ul>
&lt;h3 id="52-التشفير-encryption">5.2 التشفير (Encryption)
&lt;/h3>&lt;p>لنفترض أن أليس تريد إرسال رسالة سرية $M$ إلى بوب. ($M$ هي أحرف تم تحويلها إلى أرقام، بحيث يكون $0 \le M &lt; N$). تستخدم أليس المفتاح المعلن لبوب $(N, e)$ للحساب كما يلي:&lt;/p>
$$ C \equiv M^e \pmod N $$
&lt;p>تحسب &amp;ldquo;باقي قسمة رسالة $M$ مرفوعة للأس $e$ على $N$، وهو $C$&amp;rdquo;. هذا الـ $C$ هو النص المشفر.&lt;/p>
&lt;h3 id="53-فك-التشفير-decryption">5.3 فك التشفير (Decryption)
&lt;/h3>&lt;p>يتلقى بوب النص المشفر $C$. يستخدم بوب المفتاح السري $d$ للحساب كما يلي:&lt;/p>
$$ M \equiv C^d \pmod N $$
&lt;p>عندما يحسب &amp;ldquo;باقي قسمة النص المشفر $C$ مرفوع للأس $d$ على $N$&amp;quot;، فإنه بشكل مذهل يسترجع الرسالة الأصلية $M$!&lt;/p>
&lt;hr>
&lt;h2 id="6-لماذا-يعود-إلى-حالته-الأصلية-عند-فك-التشفير-إثبات-رياضي">6. لماذا يعود إلى حالته الأصلية عند فك التشفير؟ (إثبات رياضي)
&lt;/h2>&lt;p>قد تتساءل: &amp;ldquo;كيف يمكن مجرد رفع $C$ للأس $d$ أن يعيده إلى $M$ الأصلي؟&amp;rdquo;. هنا تأتي قوة &amp;ldquo;مبرهنة أويلر&amp;rdquo; التي ذكرناها سابقًا.&lt;/p>
&lt;p>دعونا نعوض معادلة التشفير $C = M^e$ في معادلة فك التشفير $C^d \pmod N$:
&lt;/p>
$$ C^d \equiv (M^e)^d \equiv M^{ed} \pmod N $$
&lt;p>هنا، تذكر الخطوة 5 من عملية إنشاء المفتاح. اختار بوب $d$ بحيث يكون $e \times d \equiv 1 \pmod{\phi(N)}$. هذا يعني أن &amp;ldquo;$ed$ هو من مضاعفات $\phi(N)$ مضافًا إليه $1$&amp;rdquo;. باستخدام عدد صحيح $k$، يمكن كتابتها على النحو التالي:
&lt;/p>
$$ ed = k \cdot \phi(N) + 1 $$
&lt;p>نعوض هذا في جزء الأس ونفككه باستخدام قوانين الأسس:
&lt;/p>
$$ M^{ed} = M^{k \cdot \phi(N) + 1} = M^{k \cdot \phi(N)} \times M^1 = (M^{\phi(N)})^k \times M $$
&lt;p>هنا، بافتراض أن الرسالة $M$ و $N$ أوليان نسبيًا، فإنه وفقًا لـ &lt;strong>مبرهنة أويلر&lt;/strong>، يكون $M^{\phi(N)} \equiv 1 \pmod N$.
&lt;/p>
$$ (M^{\phi(N)})^k \times M \equiv 1^k \times M \equiv M \pmod N $$
&lt;p>وبالتالي، تتحقق المعادلة التالية بنجاح تام:
&lt;/p>
$$ C^d \equiv M \pmod N $$
&lt;p>أليس لا تعرف $d$، والمتنصت أيضًا لا يعرف $d$، لذا فإن الوحيد الذي يمكنه استخراج $M$ من $C$ هو بوب الذي يمتلك $d$.&lt;/p>
&lt;hr>
&lt;h2 id="7-مثال-تطبيقي-دعونا-نجرب-تشفير-rsa-بالحساب-اليدوي-باستخدام-أعداد-أولية-صغيرة">7. مثال تطبيقي: دعونا نجرب تشفير RSA بالحساب اليدوي باستخدام أعداد أولية صغيرة
&lt;/h2>&lt;p>دعونا نقوم بتجربة تواصل مشفر من أليس إلى بوب باستخدام أرقام صغيرة (أعداد أولية) في الواقع.&lt;/p>
&lt;p>&lt;strong>【مرحلة إنشاء المفتاح لبوب】&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>يختار عددين أوليين $p=11$, $q=13$.&lt;/li>
&lt;li>يحسب $N = 11 \times 13 = 143$.&lt;/li>
&lt;li>يحسب $\phi(N) = (11 - 1) \times (13 - 1) = 10 \times 12 = 120$.&lt;/li>
&lt;li>يختار مفتاحًا معلنًا $e$ يكون أوليًا نسبيًا مع $\phi(N)=120$. لنختر هنا $e=7$.&lt;/li>
&lt;li>يجد المفتاح السري $d$. يبحث عن $d$ الذي يحقق $7 \times d \equiv 1 \pmod{120}$.
في المعادلة $7d = 120k + 1$، عندما يكون $k=6$ يصبح الناتج $721$، و $721 \div 7 = 103$.
وبالتالي، $d = 103$.&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>المفتاح المعلن: $(N=143, e=7)$&lt;/li>
&lt;li>المفتاح السري: $d=103$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【مرحلة التشفير لأليس】&lt;/strong>
لنفترض أنها تريد إرسال الرسالة $M = 9$.
المعادلة: $C \equiv 9^7 \pmod{143}$
$9^7 = 4,782,969$. بقسمة هذا العدد على 143 نحصل على $33447$ والباقي $48$.
أصبح النص المشفر $C = 48$.&lt;/p>
&lt;p>&lt;strong>【مرحلة فك التشفير لبوب】&lt;/strong>
يتلقى بوب النص المشفر $C = 48$، ويستخدم المفتاح السري $d = 103$ لفك التشفير.
المعادلة: $M \equiv 48^{103} \pmod{143}$
عند تنفيذ &lt;code>(48 ** 103) % 143&lt;/code> على الآلة الحاسبة، ستجد أن النتيجة بشكل رائع هي &amp;ldquo;&lt;strong>9&lt;/strong>&amp;rdquo;! لقد تمكن من استلام الرسالة الأصلية بنجاح.&lt;/p>
&lt;hr>
&lt;h2 id="8-كيفية-إيجاد-المفتاح-السري-d-خوارزمية-إقليدس-الممتدة">8. كيفية إيجاد المفتاح السري $d$: خوارزمية إقليدس الممتدة
&lt;/h2>&lt;p>في مثال الحساب اليدوي، اعتمدنا على التخمين للبحث عن $k$ وإيجاد $d=103$، لكن هذه الطريقة مستحيلة عندما تتكون الأعداد من مئات الأرقام. في البرامج الحقيقية، تُستخدم خوارزمية تسمى &lt;strong>&amp;ldquo;خوارزمية إقليدس الممتدة&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>حل التطابق $7d \equiv 1 \pmod{120}$ هو نفسه إيجاد الأعداد الصحيحة $d, y$ التي تحقق المعادلة $7d + 120y = 1$. من خلال الحساب العكسي لخوارزمية إقليدس، يمكن إيجاد ذلك ميكانيكيًا.&lt;/p>
&lt;ol>
&lt;li>$120 \div 7 = 17$ والباقي $1$&lt;/li>
&lt;li>بتعديل هذه المعادلة نحصل على: $1 = 120 - 17 \times 7$&lt;/li>
&lt;li>بمعنى آخر، $-17 \times 7 \equiv 1 \pmod{120}$&lt;/li>
&lt;/ol>
&lt;p>الرقم $-17$ يحمل نفس المعنى مثل $120 - 17 = 103$ في عالم المقياس $120$. وبالتالي، يمكن إيجاد $d = 103$ في لحظة. تتيح هذه الطريقة إجراء حسابات سريعة جدًا بغض النظر عن مدى ضخامة الأعداد.&lt;/p>
&lt;hr>
&lt;h2 id="9-الوجه-الآخر-لتشفير-rsa-التوقيع-الرقمي">9. الوجه الآخر لتشفير RSA: التوقيع الرقمي
&lt;/h2>&lt;p>من الميزات الرائعة لتشفير RSA أنه يمكن استخدامه أيضًا كـ &lt;strong>&amp;ldquo;توقيع رقمي&amp;rdquo;&lt;/strong> عن طريق عكس أدوار المفتاح المعلن والمفتاح السري.&lt;/p>
&lt;p>في التشفير كان الإجراء &amp;ldquo;التشفير بالمفتاح المعلن $\Rightarrow$ فك التشفير بالمفتاح السري&amp;rdquo;،
أما في التوقيع الرقمي، نتبع خطوات &amp;ldquo;التشفير بالمفتاح السري $\Rightarrow$ فك التشفير بالمفتاح المعلن&amp;rdquo;.&lt;/p>
&lt;div class="mermaid">flowchart TD
A1["1. أليس تنشئ توقيعًا باستخدام مفتاحها السري"] --> A2["S ≡ M^d (mod N)"]
A2 --> A3["إرسال الرسالة M والتوقيع S"]
A3 --> B1["2. بوب يتحقق من التوقيع باستخدام المفتاح المعلن"]
B1 --> B2["حساب M' ≡ S^e (mod N)"]
B2 --> B3["التحقق مما إذا كان M' يتطابق مع M"]&lt;/div>
&lt;p>تستخدم أليس مفتاحها السري $d$ لتحويل الرسالة (وهذا هو التوقيع $S$)، وترسله إلى بوب. يستخدم بوب المفتاح المعلن لأليس $e$ لإجراء عملية التحقق. إذا كانت نتيجة الحساب تتطابق مع الرسالة الأصلية، فإن ذلك يثبت في نفس الوقت أن &amp;ldquo;هذه البيانات لا يمكن إنشاؤها إلا بواسطة المفتاح السري لأليس&amp;rdquo;، و&amp;quot;لم يتم التلاعب بالرسالة في الطريق&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="10-تجربة-تشفير-rsa-من-خلال-البرمجة">10. تجربة تشفير RSA من خلال البرمجة
&lt;/h2>&lt;p>حسابات الأسس التي تعتبر صعبة في الحساب اليدوي، يمكن تنفيذها بسهولة بالغة باستخدام بايثون (Python). وفيما يلي كود بايثون يمكنك من خلاله تجربة المنطق الأساسي لتشفير RSA.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;إيجاد القاسم المشترك الأكبر&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;إيجاد المفتاح السري d (باستخدام الدالة المدمجة في بايثون 3.8 وما بعده)&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. إنشاء المفتاح&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">13&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">N&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">phi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;المفتاح المعلن: (N=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, e=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">), المفتاح السري: d=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. التشفير&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;النص المشفر: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. فك التشفير&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">decrypted_message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;الرسالة بعد فك التشفير: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">decrypted_message&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>تستخدم دالة &lt;code>pow(base, exp, mod)&lt;/code> في بايثون خوارزمية سريعة تسمى &amp;ldquo;التربيع المتكرر (Exponentiation by squaring)&amp;rdquo; داخليًا، لذلك حتى بالنسبة للأعداد المكونة من مئات الأرقام، ينتهي الحساب في لحظة.&lt;/p>
&lt;hr>
&lt;h2 id="11-الخلاصة-وتقنيات-التشفير-المستقبلية">11. الخلاصة وتقنيات التشفير المستقبلية
&lt;/h2>&lt;p>لقد قمنا بتوضيح آلية عمل تشفير RSA بناءً على المعرفة برياضيات المرحلة الثانوية.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>صعوبة التحليل إلى العوامل الأولية:&lt;/strong> حساب $p \times q = N$ سهل، لكن إيجاد $p, q$ من $N$ صعب للغاية.&lt;/li>
&lt;li>&lt;strong>التطابق ومبرهنة أويلر:&lt;/strong> بفضل القاعدة $a^{\phi(N)} \equiv 1 \pmod N$، يكتمل &amp;ldquo;الباب الخلفي&amp;rdquo; السحري الذي يسمح بـ &amp;ldquo;العودة إلى الحالة الأصلية عند الرفع لأس عدد معين&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>المفتاح المعلن والمفتاح السري:&lt;/strong> يمكن لأي شخص التشفير، ولكن المستلم الشرعي فقط هو من يمكنه فك التشفير.&lt;/li>
&lt;/ol>
&lt;p>الـ $N$ المستخدم في تشفير RSA الحالي يتكون من أكثر من 600 رقم، وحتى لو تم حشد جميع الحواسيب العملاقة في العالم، فإن التحليل إلى العوامل الأولية سيستغرق وقتًا أطول من عمر الكون. ومع ذلك، عندما تصبح &amp;ldquo;الحواسيب الكمومية&amp;rdquo;، التي تتقدم الأبحاث بشأنها في السنوات الأخيرة، قابلة للتطبيق العملي في المستقبل، فهناك احتمال أن يتم حل هذا التحليل إلى العوامل الأولية في لحظة بواسطة &amp;ldquo;خوارزمية شور&amp;rdquo;. لذلك، يجري حاليًا تطوير &amp;ldquo;تشفير مقاوم للحواسيب الكمومية&amp;rdquo;، والذي لا يمكن حتى للحواسيب الكمومية فك تشفيره، بوتيرة سريعة في جميع أنحاء العالم.&lt;/p>
&lt;p>الرياضيات المتقدمة التي غالبًا ما يُعتقد أنها &amp;ldquo;غير مفيدة&amp;rdquo;، تحمي في الواقع حياتنا اليومية من جذورها. يعتبر تشفير RSA من أفضل المواد التعليمية التي توضح لنا عمق وجمال هذه الرياضيات. نأمل أن تكون قد شعرت ولو قليلاً بمتعة التشفير والرياضيات من خلال هذا المقال.&lt;/p></description></item></channel></rss>