菜鸡刚开始学密码学,本文如果谬误,劳请师傅们轻点骂orz~
baby_dsa
给出task.py和data.
task.py:
1 | #!/usr/bin/env python |
data:
1 | (3297226463037324458008837284498963372649038889390685051849680175016505646001761220109858921624266044035133134135402561235635833428206886888308027772353030767400921078346868377298401213812053250316002033941692272192644613252296579884516731560436501073253924457646558698855484781747029397755111633297587215976579633451933658235385386539518006570069653575146060016811911140614606471930327341368582979836042585406811352236326065292636484550807213756482153084427714549694264685695977531537425682212155553568848666088576932888234659355213664909753781753917401161977762663658097504411914908081677033980915039079517766159760522261279115347385813009437510156898969769563687869495721977265444799585634019880951532080217960456901788918439265788169910062822889580199366417455186595489973000351770200485095008494228829300145039695936946379585625051402553034971207474762463147744467360158847593356030745194143276254949463650698210515569533L, 82302835442112137125891403368151249910268706824854786126600390413622302196443L, 1156233264299340971106498371495495695225880592354374034142195518472540521911699506391311324676590685365234887170345722135060009885002334748836477169806166169806180231794918961214520698361874839110454610266388341977984902756569838594616255112661600466818870137432772800368859461445854700956291885576855069405183771903076277144927769029433730710613058788277691211698675287829143272152835171859480781061918556840079857761203012054552142555673071865310355331986288606422711525790877591376770834180618492794265362178603111236615495225612101250344421932588038244804199229449738675082560512062564365473035097263889257937140778993389305893378514344032352806521972367991027459721160744835688761657797398841523104074451793557924512992305640697344011520550723893828185707635141404445213445935586965289450282024222064488965878769991566367115153619761583843561579531705057955933288008556165952066173304891391375100346312776539530448611005L, 290999623787731812697719691852061290246619413463636312382146969900546384514710782843153962704851916091601679028830866176332331519515156301401537173069908181509028464322647352256632424684809349121024262597006913707483811117644197481959053785475083406472583099140506505071300193356002443007750220524932219191932969202270343323955035291396808472686684787610559114702054784699365490860392737061056233160308943296478540798353134878937088336672928162894332961762277559345860479916248086821117811990391025187125193074059001086441305977133252774698996653122297123447837449168657347308016270030881395674066421144002959751936839166935726200833785132736328859710351871352567511516142170956091885352178579302299634322254818383978585773136692588922976043617337904545396146755609284163743476297772686548475170197605412847689587171522453229055932712714154869989454808561458852031769119489235598402066924082778376081494632258448434048562053L) |
很明显,两次加密用了相同的私钥。去网上搜,搜到了这两篇:
原理讲得很清楚,复用私钥的话可以实现攻击。
上面两篇文章针对的是原版dsa,算是本题的弱化版,不过原理是相同的。
原版dsa的sign中k = pow(y, x, g) % q
而此题k = pow(y, x, g) * random.randrange(1, 512) % q
多乘了一个随机数。
重点看:
1 | def sign(message, pubkey, privkey): |
码公式太麻烦了,菜鸡选择手写推导过程:
最后把除法换成乘法逆就好啦。
最终脚本如下:
1 | from Crypto.Util.number import * |
baby_rsa
给出task.py和data.
task.py:
1 | #!/usr/bin/env python |
data:
1 | n=17649959524397760997121068808256580843504587497910149453915162267396485718887518595291066193109877306674118444195689568088263844046660375223625289837992862053279345177671592293911174778827999488542179620983366850016034027115530276422989943300228066482304416809472413052663535805445730178026554076921827725694259203653909224978173857255494234555062560049936771927672590813681897238186260507539943545237569643120449213465796499750961465626495972566123774033404378255591053613115928255568749091129063492156842873395480632444228696955053141918113950854532182678159336565263274798149079981609244430557152399984535126235363 |
先下结论再推导:
pow(hint2, 123, n1) - pow(hint1, 321, n1) 与 n1有公因子p1。
从而可以分解n1,求得第二次加密的m,即第一次加密的p。从而分解n。
然后是推导过程。这个推导是我自己琢磨的,很可能有更简单的推导而我不知道。如果师傅们知道更简单的推导思路,还请教教我这个菜鸡。
先说下这个公式,等下需要两次用到:
然后同样是手写的推导过程:
脚本:
1 | from Crypto.Util.number import * |