Řanda
./عضو جديد



السمعة:
- إنضم11 مايو 2024
- المشاركات 16
- مستوى التفاعل 28
- النقاط 13
السلام عليكم ورحمة الله
حل تحدي bAby_rSA من مسابقة TTUCTF المُقامه في جامعة الطفيلة التقنية
حل تحدي bAby_rSA من مسابقة TTUCTF المُقامه في جامعة الطفيلة التقنية

description
كود:
I wanted to raise the power of a number, but my friend picked a number to put in the equation int("9" * 1000)
but
My friend's number is bigger than everything...even if another number is raised to a power it (My friend's number) is still huge
code.py
Python:
import math
from Crypto.Util.number import *
# p and q consist of 15 digits
p = 366652997......
q = 926782929......
n = p * q
e = 7
phi = ( p - 1 ) * (q - 1 )
m = bytes_to_long(b"TTUCTF{r5A
o2 = 36861728689062005922079472777522260642618880598666338535731
m = int(m / o2) # m mod o2 == 0
print("c =" , pow(m,e,n))
x = ??
# If you know the value of x in range (47,53) Search manually...
k = pow((p - 1) , x , int("9" * 1000))
l = pow((q + 1) , x , int("9" * 1000))
print("k =" , k)
print("l =" , l)
output.txt
Python:
c = 311913313541165347372338283513
k = 163215726038713706989303647202033813645656998721543259773716955657012777001268130391390337238803033531298800406273193471792517987655733198024052623295990627680047932855450905833612355053222129266244897458798107424636949257267538463481106742627778551880169706371109273488541086719441064673434510966061295060106777276283596345721682333625355355301263665402761829008707748571859919234952755203896556877605897112652874533509643603149649407222415013720382770201796615663941476197080525214619330481679165262067227009142818461236173238265736794147415707673483980537693113730323824816643471707227661325849801684556166966783171610575891637750703167580778938949676377613702776550081118365942918745441127133906376446240753169401705738010624
l = 22330646905727778425635861987069204693215970647562903916876004162496159529518859015558170558031262035907153330872961135722376390948852891725435071183940360278565929635687183617052079231961950215282311720415612754844622706742909303234455865864979682591897660681126883478584603323934231497632933373005498700493328277824406083414380485576686901746940334376226382246559420803020679840747685377636787506274763880791139386073106571543141282932745813402305238355842655089697799341016628143259309379348741857056408635522117422908816590175132226230786839667450612026309747355213805870264753210975572503460096313340144017677260036955239504477394642004832783781349896149175741154621045322429396182383646214225605580360145491238182572304357590700798722780954624
الحل
أول شيء بنفهمه من الوصف إنه بحكي عن هدول السطرين من الكود :
Python:
k = pow((p - 1) , x , int("9" * 1000))
l = pow((q + 1) , x , int("9" * 1000))
بنفهم من الوصف أن القيمة int("9" * 1000) كبيرة وهي مبينة معنا وبنقدر نعرف برضو إنها أكبر من (q + 1) قوة x من الوصف يعني بنستنتج إنه أي شيء صغير mode كبير بعطينا الصغير نفسه يعني ما إلها قيمة أصلًا الـ int("9" * 1000) , فبنمحيها وبنخلي العملية بس قوة , الـ pow بتساوي
Python:
pow( A , B ,C ) == A ^ B mod C
وزي ما طلع بالهنت إنه هاي القيمة pow((p - 1) , x , int("9" * 1000)) هي نفسها هاي القيمة (p - 1) ^ x اللي معنى بالوصف
الآن بنشوف إنه معنا قيم p and q لكن ناقصات
Python:
p = 366652997......
q = 926782929......
ومعطينا إنه كل وحدة منهم 15 رقم , بنعمل فور لوب من القيمة هاي 366652997000000 اللي هي الرقم اللي بنعرفه وبنحط باقي القيم صفار عشان يبدأ من أقل قيمة ممكن تكون هي قيمة الـ p وبنخلي الفور لوب تخلص للـ 366652998000000 اللي هي أعلى قيمة ممكن تكون هي القيمة يعني زدنا واحد على آخر رقم كان 7 خليناه 8 , فهيك راح يجرب كل القيم الممكنة لـ p وبنعمل نفس الاشي للـ q ف بصفي عننا .
Python:
for p in range(366652997000000, 366652998000000):
for q in range(926782929000000, 926782930000000):
هسا بنحط الشرط اللي يتأكد إذا كانت الـ p والـ q صح , هو معطينا بالسؤال :
k = (p - 1) ** x
l = ( q + 1 ) ** x
معطينا قيمة الـ x ومعطينا قيمة الـ k ف بنخليه يعمل العملية هاي k = (p - 1) ** x اللي هي من السؤال ويتأكد إذا طابقت القيمة اللي معطينا إياها if k == k2
وبنعمل نفس الاشي للـ q ف بصفي عننا :
Python:
for p in range(366652997000000, 366652998000000):
k = (p - 1) ** x
if k == k2:
for q in range(926782929000000, 926782930000000):
l = ( q + 1 ) ** x
if l == l2:
آخر شيء صار معنا القيم الـ p والـ q بنطبق الخوارزمية rsa وهي شرحها , شرح 3b0-0d
الشرح + Note
- 3b0-0d
- الردود: 2
- المنتدى: قسم التشفير | Cryptography 🔐
آخر شيء بنكتب هاد السطر وشرحه كالآتي:
Python:
print(long_to_bytes(pow(c, inverse(e, (p - 1) * (q - 1)), p * q) * o2).decode())
بنبدأ من جوا
Python:
pow( c , inverse( e , (p - 1) * (q - 1) ) , p * q)
phi = (p - 1) * (q - 1)
so...
pow( c , inverse( e , phi ) , p * q)
d = inverse( e , phi )
so...
pow( c , d , p * q)
n = p * q
so...
m = pow( c , d , n) >> in RSA
آخر شيء بنضرب قيمة m بالقيمة o2 , لأنه بالسؤال قسم قيمة m على الـ o2 وحكالنا إنه ما في باقي قسمة m mod o2 == 0 #
بصفي معنا الكود كامل:
Python:
from Crypto.Util.number import *
e = 7
c = 311913313541165347372338283513
k2 = 163215726038713706989303647202033813645656998721543259773716955657012777001268130391390337238803033531298800406273193471792517987655733198024052623295990627680047932855450905833612355053222129266244897458798107424636949257267538463481106742627778551880169706371109273488541086719441064673434510966061295060106777276283596345721682333625355355301263665402761829008707748571859919234952755203896556877605897112652874533509643603149649407222415013720382770201796615663941476197080525214619330481679165262067227009142818461236173238265736794147415707673483980537693113730323824816643471707227661325849801684556166966783171610575891637750703167580778938949676377613702776550081118365942918745441127133906376446240753169401705738010624
l2 = 22330646905727778425635861987069204693215970647562903916876004162496159529518859015558170558031262035907153330872961135722376390948852891725435071183940360278565929635687183617052079231961950215282311720415612754844622706742909303234455865864979682591897660681126883478584603323934231497632933373005498700493328277824406083414380485576686901746940334376226382246559420803020679840747685377636787506274763880791139386073106571543141282932745813402305238355842655089697799341016628143259309379348741857056408635522117422908816590175132226230786839667450612026309747355213805870264753210975572503460096313340144017677260036955239504477394642004832783781349896149175741154621045322429396182383646214225605580360145491238182572304357590700798722780954624
o2 = 36861728689062005922079472777522260642618880598666338535731
x = 50
for p in range(366652997000000, 366652998000000):
k = (p - 1) ** x
if k == k2:
for q in range(926782929000000, 926782930000000):
l = ( q + 1 ) ** x
if l == l2:
m = print(long_to_bytes(pow(c, inverse(e, (p - 1) * (q - 1)), p * q) * o2).decode())
الـ flag
TTUCTF{r5A_1s_A1w4yS_Beau7iFu1}
التعديل الأخير بواسطة المشرف: