BUUCTF---RSA3(共模攻击)

1.题目
RSA已知e1,e2,c1,c2

2.知识
共模攻击使用相同N作为加密的模数,如果监听者获知了c1,c2的密文,那么监听者便不需要d1,d2即可解出明文m

3.解题
按照思路编写代码解题

点击查看代码
from gmpy2 import invert
import binascii


def gongmo(n, c1, c2, e1, e2):
  #欧几里得辗转相除
    def egcd(a, b):
        if b == 0:
            return a, 0
        else:
            x, y = egcd(b, a % b)
            return y, x - (a // b) * y

    s = egcd(e1, e2)
    s1 = s[0]
    s2 = s[1]

    # 求模反元素
    if s1 < 0:
        s1 = - s1
        c1 = invert(c1, n)  #因为负数指数在求模运算中需要转化为其正等效值
    elif s2 < 0:
        s2 = - s2
        c2 = invert(c2, n)
    m = pow(c1, s1, n) * pow(c2, s2, n) % n
    return m


c1 = 22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
n = 22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
e1 = 11187289
c2 = 18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2 = 9647291
result = gongmo(n, c1, c2, e1, e2)
print(result)

print(binascii.unhexlify(hex(result)[2:].strip("L")))#strip("L") 的作用是移除字符串中的字符 ‘L’。在某些旧版本的 Python 中,当使用 hex() 函数将一个整数转换为十六进制字符串时,可能会在字符串的末尾添加一个 ‘L’ 来表示长整数。
# 13040004482819947212936436796507286940525898188874967465457845309271472287032383337801279101
# b'flag{49d91077a1abcb14f1a9d546c80be9ef}'
代码中使用欧几里得辗转相除法
posted @ 2024-06-27 09:04  TTDB  阅读(964)  评论(0)    收藏  举报