دوامة (دالة التجزئة)

في علوم الحاسوب والتشفير ، تُعدّ خوارزمية Whirlpool (أو WHIRLPOOL ) دالة تجزئة تشفيرية . صممها فينسنت ريجمان (المشارك في ابتكار معيار التشفير المتقدم ) وباولو إس إل إم باريتو ، اللذان وصفاها لأول مرة عام 2000. سُميت الخوارزمية نسبةً إلى مجرة ​​Whirlpool في كوكبة السلوقيان ( M51 ، أو NGC 5194 )، وهي أول مجرة ​​تم التعرف على بنيتها الحلزونية من قبل ويليام بارسونز ، إيرل روس الثالث، في أبريل 1845 [ 1 ] .

وقد أوصى مشروع NESSIE بهذا التشفير . كما اعتمدته المنظمة الدولية للتوحيد القياسي (ISO) واللجنة الكهروتقنية الدولية (IEC) كجزء من المعيار الدولي المشترك ISO/IEC 10118-3 .

ميزات التصميم

مجرة الدوامة (M51)، التي استوحى منها اسم الخوارزمية. [ 2 ]

Whirlpool عبارة عن خوارزمية تجزئة مصممة على غرار خوارزمية التشفير المربع ، وتعتبر من ضمن عائلة وظائف التشفير المربع.

Whirlpool هو تصميم Miyaguchi–Preneel يعتمد على معيار التشفير المتقدم (AES) المعدل بشكل كبير.

يستقبل برنامج Whirlpool رسالة بأي طول أقل من 2256 بت ويعيد ملخص رسالة بطول 512 بت . [ 3 ]

أعلن المؤلفون أن

"لم يتم تسجيل براءة اختراع لعلامة ويرلبول (ولن يتم تسجيلها أبدًا) . ​​يمكن استخدامها مجانًا لأي غرض." [ 2 ]

تغييرات الإصدار

سيُطلق على الإصدار الأصلي من Whirlpool اسم Whirlpool-0 ، وسيُطلق على أول مراجعة لـ Whirlpool اسم Whirlpool-T ، وسيُطلق على أحدث إصدار اسم Whirlpool في متجهات الاختبار التالية.

  • في المراجعة الأولى في عام 2001، تم تغيير صندوق S من صندوق تم إنشاؤه عشوائيًا بخصائص تشفير جيدة إلى صندوق يتمتع بخصائص تشفير أفضل ويسهل تنفيذه في الأجهزة.
  • في المراجعة الثانية (2003)، تم اكتشاف خلل في مصفوفة الانتشار أدى إلى انخفاض مستوى الأمان المُقدَّر للخوارزمية عن المستوى الأمثل. [ 4 ] وقد تم حل هذه المشكلة بتغيير ثوابت مصفوفة الدوران 8×8 من (1، 1، 3، 1، 5، 8، 9، 5) إلى (1، 1، 4، 1، 8، 5، 2، 9).

الهيكل الداخلي

دالة التجزئة Whirlpool هي بنية Merkle–Damgård تعتمد على تشفير كتلة يشبه AES W في وضع Miyaguchi–Preneel . [ 2 ]

التشفير الكتليدبليو{\displaystyle W}يتكون من مصفوفة حالة 8×8S{\displaystyle S}من البايتات، ليصبح المجموع 512 بت.

