Mirai_haN研究一下矩阵RSA

矩阵RSA

今天研究研究矩阵rsa,因为之前打litctf的时候碰到了,现在来研究研究

[论文复现:A Matrix Extension of the RSA Cryptosystem - A_Litlle_World](https://latallvia-d.github.io/2024/07/02/论文复现:A Matrix Extension of the RSA Cryptosystem/)

这个文章,太强了!可以先看看原理↑

对于2x2的问题,将明文存储在2×2的矩阵中,依旧利用整数n=pq,矩阵M代替原来的标量值m,并且不依赖于φ(n)=(p−1)(q−1)而是依赖于值(p^2 -1)(p^2 -p)(q^2 -1)(q^2 -q)

题目1 LitCTF2025 ez_math

题目:

from sage.all import *
from Crypto.Util.number import *
from uuid import uuid4

flag = b'LitCTF{'+ str(uuid4()).encode() + b'}'
flag = bytes_to_long(flag)
len_flag = flag.bit_length()
e = 65537
p = getPrime(512)
P = GF(p)
A = [[flag,                 getPrime(len_flag)],
     [getPrime(len_flag),   getPrime(len_flag)]]
A = matrix(P, A)
B = A ** e

print(f"e = {e}")
print(f"p = {p}")
print(f"B = {list(B)}".replace('(', '[').replace(')', ']'))

# e = 65537
# p = 8147594556101158967571180945694180896742294483544853070485096002084187305007965554901340220135102394516080775084644243545680089670612459698730714507241869
# B = [[2155477851953408309667286450183162647077775173298899672730310990871751073331268840697064969968224381692698267285466913831393859280698670494293432275120170, 4113196339199671283644050914377933292797783829068402678379946926727565560805246629977929420627263995348168282358929186302526949449679561299204123214741547], [3652128051559825585352835887172797117251184204957364197630337114276860638429451378581133662832585442502338145987792778148110514594776496633267082169998598, 2475627430652911131017666156879485088601207383028954405788583206976605890994185119936790889665919339591067412273564551745588770370229650653217822472440992]]

这是一个二阶矩阵。

exp:

import gmpy2
from sage.all import *
from Crypto.Util.number import *

p =8147594556101158967571180945694180896742294483544853070485096002084187305007965554901340220135102394516080775084644243545680089670612459698730714507241869
B = [[2155477851953408309667286450183162647077775173298899672730310990871751073331268840697064969968224381692698267285466913831393859280698670494293432275120170,
4113196339199671283644050914377933292797783829068402678379946926727565560805246629977929420627263995348168282358929186302526949449679561299204123214741547],
[3652128051559825585352835887172797117251184204957364197630337114276860638429451378581133662832585442502338145987792778148110514594776496633267082169998598,
2475627430652911131017666156879485088601207383028954405788583206976605890994185119936790889665919339591067412273564551745588770370229650653217822472440992]]
e=65537
B = Matrix(Zmod(p), B)
phi = (p ** 2 - 1) * (p ** 2 - p)
d = gmpy2.invert(e, phi)
M=B**d%p
m = b''.join(long_to_bytes(int(y)) for x in M for y in x)
print(m)
flag = b''
for i in range(2):
    for j in range(2):
        if b'LitCTF' in long_to_bytes(int(M[i, j])):
            print(long_to_bytes(int(M[i, j])))

题目2 2024H&NCTF

from Crypto.Util.number import *
import os

flag = b"H&NCTF{??????????????}" + os.urandom(73)

p = getPrime(56)
q = getPrime(56)
n = p * q

part = [bytes_to_long(flag[13*i:13*(i+1)]) for i in range(9)]

M = Matrix(Zmod(n),[
    [part[3*i+j] for j in range(3)] for i in range(3)
])

e = 65537
C = M ** e
print(f"n = {n}")
print(f"C = {list(C)}")

"""
n = 3923490775575970082729688460890203
C = [(1419745904325460721019899475870191, 2134514837568225691829001907289833, 3332081654357483038861367332497335), (3254631729141395759002362491926143, 3250208857960841513899196820302274, 1434051158630647158098636495711534), (2819200914668344580736577444355697, 2521674659019518795372093086263363, 2850623959410175705367927817534010)]
"""

这道题,n容易分解。由于这题n比较容易分解,只需要分别求模p和模q的阶,然后类似于RSA的思路即可得解

这道题主要要掌握的是:模p的三阶矩阵群的阶为

p(p+1)(p−1)(p**2+p+1)

exp:

import gmpy2
from sage.all import *
from Crypto.Util.number import *
n = 3923490775575970082729688460890203
C = [(1419745904325460721019899475870191, 2134514837568225691829001907289833, 3332081654357483038861367332497335), (3254631729141395759002362491926143, 3250208857960841513899196820302274, 1434051158630647158098636495711534), (2819200914668344580736577444355697, 2521674659019518795372093086263363, 2850623959410175705367927817534010)]
e=65537
#print(factor(n))
p = 56891773340056609
q = 68964114585148667
C = Matrix(Zmod(n), C)
gp = p*(p**2-1)*(p**2+p+1)
gq = q*(q**2-1)*(q**2+q+1)
g = gp * gq
d = gmpy2.invert(e, g)

M=C**d%n

m = b''.join(long_to_bytes(int(y)) for x in M for y in x)
print(m)
b"H&NCTF{58bff5c1-4d5f-4010-a84c-8fbe0c0f50e8}hj\xa5\x1d'\x92\xa9\x1as\xb5\xd2\x9c\xba=bI\xa5\xb52{\x9c-\xff\xb1\x9dZ\x06\x82v\x11\xaa:t%\xd0\xa6\xb0\xa7wJE\x0f_o\xd6\xf7x3\n\xf44\x01\xee\xd4\r\x08&\x19N\xed\x03\x1b\xfeJ\xc1.\xe7\xecR\xe1\xee\xe4\xbe"
flag = b''
for i in range(3):
    for j in range(3):
        if b'LitCTF' in long_to_bytes(int(M[i, j])):
            print(long_to_bytes(int(M[i, j])))
            
b"H&NCTF{58bff5c1-4d5f-4010-a84c-8fbe0c0f50e8}hj\xa5\x1d'\x92\xa9\x1as\xb5\xd2\x9c\xba=bI\xa5\xb52{\x9c-\xff\xb1\x9dZ\x06\x82v\x11\xaa:t%\xd0\xa6\xb0\xa7wJE\x0f_o\xd6\xf7x3\n\xf44\x01\xee\xd4\r\x08&\x19N\xed\x03\x1b\xfeJ\xc1.\xe7\xecR\xe1\xee\xe4\xbe"

但是有一种非预期做法,就是用 p**2-1 来写,phi取虚数。经过测试发现(p2−1)*(q2−1)恰好为M的阶

sage: M^((p**2-1)*(q**2-1))
[1 0 0]
[0 1 0]
[0 0 1]

exp:

import gmpy2
from sage.all import *
from Crypto.Util.number import *
n = 3923490775575970082729688460890203
C = [(1419745904325460721019899475870191, 2134514837568225691829001907289833, 3332081654357483038861367332497335), (3254631729141395759002362491926143, 3250208857960841513899196820302274, 1434051158630647158098636495711534), (2819200914668344580736577444355697, 2521674659019518795372093086263363, 2850623959410175705367927817534010)]
e=65537
#print(factor(n))
p = 56891773340056609
q = 68964114585148667
C = Matrix(Zmod(n), C)
gp = (p**2-1)
gq = (q**2-1)
g = gp * gq
d = gmpy2.invert(e, g)

M=C**d%n

m = b''.join(long_to_bytes(int(y)) for x in M for y in x)

print(m)
"""
b"H&NCTF{58bff5c1-4d5f-4010-a84c-8fbe0c0f50e8}hj\xa5\x1d'\x92\xa9\x1as\xb5\xd2\x9c\xba=bI\xa5\xb52{\x9c-\xff\xb1\x9dZ\x06\x82v\x11\xaa:t%\xd0\xa6\xb0\xa7wJE\x0f_o\xd6\xf7x3\n\xf44\x01\xee\xd4\r\x08&\x19N\xed\x03\x1b\xfeJ\xc1.\xe7\xecR\xe1\xee\xe4\xbe"

题目* 我也不知道是什么1

秉承着对密码学的热情,我决定给自己出一道变式题难哭自己。我也不知道能不能解出来(bushi

如果是4阶的矩阵呢?

题目

from Crypto.Util.number import *
import os
flag = b"flag{Im_a_fake_fake_flag}" + os.urandom(80) 
p = getPrime(56)
q = getPrime(56)
n = p * q
part = [bytes_to_long(flag[10*i:10*(i+1)]) for i in range(16)]  
M = Matrix(Zmod(n), [
    [part[4*i+j] for j in range(4)] for i in range(4)  
])
e = 65537
C = M ** e
print(f"n = {n}")
print(f"C = {list(C)}")
#n = 2161299653366089167243207795634373
#C = [(1203579289337329558755401879824472, 635547329772992731814505833152218, 2070751282902984263694880681577480, 1320330760105784199025467499321842), (1733504056432372324524300346685572, 90971051889552184856523904970977, 2072167989722479097668583204057485, 774648537057707888739670742506876), (1126892934806577386008718689828682, 137168839069549819026429692668118, 1755350367222061683230058200928026, 778673661849610593283720309680266), (1134256135254791873470229699763233, 778340987025505853923548489995171, 1300801706703633566018939533443148, 495680344965201681816809148916322)]


思路是分解n,然后计算四阶矩阵群的阶

不知道是不是(p**4-1)*(p**4-p)*(p**4-p**2)*(p**4-p**3),试试看吧

import gmpy2
from sage.all import *
from Crypto.Util.number import *

n = 2161299653366089167243207795634373
C = [(1203579289337329558755401879824472, 635547329772992731814505833152218, 2070751282902984263694880681577480, 1320330760105784199025467499321842), (1733504056432372324524300346685572, 90971051889552184856523904970977, 2072167989722479097668583204057485, 774648537057707888739670742506876), (1126892934806577386008718689828682, 137168839069549819026429692668118, 1755350367222061683230058200928026, 778673661849610593283720309680266), (1134256135254791873470229699763233, 778340987025505853923548489995171, 1300801706703633566018939533443148, 495680344965201681816809148916322)]

p=40309505364595739
q=n//p
e=65537
C = Matrix(Zmod(n), C)
gp=(p**4-1)*(p**4-p)*(p**4-p**2)*(p**4-p**3)
gq=(q**4-1)*(q**4-q)*(q**4-q**2)*(q**4-q**3)
g = gp * gq
d = gmpy2.invert(e, g)
M=C**d%n

m = b''.join(long_to_bytes(int(y)) for x in M for y in x)

print(m)
"""
b"flag{Mirai_haN_l0ves_C@yPt0!!!@@@###yeyeyeye}\x05\xce]\xea\x82\xad@vNf\x19*8A\x0cL\x83\x92LBm\xb5\xb0\x06\x06\xd7Lv\xee\x13\xf3\x02\xe1\xc5\x86\x16i\x1d\x81a\xd4\xc9\xaa[\xb1'\xd4\xfb\xf6tg\xb6`\xa3\xd0J5\xd2\xb4E\x11\x8d\x95\x03s\xdd\xf6B\x9e\xf9s\xc2\xb9f\x1c\x80\x07\xf0\xd35\x00\x00\x00"
"""

成功了!也是学到东西了呢。

那我趁热打铁再出一道题玩一下

题目* 我也不知道是什么2

from sage.all import *
from Crypto.Util.number import *
flag = b'flag{********}'
flag = bytes_to_long(flag)
len_flag = flag.bit_length()
e = getPrime(50)
p = getPrime(512)  
P = GF(p)
A = [
    [getPrime(len_flag),   getPrime(len_flag), getPrime(len_flag), getPrime(len_flag)],
    [getPrime(len_flag),   getPrime(len_flag), getPrime(len_flag), getPrime(len_flag)],
    [getPrime(len_flag),   getPrime(len_flag), getPrime(len_flag), getPrime(len_flag)],
    [getPrime(len_flag),   flag              ,getPrime(len_flag), getPrime(len_flag)]
]
A = matrix(P, A)  
B = A ** e  
print(f"e = {e}")
print(f"p = {p}")
print(f"B = {list(B)}".replace('(', '[').replace(')', ']'))
#e = 669415175238773
#p = 12118787160163689603203380599620963248704505538819538581978809382847430913581572206509491770004626171876014509066955154230416155158018819066993297252065743
#B = [[11908325511464516608339514638316309663822712734317058141729217418111356585187151862000825760749476215491153395093824562424818529815748933489033908997169070, 607697159260674910415476115300820730729148685978572463285636635678315259738776637322604230192108591665487225582979868061072386304387929039742933682548163, 9030032528485274540291246919905840166918544540740429270256525791062455967545663968398847024399647005905298627003334734978393573360851774196997484003450995, 796961889953217695780840364565319637277332935654217482844889929645059674078753249675226484727973784551642307214764578756545607193763944596433789093697742], [4399152459186028361918131517794053666976693112058310403077142517299944183628175444286754541003201855255236834699266748782224438451700383431674241519721100, 1054767543283909481356575929458293224896741180784170895967907239213716755311115635893044085340311500124401453199446795244541031477789466854887853717372097, 10120169605677188596105661330352776750112348033771791376862747425000731564523316937607634591572565248099349287563947768735862093902448042920083671252842159, 1720263817849116344133795082611556865451242977291587457175116082982239717304379628027207705161757075227003493696938164197107876416923649127783666086370536], [4097818842462786555528022698165927476427712158420259457372706662273469649412952728782779615667377310955651128203733491206793212065224475995167314509550300, 10390245229731271749034854000897753726201298988013541710754602533722646183756888205932503905533456850613316679305817551312318546909529083723643165192040274, 742994893671451598368395977289636085612116607972933284077605023132487670891728990002639563090866516637035352580310076426110130254774661522604972857257806, 149866033312652946006179843339845333211067415056280147315092072216577585082653261506701856928293625174192454973722674650896360370565209567363554164358251], [10466776908061913088324507140421351174391938162956583926697288912507048738902549965819895367976172349467707497560690889608618580989357140227333370764025632, 5941409393575043598445504217232563312419228659737762649503025814193497469015619180260403286358828247980712561721572251661264988510377314392901576504081866, 12100978920097950257449151310506433182580902664904989855296610941643670964694447417718156491835934159397838085629784653306129751031022964278508215626690875, 11178058169214805202678451971284464347440766999060257433157664592615333218917665270206106157167596941676740985652760010351339182998538033886518906155309383]]

也是一样的方法哦,熟练一下

import gmpy2
from sage.all import *
from Crypto.Util.number import *
e = 669415175238773
p = 12118787160163689603203380599620963248704505538819538581978809382847430913581572206509491770004626171876014509066955154230416155158018819066993297252065743
B = [[11908325511464516608339514638316309663822712734317058141729217418111356585187151862000825760749476215491153395093824562424818529815748933489033908997169070, 607697159260674910415476115300820730729148685978572463285636635678315259738776637322604230192108591665487225582979868061072386304387929039742933682548163, 9030032528485274540291246919905840166918544540740429270256525791062455967545663968398847024399647005905298627003334734978393573360851774196997484003450995, 796961889953217695780840364565319637277332935654217482844889929645059674078753249675226484727973784551642307214764578756545607193763944596433789093697742], [4399152459186028361918131517794053666976693112058310403077142517299944183628175444286754541003201855255236834699266748782224438451700383431674241519721100, 1054767543283909481356575929458293224896741180784170895967907239213716755311115635893044085340311500124401453199446795244541031477789466854887853717372097, 10120169605677188596105661330352776750112348033771791376862747425000731564523316937607634591572565248099349287563947768735862093902448042920083671252842159, 1720263817849116344133795082611556865451242977291587457175116082982239717304379628027207705161757075227003493696938164197107876416923649127783666086370536], [4097818842462786555528022698165927476427712158420259457372706662273469649412952728782779615667377310955651128203733491206793212065224475995167314509550300, 10390245229731271749034854000897753726201298988013541710754602533722646183756888205932503905533456850613316679305817551312318546909529083723643165192040274, 742994893671451598368395977289636085612116607972933284077605023132487670891728990002639563090866516637035352580310076426110130254774661522604972857257806, 149866033312652946006179843339845333211067415056280147315092072216577585082653261506701856928293625174192454973722674650896360370565209567363554164358251], [10466776908061913088324507140421351174391938162956583926697288912507048738902549965819895367976172349467707497560690889608618580989357140227333370764025632, 5941409393575043598445504217232563312419228659737762649503025814193497469015619180260403286358828247980712561721572251661264988510377314392901576504081866, 12100978920097950257449151310506433182580902664904989855296610941643670964694447417718156491835934159397838085629784653306129751031022964278508215626690875, 11178058169214805202678451971284464347440766999060257433157664592615333218917665270206106157167596941676740985652760010351339182998538033886518906155309383]]
B = Matrix(Zmod(p), B)
phi = (p**4-1)*(p**4-p)*(p**4-p**2)*(p**4-p**3)
d = gmpy2.invert(e, phi)
M=B**d%p
m = b''.join(long_to_bytes(int(y)) for x in M for y in x)
print(m)
b'......flag{Web_and_Pwn_i4_s@_d1ff1c0lt_4_Mirai_haN-^-!!!!@@@@####}............

也是玩爽了,暂时就写这么多吧。欢迎大佬来鞭策我这个菜的没边的ctfer...... (T^T)

posted @ 2025-05-31 14:39  Mirai_haN  阅读(114)  评论(0)    收藏  举报