مضى على الشبكة و يوم من العطاء.
  • تحذير: يجب على كل روّاد الشبكة تشغيل برامج الاختراق داخل الأنظمة الوهمية وهي بهدف التعلم وحماية الأعضاء والتوعية بها

شرح تحدي Salty ( فكرة e = 1 في RSA) من موقع Crypto Hack

3b0-0d3b0-0d is verified member.

{ || مشرف قسم CTF || }
.:: طاقم المشرفين ::.

السمعة:



يمكن حل التحدي باكثر من طريقة سأشرح طريقتين


معطينا 3 قيم
كود:
e = 1
ct = 44981230718212183604274785925793145442655465025264554046028251311164494127485
n = 110581795715958566206600392161360212579669637391437097703685154237017351570464767725324182051199901920318211290404777259728923614917211291562555864753005179326101890427669819834642007924406862482343614488768256951616086287044725034412802176312273081322195866046098595306261781788276570920467840172004530873767


الطريقة الاولى

عند الرجوع الى قوانين ال Rsa
من هذا القانون يمكن استنتاج ان قيمة d = قيمه e
كود:
d = e⁻¹ (mod φ)
لان e = 1
تصبح المعادلة
كود:
d = 1 (mod φ)
حسب قانون RSA حيث أن
كود:
1 < φ
وحسب قانون ال mod
صغير mod كبير يرجع نفس قيمة الصغير
لذا
كود:
1 mod φ = 1  = d

هيك في 4 متغيرات وبأمكاننا حل التحدي عن طريق الكود التالي
👇
كود:
from Crypto.Util.number import long_to_bytes
d = 1
ct = 44981230718212183604274785925793145442655465025264554046028251311164494127485
n = 110581795715958566206600392161360212579669637391437097703685154237017351570464767725324182051199901920318211290404777259728923614917211291562555864753005179326101890427669819834642007924406862482343614488768256951616086287044725034412802176312273081322195866046098595306261781788276570920467840172004530873767
print(long_to_bytes(pow(ct, d, n)).decode())



الطريقه الثانية



حسب قانون التشفير
كود:
ct ≡ pt ^ e  (mod N)

عندما تكون قيمة الـ e = 1
تصبح ( أي رقم مرفوع للقوة 1 يكون هو نفسه )

كود:
ct ≡ pt  (mod N)
الان في هذه الحالة
معناها أن باقي قسمة الـ ct على N سوف تعطي نفس باقي قسمة pt على N

كود:
ct mod N == pt mod N

حيث ≡ هي Congruent وليست =
كود:
a ≡ b (mod N)
يعني أن a و b لديهم نفس باقي القسمة عند قسمتهما على N.


هذا لا يعني بالضرورة أن القيمة الفعلية لل ct ان تكون نفس القيمة الفعلية لل pt.

في حالة e = 1 في نظام RSA، تصبح عملية التشفير ضعيفة، وال ct يحصل على باقي عند قسمته على N نفس قيمة باقي ال pt عند قسمته على N.

نستنتج انه قيمة ال ct = pt

فيمكن حل التحدي بالكود التالي
👇
كود:
from Crypto.Util.number import long_to_bytes
ct = 44981230718212183604274785925793145442655465025264554046028251311164494127485
print(long_to_bytes(ct).decode())
 
التعديل الأخير بواسطة المشرف:




يمكن حل التحدي باكثر من طريقه سأشرح طريقتين


معطينا 3 قيم
كود:
e = 1
ct = 44981230718212183604274785925793145442655465025264554046028251311164494127485
n = 110581795715958566206600392161360212579669637391437097703685154237017351570464767725324182051199901920318211290404777259728923614917211291562555864753005179326101890427669819834642007924406862482343614488768256951616086287044725034412802176312273081322195866046098595306261781788276570920467840172004530873767


الطريقه الاولى

عند الرجوع الى قوانين ال Rsa
من هذه القانون يمكن استنتاج ان قيمه d = قيمه e
كود:
d = e⁻¹ (mod φ)
لان e = 1
تصبح المعادله
كود:
d = 1 (mod φ)
حسب قانون RSA حيث أن
كود:
1 < φ
وحسب قانون ال mod
صغير mod كبير يرجع نفس قيمه الصغير
لذا
كود:
1 mod φ = 1  = d

هيك في 4 متغيرات وبأمكاننا حل التحدي عن طريق الكود التالي 👇
كود:
from Crypto.Util.number import long_to_bytes
d = 1
ct = 44981230718212183604274785925793145442655465025264554046028251311164494127485
n = 110581795715958566206600392161360212579669637391437097703685154237017351570464767725324182051199901920318211290404777259728923614917211291562555864753005179326101890427669819834642007924406862482343614488768256951616086287044725034412802176312273081322195866046098595306261781788276570920467840172004530873767
print(long_to_bytes(pow(ct, d, n)).decode())



الطريقه الثانيه
حسب قانون التشغير
كود:
ct ≡ pt ^ e  (mod N)

عندما تكون قيمه الـ e = 1
تصبح ( أي رقم مرفوع للقوة 1 يكون هو نفسه )
كود:
ct ≡ pt  (mod N)
الان في هذه الحاله
معناها أن باقي قسمه الـ ct على N سوف تعطي نفس باقي قسمه pt على N
كود:
ct mod N == pt mod N

حيث ≡ هي Congruent وليست =
كود:
a ≡ b (mod N)
يعني أن a و b لديهم نفس باقي القسمه عند قسمتهما على N.


هذا لا يعني بالضرورة أن القيمة الفعلية لل ct ان تكون نفس القيمة الفعلية لل pt.

في حالة e = 1 في نظام RSA، تصبح عملية التشفير ضعيفة، وال ct يحصل على باقي عند قسمته على N نفس قيمة باقي ال pt عند قسمته على N.

نستنتج انه قيمه ال ct = pt

فيمكن حل التحدي بالكود التالي 👇
كود:
from Crypto.Util.number import long_to_bytes
ct = 44981230718212183604274785925793145442655465025264554046028251311164494127485
print(long_to_bytes(ct).decode())
بارك الله فيك على هذا الطرح وجزاك الله كل خير
احسنت يا عبود 🤍
 

آخر المشاركات

عودة
أعلى