تتألف عملية التشفير من تحديث الحالة باستخدام أربع دوال دورية على مدار عشر جولات. الدوال الدورية الأربع هي وحدات فرعية (SB أوγ{\displaystyle \gamma }), ShiftColumns (SC أوπ{\displaystyle \pi }), MixRows (MR أوθ{\displaystyle \theta }) و AddRoundKey (AK أوσ[ك]{\displaystyle \sigma [k]}خلال كل جولة، يتم حساب الحالة الجديدة على النحو التالي:S:=(أكمRSجSب)(S){\displaystyle S:=\left(AK\circ MR\circ SC\circ SB\right)(S)}.

بايتات فرعية

تُطبّق عملية SubBytes تبديلاً غير خطي (صندوق الاستبدال) على كل بايت من الحالة بشكل مستقل. يتكون صندوق الاستبدال ذو 8 بتات من 3 صناديق استبدال أصغر حجماً، كل منها 4 بتات .

أعمدة التحويل

تقوم عملية ShiftColumns بإزاحة كل بايت في كل عمود من أعمدة الحالة بشكل دوري. يتم إزاحة بايتات العمود j إلى الأسفل بمقدار j خانة.

MixBytesInRows

عملية MixBytesInRows هي عملية ضرب من اليمين لكل صف في مصفوفة 8 × 8جيF(28){\displaystyle GF({2^{8}})}يتم اختيار المصفوفة بحيث يكون عدد الفروع (وهي خاصية مهمة عند النظر في مقاومة التحليل التفاضلي للشفرات ) هو 9، وهو الحد الأقصى.

إضافة مفتاح دائري

تستخدم عملية AddRoundKey عملية XOR الثنائية لإضافة مفتاح محسوب وفقًا لجدول المفاتيح إلى الحالة الحالية. جدول المفاتيح مطابق لعملية التشفير نفسها، باستثناء استبدال دالة AddRoundKey بدالة AddRoundConstant التي تضيف قيمة ثابتة محددة مسبقًا في كل جولة.

العملية الكاملة لخوارزمية الدوامة

فيما يلي شرح مفصل لخوارزمية الدوامة كما هو موضح في ورقة الإصدار الرسمية [ 1 ] .

أولاً، دعونا نحدد الرموز المستخدمة:

  • كل رقم مستخدم هو عدد صحيح مكون من 8 بت (1 بايت ).
  • {0،1}ن{\displaystyle \{0,1\}^{n}}هي سلسلة ثنائية مكونة من n بت .
  • من×م{\displaystyle {\mathcal {M}}_{n\times m}}هي مصفوفة من البايتات بحجم n × m .
  • و:أب{\displaystyle f:A\to B}هي دالة تقوم بربط العناصر من المجموعة A بالمجموعة B.
  • أب{\displaystyle a\oplus b}هو عملية XOR الثنائية لـأ{\displaystyle a}وب{\displaystyle b}. لوأ{\displaystyle a}وب{\displaystyle b}إذا كانت مصفوفات ، يتم تطبيق عملية XOR عنصرًا بعنصر (أب=ج  جأنا،ج=أأنا،جبأنا،ج{\displaystyle a\oplus b=c\ \Leftrightarrow \ c_{i,j}=a_{i,j}\oplus b_{i,j}}).
  • وز{\displaystyle f\circ g}هي دالة التركيب لـو{\displaystyle f}وز{\displaystyle g}بحيث(وز)(x)=ز(و(x)){\displaystyle \left(f\circ g\right)\left(x\right)=g\left(f\left(x\right)\right)}؛
  • نك=مαك، (م؛ن؛ك)Z3، مكن{\displaystyle {\underset {k=m}{\overset {n}{\bigcirc }}}\alpha _{k},\ \forall \left(m;n;k\right)\in \mathbb {Z} ^{3},\ m\leq k\leq n}هو التكرار التصاعدي لـαمαم+1...αن-1αن{\displaystyle \alpha _{m}\circ \alpha _{m+1}\circ \ldots \circ \alpha _{n-1}\circ \alpha _{n}}؛
  • ك=نمαك، (م؛ن؛ك)Z3، مكن{\displaystyle {\underset {m}{\overset {k=n}{\bigcirc }}}\alpha _{k},\ \forall \left(m;n;k\right)\in \mathbb {Z} ^{3},\ m\leq k\leq n}هو التكرار التنازلي لـαنαن-1...αم+1αم{\displaystyle \alpha _{n}\circ \alpha _{n-1}\circ \ldots \circ \alpha _{m+1}\circ \alpha _{m}}.

خوارزمية الدوامة

الرسائلم{\displaystyle M}تُضاف أولاً حشوة إلى البيانات المراد تجزئتها لضمان أن يكون طولها من مضاعفات حجم الكتلة (512 بت). ويتم ذلك باستخدام نظام الحشو القياسي المحدد في معيار ISO/IEC 10118-1 (وهو نفسه المستخدم في خوارزميات md5 و sha-2 وغيرها).

  1. أضف بتًا بقيمة '1'؛
  2. أضف عددًا من البتات الصفرية ('0') حسب الحاجة حتى يصل الطول إلى مضاعفات العدد 256 (512-256{\displaystyle 512-256});
  3. أضف الطول الأصلي للرسالة بالبتات باستخدام تنسيق big-endian ذي 256 بت.

ثم يتم تقسيم الرسالة المبطنة إلىت{\displaystyle t}كتل 512 بتمأنا{\displaystyle m_{i}}،1أنات{\displaystyle 1\leq i\leq t}.

يقوم برنامج Whirlpool بتكرار مخطط التجزئة Miyaguchi-Preneel على هذه الكتل [القسمان 3.11 و3.12] [ 1 ] :

ηأنا=μ(مأنا)،ح0=μ(أناV)،حأنا=دبليو[حأنا-1](ηأنا)حأنا-1ηأنا، 1أناتدوامة(م)μ-1(حت){\displaystyle {\begin{aligned}&{\begin{aligned}\eta _{i}&=\mu \left(m_{i}\right),\\H_{0}&=\mu \left(IV\right),\\H_{i}&=W\left[H_{i-1}\right]\left(\eta _{i}\right)\oplus H_{i-1}\oplus \eta _{i},\ 1\leq i\leq t\\\end{aligned}}\\&{\text{Whirlpool}}\left(M\right)\equiv \mu ^{-1}\left(H_{t}\right)\end{aligned}}}

أين:

  • μ:{0،1}512م8×8{\displaystyle \mu :\{0,1\}^{512}\to {\mathcal {M}}_{8\times 8}} هيدالة تحويل السلسلة إلى مصفوفة ؛
  • μ-1:م8×8{0،1}512{\displaystyle \mu ^{-1}:{\mathcal {M}}_{8\times 8}\to \{0,1\}^{512}}هي دالة تحويل المصفوفة إلى سلسلة نصية ؛
  • أناV{\displaystyle IV}هو متجه التهيئة ، وهو عبارة عن سلسلة من 512 بت من 0؛
  • دبليو{\displaystyle W}هي دالة التشفير الخاصة بـ Whirlpool.

شفرة دبليو

وظيفة التشفير الكتلي الداخليةدبليو[م8×8]:م8×8م8×8{\displaystyle W\left[{\mathcal {M}}_{8\times 8}\right]:{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}}[القسم 3.9] [ 1 ] يعمل على مصفوفة 8x8 ويعيدها :

دبليو[ك]=(ر=R1ρ[كر])σ[ك0]{\displaystyle {\begin{aligned}W\left[K\right]=\left({\underset {1}{\overset {r=R}{\bigcirc }}}\rho \left[K_{r}\right]\right)\circ \sigma \left[K_{0}\right]\end{aligned}}}

أين:

  • R{\displaystyle R}هو عدد الجولات (المعيار الذي تستخدمه ويرلبول)R=10{\displaystyle R=10});
  • كن{\displaystyle K_{n}}هو المفتاح رقم ن منك{\displaystyle K}الجدول الزمني الرئيسي؛
  • ρ{\displaystyle \rho }هي دالة التقريب.

