关联信息攻击
题目:
from Crypto.Util.number import *
flag = b'NSSCTF{******}'
p = getPrime(512)
q = getPrime(512)
n = p*q
e = 3
m1 = bytes_to_long(flag)
a = getPrime(128)
b = getPrime(128)
m2 = a*m1 + b
c1 = pow(m1, e, n)
c2 = pow(m2, e, n)
print(f'n = {n}')
print(f'a = {a}')
print(f'b = {b}')
print(f'c1 = {c1}')
print(f'c2 = {c2}')
'''
n = 100458074154921630841467009716211081004496986067171453439200150708921645946139163766441611050743248698408002732330100522747315912617782265320913313460939731072047224701193946357341685422329349168512101723657005099845122860786073559690394636750367940135874243034107367507957642817011696553619030089913082650051
a = 235598638113466821523819951671842238817
b = 183046284622289531351267591814278208143
c1 = 59213026759461784288811267183372841532509333531605324857784387344377914885661521950844577998650904368265218037805476510488318417561718106578315758637105422183211905379616339980270327392640886739452625323181466064322246845738001714864060399808732460864513032069624364554351131806580712989439398464697132652674
c2 = 3451970836023636992808694960720139231990590529637727188690993996140273782744393239397467373679391223914185297028545706156586953463105320180151843119949047044046733716896796505869700601788410522957973779842899158545218190431782013633486273807312128458720848868027747769057989052968304813931468091592761421857
'''
解题思路:
- 首先m2 = a*m1 + b
-
移项得
-
得m1 
解答:
from gmpy2 import *
from Crypto.Util.number import *
n = 100458074154921630841467009716211081004496986067171453439200150708921645946139163766441611050743248698408002732330100522747315912617782265320913313460939731072047224701193946357341685422329349168512101723657005099845122860786073559690394636750367940135874243034107367507957642817011696553619030089913082650051
a = 235598638113466821523819951671842238817
b = 183046284622289531351267591814278208143
c1 = 59213026759461784288811267183372841532509333531605324857784387344377914885661521950844577998650904368265218037805476510488318417561718106578315758637105422183211905379616339980270327392640886739452625323181466064322246845738001714864060399808732460864513032069624364554351131806580712989439398464697132652674
c2 = 3451970836023636992808694960720139231990590529637727188690993996140273782744393239397467373679391223914185297028545706156586953463105320180151843119949047044046733716896796505869700601788410522957973779842899158545218190431782013633486273807312128458720848868027747769057989052968304813931468091592761421857
def get_m1(a, b, c1, c2, n):
a3 = pow(a, 3, n)
b3 = pow(b, 3, n)
tmp1 = ((c2 + 2*a3*c1 - b3) * b) % n
tmp2 = ((c2 - a3*c1 + 2*b3) * a) % n
tmp3 = invert(mpz(tmp2), mpz(n))
tmp4 = (tmp1 * tmp3) % n
return tmp4
m1 = get_m1(a, b, c1, c2, n)
flag = long_to_bytes(m1)
print(flag)
#NSSCTF{76f8044e-7bf9-43cd-885f-22f611628b8b}