2021hgame_aes_and_DH

出现了g**a mod p和g**b mod p,可以猜到是

Differ-Hellman密钥交换,

即真正的密钥是g**ab mod p,但因为a,b未知,所以要把a,b求出

正常情况下是要求离散对数的,但因为对话中有提示是在加法群下操作的,

而在加法群中,幂即重复调用改群的运算,即g**a mod p是a*g mod p

又因为A = a*g mod p所以a=A*g-1 mod p(g-1是g对p的逆元),同理可以得到b的值,从而得到密钥的值。

之后直接解AES即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from Crypto.Cipher import AES
import hashlib
import gmpy2 as gp
from binascii import a2b_hex
A = 6407001517522031755461029087358686699246016691953286745456203144289666065160284103094131027888246726980488732095429549592118968601737506427099198442788626223019135982124788211819831979642738635150279126917220901861977041911299607913392143290015904211117118451848822390856596017775995010697100627886929406512483565105588306151304249791558742229557096175320767054998573953728418896571838697779621641522372719890056962681223595931519174265357487072296679757688238385898442549594049002467756836225770565740860731932911280385359763772064721179733418453824127593878917184915316616399071722555609838785743384947882543058635
B = 5522084830673448802472379641008428434072040852768290130448235845195771339187395942646105104638930576247008845820145438300060808178610210847444428530002142556272450436372497461222761977462182452947513887074829637667167313239798703720635138224358712513217604569884276513251617003838008296082768599917178457307640326380587295666291524388123169244965414927588882003753247085026455845320527874258783530744522455308596065597902210653744845305271468086224187208396213207085588031362747352905905343508092625379341493584570041786625506585600322965052668481899375651376670219908567608009443985857358126335247278232020255467723
p = 30567260905179651419358486099834315837354102714690253338851161207042846254351374572818884286661092938876675032728700590336029243619773064402923830209873155153338320502164587381848849791304214084993139233581072431814555885408821184652544361671134564827265516331283076223247829980225591857643487356406284913560960657053777612115591241983729716542192518684003840806442329098770424504275465756739925434019460351138273272559738332984560095465809481270198689251655392941966835733947437503158486731906649716026200661065054914445245468517406404904444261196826370252359102324767986314473183183059212009545789665906197844518119
g = 12602983924735419868428783329859102652072837431735895060811258460532600319539509800915989811879506790207025505003183121812480524033163157114086741486989697
x1 = gp.invert(g,p)*A%p
x2 = gp.invert(g,p)*B%p
key1 = x1*x2*g%p
shared_secret = key1
sha1 = hashlib.sha1()
sha1.update(str(shared_secret).encode('ascii'))
key = sha1.digest()[:16]
iv1 = a2b_hex('d3811beb5cd2a4e1e778207ab541082b')
iv2= a2b_hex('b4259ed79d050dabc7eab0c77590a6d0')
data1 = a2b_hex('059e9c216bcc14e5d6901bcf651bee361d9fe42f225bc0539935671926e6c092')
data2 = a2b_hex('af3fe410a6927cc227051f587a76132d668187e0de5ebf0608598a870a4bbc89')
decrypt1 = AES.new(key,AES.MODE_CBC,iv1)
decrypt2 = AES.new(key,AES.MODE_CBC,iv2)
flag1 = decrypt1.decrypt(data1)
flag2 = decrypt2.decrypt(data2)
print(flag1,flag2)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!