يوسع الجدول الزمني الرئيسي نطاق المفتاحكم8×8{\displaystyle K\in {\mathcal {M}}_{8\times 8}}إلى سلسلة من المفاتيحكرم8×8، 0رR{\displaystyle K_{r}\in {\mathcal {M}}_{8\times 8},\ 0\leq r\leq R}[القسم 3.8] [ 1 ] :

ك0=ك،كر=ρ[جر](كر-1)، 1رR{\displaystyle {\begin{aligned}K_{0}&=K,\\K_{r}&=\rho \left[c^{r}\right]\left(K_{r-1}\right),\ 1\leq r\leq R\\\end{aligned}}}

أين:

  • جرم8×8{\displaystyle c^{r}\in {\mathcal {M}}_{8\times 8}}هي مصفوفة الثوابت في الجولة رقم r .

الثابت الخاص بالدورة رقم r ،ر>0{\displaystyle r>0}، هي مصفوفةجرم8×8{\displaystyle c^{r}\in {\mathcal {M}}_{8\times 8}}، كما هو مُعرَّف:

ج0،جر=S[8(ر-1)+ج]،0ج<8جأنا،جر=0،1أنا<8،0ج<8{\displaystyle {\begin{aligned}c_{0,j}^{r}&=S\left[8\left(r-1\right)+j\right],&0\leq j<8\\c_{i,j}^{r}&=0,&1\leq i<8,0\leq j<8\\\end{aligned}}}

أين:

  • Sم16×16{\displaystyle S\in {\mathcal {M}}_{16\times 16}}هو صندوق S.

دالة التقريب ρ

دالة التقريبρ[م8×8]:م8×8م8×8{\displaystyle \rho \left[{\mathcal {M}}_{8\times 8}\right]:{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}}[القسم 3.7] [ 1 ] يُعرَّف على النحو التالي:

ρ[ك]=σ[ك]θπγ(= أك  مR  Sج  Sب){\displaystyle {\begin{aligned}\rho \left[k\right]&=\sigma \left[k\right]\circ \theta \circ \pi \circ \gamma \\&_{\left(=\ AK\ \circ \ MR\ \circ \ SC\ \circ \ SB\right)}\\\end{aligned}}}

أين:

  • γ{\displaystyle \gamma }هي الطبقة غير الخطية؛
  • π{\displaystyle \pi }هو التبديل الدوري ؛
  • θ{\displaystyle \theta }هي طبقة الانتشار؛
  • σ{\displaystyle \sigma }وهي الإضافة الرئيسية.

الطبقة غير الخطية γ (بايتات فرعية)

الوظيفةγ:م8×8م8×8{\displaystyle \gamma :{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}} يتكون من تطبيق متوازٍ لاستبدال غير خطيψ:x(بايت)S[x](بايت){\displaystyle \psi :x_{\text{(Byte)}}\to S\left[x\right]_{\text{(Byte)}}}لكل بايت من الوسيط بشكل مستقل [القسم 3.2] [ 1 ] :

γ(أ)=ب  بأنا،ج=S[أأنا،ج]، 0أنا<8، 0ج<8،{\displaystyle {\begin{aligned}\gamma \left(a\right)=b\ \Leftrightarrow \ b_{i,j}=S\left[a_{i,j}\right],\ 0\leq i<8,\ 0\leq j<8,\\\end{aligned}}}

التبديل الدوري π (إزاحة الأعمدة)

التبديلπ:م8×8م8×8{\displaystyle \pi :{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}} يقوم بإزاحة كل عمود من وسيطه بشكل دوري ومستقل، بحيث يكون العمودج{\displaystyle j}يتم تحريكها للأسفل بواسطةج{\displaystyle j}المواقف [القسم 3.3] [ 1 ] :

π(أ)=ب  بأنا،ج=أ((أنا-ج) تعديل 8)، ج، 0أنا<8، 0ج<8{\displaystyle {\begin{aligned}\pi \left(a\right)=b\ \Leftrightarrow \ b_{i,j}=a_{\left(\left(i-j\right)\ {\text{mod}}\ 8\right),\ j},\ 0\leq i<8,\ 0\leq j<8\\\end{aligned}}}

طبقة الانتشار θ (MixBytesInRows)

طبقة الانتشار الخطيθ:م8×8م8×8{\displaystyle \theta التحويل الخطي {\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}} يعتمد على المصفوفة الدائريةج=دائرة(01(16)،01(16)،04(16)،01(16)،08(16)،05(16)،02(16)،09(16)){\displaystyle C={\text{cir}}\left(01_{(16)},01_{(16)},04_{(16)},01_{(16)},08_{(16)},05_{(16)},02_{(16)},09_{(16)}\right)}[القسم 3.4] [ 1 ] :

θ(أ)=أج، 0أنا<8، 0ج<8{\displaystyle {\begin{aligned}\theta \left(a\right)=a\cdot C,\ 0\leq i<8,\ 0\leq j<8\\\end{aligned}}}

مصفوفة دائريةجمن×ن{\displaystyle C\in {\mathcal {M}}_{n\times n}}تُعرَّف المصفوفة الدائرية بأنها مصفوفة يكون فيها كل صف عبارة عن إزاحة دورية للصف السابق [القسم 2.2] [ 1 ] . ويمكن تمثيل المصفوفة الدائرية رسميًا على النحو التالي:

