最受欢迎的加密方法之一RSA -Crypto 0x00

Cryptography

现代密码学主要使用代数方法。当然,最受欢迎的加密方法之一是RSA。它是asymmetr cipher(非对称加密):一个人拥有一个公钥和一个私有秘钥。可以将公钥分发给所有人 ,并允许对任何消息进行加密。但是,只有私钥才能解密这个使用公钥加密的消息。通常情况下,在仅仅知道公钥的情况下是不能解密消息的。but, 这正是研究它的乐趣所在!

prerequisite

假设我们获得了一个公共秘钥(pubkey.pem)和一条密文消息(message.txt),该消息已经使用此秘钥加密。我们的目标是解密这个被拦截的数据消息。尽管通常这是不可能的,但我们知道可以实现这个目标的一些条件。

The RSA cryptosystem

RSA加密系统基于数论。有关RSA背后涉及的数学的详细说明可以在Wikipedia上找到
因此,从给定的公钥pubkey.pem不能找到任何看起来有价值的数字,我们可以使用OpenSSL为我们提
取数字。

$ openssl rsa -pubin -in pubkey.pem -text -noout
RSA Public-Key: (2047 bit)
Modulus:
    51:cf:f4:6d:9e:e3:20:96:d6:c8:06:cb:c7:df:2d:
    1d:3b:ea:7e:7b:2f:c4:e8:26:d9:fc:5e:18:79:99:
    12:dc:a1:50:b2:9c:65:c0:f9:e6:64:53:39:6c:e7:
    de:63:1a:0f:9a:67:45:13:8b:61:25:bb:cd:18:5a:
    a1:2e:b0:9a:4a:1b:d8:06:11:8c:97:a8:de:05:ed:
    0b:e6:b4:5f:c1:c9:e9:93:71:92:f5:8b:c4:a5:cc:
    27:67:80:3c:0b:21:34:2a:f5:cb:8f:34:af:fb:1a:
    6e:c2:52:0c:76:5d:87:52:1c:68:48:db:d8:31:81:
    2e:cc:6d:8b:b3:d6:17:33:b0:eb:c3:52:cf:64:d4:
    44:5c:99:55:72:92:2f:49:3d:71:89:95:9d:b2:32:
    1e:1b:ac:59:25:fa:56:dc:69:f6:85:8e:fe:eb:a0:
    a5:a9:d7:6b:a1:98:18:71:53:92:74:24:e5:f7:b6:
    80:98:ab:8c:10:44:2b:73:d1:49:02:7c:fc:37:d0:
    30:05:63:37:c3:e0:f4:21:6c:f4:32:23:96:74:41:
    b6:08:ee:c2:a6:48:e8:ce:85:78:94:c6:65:03:0c:
    01:24:56:29:27:9b:38:7f:cd:bd:c3:5b:61:67:71:
    5b:54:bd:55:56:18:0d:9a:f2:50:4b:52:7a:90:fa:
    e7
Exponent: 65537 (0x10001)

这是我们要处理的数字。

The attack

现在,我们已经提取了公钥的参数。这里whitepaper列出了针对RSA加密系统攻击的多种场景,我们可以找到针对我们的情况的方法。我们这里尝试分解公钥:
首先将公钥的模数N转换为十进制:

N=10327849034940138613515485956077213322791085874638285662823764630659653931824178919168344401508423966366637831067655701114352106747323628144645384205073278784870804834942988268503504130770762781798270763453272421050209487483563600870343875197428105079394315585993355808937811229959083289653056248770988647762812998870912510238393368777882358059256678052653963583286245796285737035786447522814310717433588049686223718247661713594680120785280795132759253149754143640871380226770164628599577669124463514838464342769690232097283333816896581904763736283142031118073027496197756777460403007359764250621763279762041468943079

这里因为其中一个因子很小所以只使用使用python进行演示:

>>> for i in range(2,1000000):
...     if N % i == 0:
...             print("Factor found: " + str(i))
...             break

已知一个因子p,很容易计算出另外一个因子q,然后计算欧拉函数φ(n)=(p-1) * (q-1),再通过d * e ≡ 1 mod φ(N),即可计算出 d:

p=622751
q=16584235167731787847013470803061277015678956556694867873072487447887926204573222554710220299137896151698893829263470795092022504576184748229461509022182668168932373990476110465504678644868916760949835108178505407538822880225906663932043264799941076095252059950113859004542443496612744563482124073298940744796576800151123820336528353672466777346414021097764537645521638337450661718385755338513002335497796149161099248732899206255277182670571055097076123763356692547858422108949105868315872104780985522044066316665393121965734834334905254114025888811325924997427587424504748731773056980012499780203906986519558329
e=65537
d=7312074487887920547357407982314378688897155150214874408550183381894050085247509187968394062526038604773342639011025019556297137238988724093858858051198277405773872863866235829638784079995640190391718500265236749532001928953960489468769540295606716181973014075934358061120536953182526234166258210971159378447960153599444793977694870018129163853869432351687824801103728470080097361029455604613215592499048146965827844602077640176846473893766162315380210290621322995954923507199746456635306986754191452931573350318698345897326509895291030422162236183172092075555313718716441360663770774854649871810733093056968576873473
m=4522827319495133992180681297469132393090864882907734433792485591515487678316653190385712678072377419115291918844825910187405830252000250630794128768175509500175722681252259065645121664124102118609133000959307902964132117526575091336372330412274759536808500083138400040526445476933659309071594237016007983559466411644234655789758508607982884717875864305554594254277210539612940978371460389860098821834289907662354612012313188685915852705277220725621370680631005616548237038578956187747135229995137050892471079696577563496115023198511735672164367020373784482829942657366126399823845155446354953052034645278225359074399

解密密文m:

decrypted = pow(m, d, N)
print(decrypted)

你可能感兴趣的:(CTF_WEB)