cryptohack wp day(4)

Cryglz發表於2023-05-07

接上題

第五題(Modular Inverting)


在模運算中,如果我們要解決形如a * x ≡ b mod m的方程,其中a,b,m是已知整數,x是未知整數,我們可以使用擴充套件歐幾里得演算法來找到x的值。但是,如果m是一個質數,我們可以使用費馬小定理來計算a的逆元,即a關於模m的倒數。

具體來說,如果p是一個素數,a是p的倍數之外的任意整數,那麼a的逆元a^-1就是滿足下列等式的整數b:

a * b ≡ 1 mod p

這裡,b就是a在模p意義下的逆元。例如,假設我們要求解3在模13意義下的逆元,也就是找到一個整數b滿足3 * b ≡ 1 mod 13。根據費馬小定理,3^11 ≡ 1 mod 13,因此3的逆元就是3^10,即9。因為3 * 9 ≡ 1 mod 13。

綜上所述,如果我們知道一個數a在模p意義下的逆元b,那麼我們就可以用a * b ≡ 1 mod p來驗證b是不是a的逆元,也可以用a * b對p取模來計算a在模p意義下的倒數。
python程式碼如下:

def find_inverse(a, p):
    """
    使用費馬小定理計算a在模p意義下的逆元。
    """
    if gcd(a, p) != 1:
        raise ValueError("a和p必須互質")
    return pow(a, p-2, p)

def gcd(a, b):
    """
    使用歐幾里得演算法計算a和b的最大公因數。
    """
    if b == 0:
        return a
    else:
        return gcd(b, a % b)
print(find_inverse(3,13))

第六題(Quadratic Residues)

 在模組化算術中,模平方剩餘 (QR) 是一個整數,它與完全平方模某個整數模的整數全等。更正式地說,如果存在整數 x,則整數 a 是對整數 p 取模的二次留數,使得:

x^2 ≡ a (mod p)

如果這樣的整數 x 存在,我們說 a 是二次留數模 p 並寫成 a ≡ x^2 (mod p)。

如果不存在這樣的整數 x,則 a 稱為二次無餘數模 p。

所有二次留數模 p 的集合用 QR(p) 表示,所有二次模非平方剩餘 p 的集合用 QNR(p) 表示。

確定一個整數是二次剩餘還是非剩餘模給定素數 p 是數論中的一個重要問題,在密碼學、編碼理論和其他領域有各種應用。二次互易定律提供了一個強大的工具來確定二次留數和非留數模素數,以及計算勒讓德符號,勒讓德符號是一個相關的數學函式,可用於確定二次留數和非留數對任何奇數取模。
題目給了p = 29 , i n ts = [ 14 , 6 , 11 ],找到三個書中的QR的那一個,解出這個數的模平方根,小的一個根即flag.
上程式碼:

def quad_residue(x, p):
    """
    檢查 x 是否是有限域 F_p 中的二次留數。
如果 x 是二次剩餘,則返回 True,否則返回 False。
    """
    for a in range(1, p):
        if pow(a, 2, p) == x:
            return True
    return False

def solve_quad_residue(x, p):
    """
    在有限域 F_p 中求解方程 a^2 = x,其中 p 是質數模數。
返回兩個解的元組(如果存在),如果 x 不是二次殘差則返回 None。
    """
    if not quad_residue(x, p):
        return None
    solutions = []
    for a in range(1, p):
        if pow(a, 2, p) == x:
            solutions.append(a)
            solutions.append(p - a) # 新增負解
            break
    return tuple(solutions)


p = 29
ints = [14, 6, 11]
for x in ints:
    print(f"x = {x}")
    solutions = solve_quad_residue(x, p)
    if solutions:
        print(f"Solutions: {solutions}")
    else:
        print("Not a quadratic residue")

第七題(Legendre Symbol)

p = 101524035174539890485408575671085261788758965189060164484385690801466167356667036677932998889725476582421738788500738738503134356158197247473850273565349249573867251280253564698939768700489401960767007716413932851838937641880157263936985954881657889497583485535527613578457628399173971810541670838543309159139
ints = [25081841204695904475894082974192007718642931811040324543182130088804239047149283334700530600468528298920930150221871666297194395061462592781551275161695411167049544771049769000895119729307495913024360169904315078028798025169985966732789207320203861858234048872508633514498384390497048416012928086480326832803, 45471765180330439060504647480621449634904192839383897212809808339619841633826534856109999027962620381874878086991125854247108359699799913776917227058286090426484548349388138935504299609200377899052716663351188664096302672712078508601311725863678223874157861163196340391008634419348573975841578359355931590555, 17364140182001694956465593533200623738590196990236340894554145562517924989208719245429557645254953527658049246737589538280332010533027062477684237933221198639948938784244510469138826808187365678322547992099715229218615475923754896960363138890331502811292427146595752813297603265829581292183917027983351121325, 14388109104985808487337749876058284426747816961971581447380608277949200244660381570568531129775053684256071819837294436069133592772543582735985855506250660938574234958754211349215293281645205354069970790155237033436065434572020652955666855773232074749487007626050323967496732359278657193580493324467258802863, 4379499308310772821004090447650785095356643590411706358119239166662089428685562719233435615196994728767593223519226235062647670077854687031681041462632566890129595506430188602238753450337691441293042716909901692570971955078924699306873191983953501093343423248482960643055943413031768521782634679536276233318, 85256449776780591202928235662805033201684571648990042997557084658000067050672130152734911919581661523957075992761662315262685030115255938352540032297113615687815976039390537716707854569980516690246592112936796917504034711418465442893323439490171095447109457355598873230115172636184525449905022174536414781771, 50576597458517451578431293746926099486388286246142012476814190030935689430726042810458344828563913001012415702876199708216875020997112089693759638454900092580746638631062117961876611545851157613835724635005253792316142379239047654392970415343694657580353333217547079551304961116837545648785312490665576832987, 96868738830341112368094632337476840272563704408573054404213766500407517251810212494515862176356916912627172280446141202661640191237336568731069327906100896178776245311689857997012187599140875912026589672629935267844696976980890380730867520071059572350667913710344648377601017758188404474812654737363275994871, 4881261656846638800623549662943393234361061827128610120046315649707078244180313661063004390750821317096754282796876479695558644108492317407662131441224257537276274962372021273583478509416358764706098471849536036184924640593888902859441388472856822541452041181244337124767666161645827145408781917658423571721, 18237936726367556664171427575475596460727369368246286138804284742124256700367133250078608537129877968287885457417957868580553371999414227484737603688992620953200143688061024092623556471053006464123205133894607923801371986027458274343737860395496260538663183193877539815179246700525865152165600985105257601565]