دائرة(أ0،أ1،...،أن-1)=(أ0أ1أ2أن-1أن-1أ0أ1أن-2أن-2أن-1أ0أن-3أ1أ2أ3أ0)، أنF28، نشمالأو ببساطةدائرة(أ0،أ1،...،أن-1)=ج  جأنا،ج=أ(أنا-ج) تعديل 8، 0أنا<8، 0ج<8، أنF28، نشمال{\displaystyle {\begin{aligned}&{\text{cir}}(a_{0},a_{1},\ldots ,a_{n-1})={\begin{pmatrix}a_{0}&a_{1}&a_{2}&\cdots &a_{n-1}\\a_{n-1}&a_{0}&a_{1}&\cdots &a_{n-2}\\a_{n-2}&a_{n-1}&a_{0}&\cdots &a_{n-3}\\\vdots &\vdots &\vdots &\ddots &\vdots \\a_{1}&a_{2}&a_{3}&\cdots &a_{0}\\\end{pmatrix}},\ \forall a_{n}\in \mathbb {F} _{2^{8}},\ n\in \mathbb {N} \\&{\text{or simply}}\\&{\text{cir}}(a_{0},a_{1},\ldots ,a_{n-1})=c\ \Leftrightarrow \ c_{i,j}=a_{\left(i-j\right)\ {\text{mod}}\ 8},\ 0\leq i<8,\ 0\leq j<8,\ \forall a_{n}\in \mathbb {F} _{2^{8}},\ n\in \mathbb {N} \\\end{aligned}}}

على سبيل المثال، المصفوفة الدائريةج=دائرة(01(16)،01(16)،04(16)،01(16)،08(16)،05(16)،02(16)،09(16)){\displaystyle C={\text{cir}}\left(01_{(16)},01_{(16)},04_{(16)},01_{(16)},08_{(16)},05_{(16)},02_{(16)},09_{(16)}\right)}هي المصفوفة :

ج=(01(16)01(16)04(16)01(16)08(16)05(16)02(16)09(16)09(16)01(16)01(16)04(16)01(16)08(16)05(16)02(16)02(16)09(16)01(16)01(16)04(16)01(16)08(16)05(16)05(16)02(16)09(16)01(16)01(16)04(16)01(16)08(16)08(16)05(16)02(16)09(16)01(16)01(16)04(16)01(16)01(16)08(16)05(16)02(16)09(16)01(16)01(16)04(16)04(16)01(16)08(16)05(16)02(16)09(16)01(16)01(16)01(16)04(16)01(16)08(16)05(16)02(16)09(16)01(16)){\displaystyle {\begin{aligned}C={\begin{pmatrix}01_{(16)}&01_{(16)}&04_{(16)}&01_{(16)}&08_{(16)}&05_{(16)}&02_{(16)}&09_{(16)}\\09_{(16)}&01_{(16)}&01_{(16)}&04_{(16)}&01_{(16)}&08_{(16)}&05_{(16)}&02_{(16)}\\02_{(16)}&09_{(16)}&01_{(16)}&01_{(16)}&04_{(16)}&01_{(16)}&08_{(16)}&05_{(16)}\\05_{(16)}&02_{(16)}&09_{(16)}&01_{(16)}&01_{(16)}&04_{(16)}&01_{(16)}&08_{(16)}\\08_{(16)}&05_{(16)}&02_{(16)}&09_{(16)}&01_{(16)}&01_{(16)}&04_{(16)}&01_{(16)}\\01_{(16)}&08_{(16)}&05_{(16)}&02_{(16)}&09_{(16)}&01_{(16)}&01_{(16)}&04_{(16)}\\04_{(16)}&01_{(16)}&08_{(16)}&05_{(16)}&02_{(16)}&09_{(16)}&01_{(16)}&01_{(16)}\\01_{(16)}&04_{(16)}&01_{(16)}&08_{(16)}&05_{(16)}&02_{(16)}&09_{(16)}&01_{(16)}\\\end{pmatrix}}\\\end{aligned}}}

إضافة مفتاح σ (AddRoundKey)

إضافة المفتاح الأفينيσ[م8×8]:م8×8م8×8{\displaystyle \sigma \left[{\mathcal {M}}_{8\times 8}\right]:{\mathcal {M}}_{8\times 8}\to {\mathcal {M}}_{8\times 8}}يتكون من عملية XOR الثنائية لمصفوفة المفاتيحكك8×8{\displaystyle k\in {\mathcal {K}}_{8\times 8}}:

σ[ك](أ)=أك{\displaystyle {\begin{aligned}\sigma \left[k\right]\left(a\right)=a\oplus k\\\end{aligned}}}

صندوق الاستبدال S (صندوق S)