考察二次剩餘定理
二次剩餘定理表述如下:如果p和q是兩個不同的奇素數,則二次剩餘x mod p可以透過奇偶性以及符號確定它是否是二次剩餘mod q,具體來說:

如果p和q都是形如4k+1的素數,或者都是形如4k+3的素數,則x mod p是二次剩餘mod q當且僅當q mod p是二次剩餘mod p。
如果p是形如4k+1的素數,q是形如4k+3的素數,則x mod p是二次剩餘mod q當且僅當q mod p是二次非剩餘mod p。
如果p是形如4k+3的素數,q是形如4k+1的素數,則x mod p是二次剩餘mod q當且僅當q mod p是二次剩餘mod p。
二次剩餘
x^2≡n(mod p)
對於這個方程,求出滿足的x.

想要更好了解,推薦下:[(https://blog.csdn.net/weixin_44203780/article/details/104634637)]
再看這道題,直接上程式碼:

p = 101524035174539890485408575671085261788758965189060164484385690801466167356667036677932998889725476582421738788500738738503134356158197247473850273565349249573867251280253564698939768700489401960767007716413932851838937641880157263936985954881657889497583485535527613578457628399173971810541670838543309159139
ints = [25081841204695904475894082974192007718642931811040324543182130088804239047149283334700530600468528298920930150221871666297194395061462592781551275161695411167049544771049769000895119729307495913024360169904315078028798025169985966732789207320203861858234048872508633514498384390497048416012928086480326832803, 45471765180330439060504647480621449634904192839383897212809808339619841633826534856109999027962620381874878086991125854247108359699799913776917227058286090426484548349388138935504299609200377899052716663351188664096302672712078508601311725863678223874157861163196340391008634419348573975841578359355931590555, 17364140182001694956465593533200623738590196990236340894554145562517924989208719245429557645254953527658049246737589538280332010533027062477684237933221198639948938784244510469138826808187365678322547992099715229218615475923754896960363138890331502811292427146595752813297603265829581292183917027983351121325, 14388109104985808487337749876058284426747816961971581447380608277949200244660381570568531129775053684256071819837294436069133592772543582735985855506250660938574234958754211349215293281645205354069970790155237033436065434572020652955666855773232074749487007626050323967496732359278657193580493324467258802863, 4379499308310772821004090447650785095356643590411706358119239166662089428685562719233435615196994728767593223519226235062647670077854687031681041462632566890129595506430188602238753450337691441293042716909901692570971955078924699306873191983953501093343423248482960643055943413031768521782634679536276233318, 85256449776780591202928235662805033201684571648990042997557084658000067050672130152734911919581661523957075992761662315262685030115255938352540032297113615687815976039390537716707854569980516690246592112936796917504034711418465442893323439490171095447109457355598873230115172636184525449905022174536414781771, 50576597458517451578431293746926099486388286246142012476814190030935689430726042810458344828563913001012415702876199708216875020997112089693759638454900092580746638631062117961876611545851157613835724635005253792316142379239047654392970415343694657580353333217547079551304961116837545648785312490665576832987, 96868738830341112368094632337476840272563704408573054404213766500407517251810212494515862176356916912627172280446141202661640191237336568731069327906100896178776245311689857997012187599140875912026589672629935267844696976980890380730867520071059572350667913710344648377601017758188404474812654737363275994871, 4881261656846638800623549662943393234361061827128610120046315649707078244180313661063004390750821317096754282796876479695558644108492317407662131441224257537276274962372021273583478509416358764706098471849536036184924640593888902859441388472856822541452041181244337124767666161645827145408781917658423571721, 18237936726367556664171427575475596460727369368246286138804284742124256700367133250078608537129877968287885457417957868580553371999414227484737603688992620953200143688061024092623556471053006464123205133894607923801371986027458274343737860395496260538663183193877539815179246700525865152165600985105257601565]

solution = []
for a in ints:
    result = pow(a,(p-1)//2,p)
    if result == 1:
        solution.append(ints.index(a))
        print(solution)
        flag = pow(a,(p+1)//4,p)
        print("flag=",flag)