صندوق SSم16×16{\displaystyle S\in {\mathcal {M}}_{16\times 16}}يُمثَّل عادةً بجدول بحث ، حيث يُربط كل بايت مُدخل ببايت مُخرج مُقابل . يُمكن حسابه باستخدام تقنيات توليد خرائط الانتشار الأمثل [القسم 2.4] [ 1 ولكن إليك تمثيلًا مصفوفيًا له:S=(18(16)23(16)ج6(16)هـ8(16)87(16)ب8(16)01(16)4و(16)36(16)أ6(16)د2(16)و5(16)79(16)6و(16)91(16)52(16)60(16)بج(16)9ب(16)8هـ(16)أ3(16)0ج(16)7ب(16)35(16)1د(16)هـ0(16)د7(16)ج2(16)2هـ(16)4ب(16)وهـ(16)57(16)15(16)77(16)37(16)هـ5(16)9و(16)و0(16)4أ(16)دأ(16)58(16)ج9(16)29(16)0أ(16)ب1(16)أ0(16)6ب(16)85(16)بد(16)5د(16)10(16)و4(16)جب(16)3هـ(16)05(16)67(16)هـ4(16)27(16)41(16)8ب(16)أ7(16)7د(16)95(16)د8(16)وب(16)هـهـ(16)7ج(16)66(16)دد(16)17(16)47(16)9هـ(16)جأ(16)2د(16)بو(16)07(16)أد(16)5أ(16)83(16)33(16)63(16)02(16)أأ(16)71(16)ج8(16)19(16)49(16)د9(16)و2(16)هـ3(16)5ب(16)88(16)9أ(16)26(16)32(16)ب0(16)هـ9(16)0و(16)د5(16)80(16)بهـ(16)جد(16)34(16)48(16)وو(16)7أ(16)90(16)5و(16)20(16)68(16)1أ(16)أهـ(16)ب4(16)54(16)93(16)22(16)64(16)و1(16)73(16)12(16)40(16)08(16)ج3(16)هـج(16)دب(16)أ1(16)8د(16)3د(16)97(16)٠٠(16)جو(16)2ب(16)76(16)82(16)د6(16)1ب(16)ب5(16)أو(16)6أ(16)50(16)45(16)و3(16)30(16)هـو(16)3و(16)55(16)أ2(16)هـأ(16)65(16)بأ(16)2و(16)ج0(16)دهـ(16)1ج(16)ود(16)4د(16)92(16)75(16)06(16)8أ(16)ب2(16)هـ6(16)0هـ(16)1و(16)62(16)د4(16)أ8(16)96(16)و9(16)ج5(16)25(16)59(16)84(16)72(16)39(16)4ج(16)5هـ(16)78(16)38(16)8ج(16)د1(16)أ5(16)هـ2(16)61(16)ب3(16)21(16)9ج(16)1هـ(16)43(16)ج7(16)وج(16)04(16)51(16)99(16)6د(16)0د(16)وأ(16)دو(16)7هـ(16)24(16)3ب(16)أب(16)جهـ(16)11(16)8و(16)4هـ(16)ب7(16)هـب(16)3ج(16)81(16)94(16)و7(16)ب9(16)13(16)2ج(16)د3(16)هـ7(16)6هـ(16)ج4(16)03(16)56(16)44(16)7و(16)أ9(16)2أ(16)بب(16)ج1(16)53(16)دج(16)0ب(16)9د(16)6ج(16)31(16)74(16)و6(16)46(16)أج(16)89(16)14(16)هـ1(16)16(16)3أ(16)69(16)09(16)70(16)ب6(16)د0(16)هـد(16)جج(16)42(16)98(16)أ4(16)28(16)5ج(16)و8(16)86(16)){\displaystyle {\begin{aligned}&S={\begin{pmatrix}18_{(16)}&23_{(16)}&c6_{(16)}&e8_{(16)}&87_{(16)}&b8_{(16)}&01_{(16)}&4f_{(16)}&36_{(16)}&a6_{(16)}&d2_{(16)}&f5_{(16)}&79_{(16)}&6f_{(16)}&91_{(16)}&52_{(16)}\\60_{(16)}&bc_{(16)}&9b_{(16)}&8e_{(16)}&a3_{(16)}&0c_{(16)}&7b_{(16)}&35_{(16)}&1d_{(16)}&e0_{(16)}&d7_{(16)}&c2_{(16)}&2e_{(16)}&4b_{(16)}&fe_{(16)}&57_{(16)}\\15_{(16)}&77_{(16)}&37_{(16)}&e5_{(16)}&9f_{(16)}&f0_{(16)}&4a_{(16)}&da_{(16)}&58_{(16)}&c9_{(16)}&29_{(16)}&0a_{(16)}&b1_{(16)}&a0_{(16)}&6b_{(16)}&85_{(16)}\\bd_{(16)}&5d_{(16)}&10_{(16)}&f4_{(16)}&cb_{(16)}&3e_{(16)}&05_{(16)}&67_{(16)}&e4_{(16)}&27_{(16)}&41_{(16)}&8b_{(16)}&a7_{(16)}&7d_{(16)}&95_{(16)}&d8_{(16)}\\fb_{(16)}&ee_{(16)}&7c_{(16)}&66_{(16)}&dd_{(16)}&17_{(16)}&47_{(16)}&9e_{(16)}&ca_{(16)}&2d_{(16)}&bf_{(16)}&07_{(16)}&ad_{(16)}&5a_{(16)}&83_{(16)}&33_{(16)}\\63_{(16)}&02_{(16)}&aa_{(16)}&71_{(16)}&c8_{(16)}&19_{(16)}&49_{(16)}&d9_{(16)}&f2_{(16)}&e3_{(16)}&5b_{(16)}&88_{(16)}&9a_{(16)}&26_{(16)}&32_{(16)}&b0_{(16)}\\e9_{(16)}&0f_{(16)}&d5_{(16)}&80_{(16)}&be_{(16)}&cd_{(16)}&34_{(16)}&48_{(16)}&ff_{(16)}&7a_{(16)}&90_{(16)}&5f_{(16)}&20_{(16)}&68_{(16)}&1a_{(16)}&ae_{(16)}\\b4_{(16)}&54_{(16)}&93_{(16)}&22_{(16)}&64_{(16)}&f1_{(16)}&73_{(16)}&12_{(16)}&40_{(16)}&08_{(16)}&c3_{(16)}&ec_{(16)}&db_{(16)}&a1_{(16)}&8d_{(16)}&3d_{(16)}\\97_{(16)}&00_{(16)}&cf_{(16)}&2b_{(16)}&76_{(16)}&82_{(16)}&d6_{(16)}&1b_{(16)}&b5_{(16)}&af_{(16)}&6a_{(16)}&50_{(16)}&45_{(16)}&f3_{(16)}&30_{(16)}&ef_{(16)}\\3f_{(16)}&55_{(16)}&a2_{(16)}&ea_{(16)}&65_{(16)}&ba_{(16)}&2f_{(16)}&c0_{(16)}&de_{(16)}&1c_{(16)}&fd_{(16)}&4d_{(16)}&92_{(16)}&75_{(16)}&06_{(16)}&8a_{(16)}\\b2_{(16)}&e6_{(16)}&0e_{(16)}&1f_{(16)}&62_{(16)}&d4_{(16)}&a8_{(16)}&96_{(16)}&f9_{(16)}&c5_{(16)}&25_{(16)}&59_{(16)}&84_{(16)}&72_{(16)}&39_{(16)}&4c_{(16)}\\5e_{(16)}&78_{(16)}&38_{(16)}&8c_{(16)}&d1_{(16)}&a5_{(16)}&e2_{(16)}&61_{(16)}&b3_{(16)}&21_{(16)}&9c_{(16)}&1e_{(16)}&43_{(16)}&c7_{(16)}&fc_{(16)}&04_{(16)}\\51_{(16)}&99_{(16)}&6d_{(16)}&0d_{(16)}&fa_{(16)}&df_{(16)}&7e_{(16)}&24_{(16)}&3b_{(16)}&ab_{(16)}&ce_{(16)}&11_{(16)}&8f_{(16)}&4e_{(16)}&b7_{(16)}&eb_{(16)}\\3c_{(16)}&81_{(16)}&94_{(16)}&f7_{(16)}&b9_{(16)}&13_{(16)}&2c_{(16)}&d3_{(16)}&e7_{(16)}&6e_{(16)}&c4_{(16)}&03_{(16)}&56_{(16)}&44_{(16)}&7f_{(16)}&a9_{(16)}\\2a_{(16)}&bb_{(16)}&c1_{(16)}&53_{(16)}&dc_{(16)}&0b_{(16)}&9d_{(16)}&6c_{(16)}&31_{(16)}&74_{(16)}&f6_{(16)}&46_{(16)}&ac_{(16)}&89_{(16)}&14_{(16)}&e1_{(16)}\\16_{(16)}&3a_{(16)}&69_{(16)}&09_{(16)}&70_{(16)}&b6_{(16)}&d0_{(16)}&ed_{(16)}&cc_{(16)}&42_{(16)}&98_{(16)}&a4_{(16)}&28_{(16)}&5c_{(16)}&f8_{(16)}&86_{(16)}\\\end{pmatrix}}\\\end{aligned}}}

هاش ويرلبول

خضعت خوارزمية الدوامة لمراجعتين منذ مواصفاتها الأصلية في عام 2000.

من المرجح أن يستخدم الأشخاص الذين يستخدمون برنامج ويرلبول أحدث إصدار منه؛ فبينما لا توجد ثغرات أمنية معروفة في الإصدارات السابقة، يتميز الإصدار الأحدث بكفاءة تنفيذ أفضل للأجهزة، ومن المرجح أيضًا أن يكون أكثر أمانًا. وكما ذكرنا سابقًا، فهو الإصدار المعتمد في المعيار الدولي ISO/IEC 10118-3 .

تُمثَّل تجزئات Whirlpool ذات 512 بت (64 بايت) (وتُسمى أيضًا ملخصات الرسائل ) عادةً بأرقام سداسية عشرية مكونة من 128 خانة . يوضح المثال التالي مدخلات ASCII بحجم 43 بايت (بدون علامات اقتباس) وتجزئات Whirlpool المقابلة لها:

إصدارسلسلة الإدخالالتجزئة المحسوبة
ويرلبول-0" الثعلب البني السريع يقفز فوق الكلب الكسول "
4F8F5CB531E3D49A61CF417CD133792CCFA501FD8DA53EE368FED20E5FE0248C 3A0B64F98A6533CEE1DA614C3A8DDEC791FF05FEE6D971D57C1348320F4EB42D
ويرلبول-تي" الثعلب البني السريع يقفز فوق الكلب الكسول "
3CCF8252D8BBB258460D9AA999C06EE38E67CB546CFFCF48E91F700F6FC7C183 AC8CC3D3096DD30A35B01F4620A1E3A20D79CD5168544D9E1B7CDF49970E87F1
دوامة" الثعلب البني السريع يقفز فوق الكلب الكسول "
B97DE512E91E3828B40D2B0FDCE9CEB3C4A71F9BEA8D88E75C4FA854DF36725F D2B52EB6544EDCACD6F8BEDDFEA403CB55AE31F03AD62A5EF54E42EE82C3FB35

التطبيقات

يقدم المؤلفون تطبيقات مرجعية لخوارزمية الدوامة، بما في ذلك نسخة مكتوبة بلغة C ونسخة مكتوبة بلغة Java . [ 2 ] وقد تم نشر هذه التطبيقات المرجعية في المجال العام. [ 2 ]

مع ذلك، كشفت الأبحاث المتعلقة بتحليل أمان وظيفة Whirlpool أن إدخال 8 أخطاء عشوائية في المتوسط ​​يكفي لاختراق رسالة تجزئة Whirlpool ذات 512 بت التي تتم معالجتها، بالإضافة إلى المفتاح السري لـ HMAC-Whirlpool ضمن سياق الحوسبة السحابية للأشياء (CoTs). وهذا يؤكد الحاجة إلى تعزيز إجراءات الأمان عند تطبيقها. [ 5 ]

الشفرة الزائفة

فيما يلي مثال لتطبيق خوارزمية الدوامة القياسية :

S := 0x18, 0x23, 0xc6, 0xe8, 0x87, 0xb8, 0x01, 0x4f, 0x36, 0xa6, 0xd2, 0xf5, 0x79, 0x6f, 0x91, 0x52, \ 0x60، 0xbc، 0x9b، 0x8e، 0xa3، 0x0c، 0x7b، 0x35، 0x1d، 0xe0، 0xd7، 0xc2، 0x2e، 0x4b، 0xfe، 0x57، \ 0x15، 0x77، 0x37، 0xe5، 0x9f، 0xf0، 0x4a، 0xda، 0x58، 0xc9، 0x29، 0x0a، 0xb1، 0xa0، 0x6b، 0x85، \ 0xbd, 0x5d, 0x10, 0xf4, 0xcb, 0x3e, 0x05, 0x67, 0xe4, 0x27, 0x41, 0x8b, 0xa7, 0x7d, 0x95, 0xd8, \ 0xfb، 0xee، 0x7c، 0x66، 0xdd، 0x17، 0x47، 0x9e، 0xca، 0x2d، 0xbf، 0x07، 0xad، 0x5a، 0x83، 0x33، \ 0x63، 0x02، 0xaa، 0x71، 0xc8، 0x19، 0x49، 0xd9، 0xf2، 0xe3، 0x5b، 0x88، 0x9a، 0x26، 0x32، 0xb0، \ 0xe9، 0x0f، 0xd5، 0x80، 0xbe، 0xcd، 0x34، 0x48، 0xff، 0x7a، 0x90، 0x5f، 0x20، 0x68، 0x1a، 0xae، \ 0xb4، 0x54، 0x93، 0x22، 0x64، 0xf1، 0x73، 0x12، 0x40، 0x08، 0xc3، 0xec، 0xdb، 0xa1، 0x8d، 0x3d، \ 0x97، 0x00، 0xcf، 0x2b، 0x76، 0x82، 0xd6، 0x1b، 0xb5، 0xaf، 0x6a، 0x50، 0x45، 0xf3، 0x30، 0xef، \ 0x3f، 0x55، 0xa2، 0xea، 0x65، 0xba، 0x2f، 0xc0، 0xde، 0x1c، 0xfd، 0x4d، 0x92، 0x75، 0x06، 0x8a، \ 0xb2، 0xe6، 0x0e، 0x1f، 0x62، 0xd4، 0xa8، 0x96، 0xf9، 0xc5، 0x25، 0x59، 0x84، 0x72، 0x39، 0x4c، \ 0x5e، 0x78، 0x38، 0x8c، 0xd1، 0xa5، 0xe2، 0x61، 0xb3، 0x21، 0x9c، 0x1e، 0x43، 0xc7، 0xfc، 0x04، \ 0x51، 0x99، 0x6d، 0x0d، 0xfa، 0xdf، 0x7e، 0x24، 0x3b، 0xab، 0xce، 0x11، 0x8f، 0x4e، 0xb7، 0xeb، \ 0x3c، 0x81، 0x94، 0xf7، 0xb9، 0x13، 0x2c، 0xd3، 0xe7، 0x6e، 0xc4، 0x03، 0x56، 0x44، 0x7f، 0xa9، \ 0x2a, 0xbb, 0xc1, 0x53, 0xdc, 0x0b, 0x9d, 0x6c, 0x31, 0x74, 0xf6, 0x46, 0xac, 0x89, 0x14, 0xe1, \ 0x16، 0x3a، 0x69، 0x09، 0x70، 0xb6، 0xd0، 0xed، 0xcc، 0x42، 0x98، 0xa4، 0x28، 0x5c، 0xf8، 0x86 C := 0x01, 0x01, 0x04, 0x01, 0x08, 0x05, 0x02, 0x09, \ 0x09، 0x01، 0x01، 0x04، 0x01، 0x08، 0x05، 0x02، \ 0x02، 0x09، 0x01، 0x01، 0x04، 0x01، 0x08، 0x05، \ 0x05، 0x02، 0x09، 0x01، 0x01، 0x04، 0x01، 0x08، \ 0x08، 0x05، 0x02، 0x09، 0x01، 0x01، 0x04، 0x01، \ 0x01، 0x08، 0x05، 0x02، 0x09، 0x01، 0x01، 0x04، \ 0x04، 0x01، 0x08، 0x05، 0x02، 0x09، 0x01، 0x01، \ 0x01، 0x04، 0x01، 0x08، 0x05، 0x02، 0x09، 0x01 مصفوفة مبنية من متجه التهيئة المراسلة الفورية := 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0 R := 10 func getConstantRoundMatrix(r) cr := IM لكل j من 0 إلى 7 cr[j] := S[8 * (r - 1) + j] endfor إرجاع CR endfunc دالة whirlpoolRound(matrix, key) تطبيق التحويل غير الخطي γ لكل i من 0 إلى 7 لكل j من 0 إلى 7 matrix[i * 8 + j] = S[matrix[i * 8 + j]] endfor endfor # تطبيق التبديل الدوري π tmp := matrix لكل i من 0 إلى 7 لكل j من 0 إلى 7 # '+ 8' لمنع المؤشرات السالبة matrix[i * 8 + j] = tmp[((i - j + 8) % 8) * 8 + j] endfor endfor matrix := tmp # تطبيق الانتشار الخطي θ matrix := dotProduct(matrix, C) # تطبيق إضافة المفتاح σ[key] المصفوفة := مفتاح عملية XOR للمصفوفة مصفوفة الإرجاع endfunc دالة دوامة (M) m, t := pad(M) # تُرجع (paddedMessageDividedInChunks, amountOfChunks) H := IM من أجل i من 0 إلى t W := m[t] Kr := H W := W xor H لكل قيمة r من 1 إلى R cr := getConstantRoundMatrix(r) Kr := whirlpoolRound(Kr, cr) W := whirlpoolRound(W, Kr) endfor H := H xor W H := H xor m[t] endfor أعد تحويل المصفوفة إلى سلسلة سداسية عشرية (H) endfunc

بالنسبة للانتشار الخطيθ{\displaystyle \theta }يلزم إجراء عملية ضرب المصفوفات. يمكن استخدام حساب حقل غالوا لكتابة خوارزمية الضرب هذه :

دالة الضرب النقطي (أ، ب) tmp: Matrix لكل i من 0 إلى 7 لكل j من 0 إلى 7 tmp[i * 8 + j] := 0 لـ k من 0 إلى 7 # ضرب حقل غالوا (2^8) a := A[i * 8 + k]; b := B[k * 8 + j]; product := 0; بينما b > 0 إذا كان b & 1 == 1 المنتج := المنتج XOR أ endif إذا كان a & 0x80 != 0 a := (a << 1) xor 0x11d # x^8 + x^4 + x^3 + x^2 + 1 آخر a := a << 1 endif b := b >> 1 في غضون ذلك tmp[i * 8 + j] := tmp[i * 8 + j] XOR product endfor endfor endfor إرجاع مؤقت endfunc

إليكم تطبيقًا للحشو ذي 512 بت (بحجم 64 بت، بنظام big-endian ) :

func pad(M) original_length := len(M) # بالبايت # 512 بت (الطول الإجمالي) - 256 بت (طول الحجم) - 1 بت (بت الحشو) # 64 بايت - 32 بايت - 1 بايت = 31 بايت الحشو := (31 - الطول_الأصلي) % 64 الحشو := (الحشو + 64) % 64 # تجنب الحشو السالب الطول_الإجمالي := الطول_الأصلي + 1 + الحشو + 32 # بالبايت مُبطّن: بايت[الطول_الإجمالي] انسخ الرسالة الأصلية لكل i من 0 إلى original_length - 1 padded[i] := M[i] endfor padded[original_length] := 0x80 # أضف البت '1'، ثم 7 بتات '0' لكل i من original_length + 1 إلى original_length + padding padded[i] := 0x00 # إضافة 8 بتات من '0' endfor لكل i من 0 إلى 31 padded[total_length - 32 + i] := (original_length * 8) >> (8 * (31 - i)) & 0xff endfor حجم_القطعة := الطول_الإجمالي / 64 مقسم := بايت[مقدار_الجزء][64] for i from 0 to chunk_amount - 1 لكل قيمة j من 0 إلى 63 divide[i][j] := padded[i * 64 + j] endfor endfor أعد القيمة المقسمة، مقدار القطعة endfunc

وهذا مثال على تحويل مصفوفة إلى سلسلة نصية :

دالة تحويل المصفوفة إلى سلسلة سداسية عشرية (المصفوفة) HEX := "0123456789abcdef" النتيجة: بايت[128] لـ i من 0 إلى 63 بايت := مصفوفة[i] result[i * 2] := HEX[byte >> 4] result[i * 2 + 1] := HEX[byte & 0xf] endfor إرجاع النتيجة endfunc

التبني

كان برنامج FreeOTFE من أوائل برامج التشفير الرئيسية واسعة الانتشار التي بدأت باستخدام Whirlpool ، وتلاه برنامج TrueCrypt في عام 2005.

تضمنت VeraCrypt (وهي نسخة معدلة من TrueCrypt ) خوارزمية Whirlpool (الإصدار النهائي) كإحدى خوارزميات التجزئة المدعومة. [ 6 ]

انظر أيضاً

مراجع

  1. 1 2 3 4 5 6 7 8 9 10 11 12 فلوريان مندل1، كريستيان ريشبيرغر، مارتن شلافر، سورين س. تومسن (24-02-2009). هجوم الارتداد: تحليل تشفير ويرلبول وغروستل المُختزل (ملف PDF) . التشفير البرمجي السريع: ورشة العمل الدولية السادسة عشرة.{{cite conference}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) صيانة CS1: أسماء رقمية: قائمة المؤلفين ( رابط )
  2. ١ ٢ ٣ ٤ ٥ باولو إس إل إم باريتو (٢٥ نوفمبر ٢٠٠٨). "دالة التجزئة WHIRLPOOL" . مؤرشف من الأصل في ٢٩ نوفمبر ٢٠١٧. تم الاطلاع عليه في ٩ أغسطس ٢٠١٨ .
  3. باريتو، باولو إس إل إم وريمن، فينسنت (24 مايو 2003). "دالة التجزئة WHIRLPOOL" . مؤرشف من الأصل (ملف مضغوط) بتاريخ 26 أكتوبر 2017. تم الاطلاع عليه بتاريخ 9 أغسطس 2018 .{{cite journal}}يتطلب الاستشهاد بالمجلة ( مساعدة )|journal=
  4. كيوجي، شيبوتاني وشيراي، تايزو (11 مارس 2003). "حول مصفوفة الانتشار المستخدمة في دالة التجزئة Whirlpool" (ملف PDF) . تم الاطلاع عليه بتاريخ 9 أغسطس 2018 .{{cite journal}}يتطلب الاستشهاد بالمجلة ( مساعدة )|journal=
  5. لي، و.، غاو، ز.، غو، د.، غي، س.، لياو، ل.، تشو، ز.، ليو، ي.، وليو، ز. (2017). تحليل أمني لدالة التجزئة Whirlpool في سحابة الأشياء. مجلة KSII للمعاملات في الإنترنت وأنظمة المعلومات، 11(1)، 536-551. https://doi.org/10.3837/tiis.2017.01.028
  6. "ويرلبول" . وثائق فيرا كريبت . IDRIX . تم الاسترجاع في 9 أغسطس 2018 .