ctfshow密码挑战

花两天时间把密码挑战做了一下,题目真的很不错,但是还是太菜了,一部分没能做出来,下面对一部分进行记录

真·Beginner

assert(len(open('flag.txt', 'rb').read()) <= 50)
assert(str(int.from_bytes(open('flag.txt', 'rb').read(), byteorder='big') << 10000).endswith('1002773875431658367671665822006771085816631054109509173556585546508965236428620487083647585179992085437922318783218149808537210712780660412301729655917441546549321914516504576'))

同余式变形,将等式两边消去公约数使得2的幂次可逆即可

import gmpy2
from Crypto.Util.number import long_to_bytes
b=1002773875431658367671665822006771085816631054109509173556585546508965236428620487083647585179992085437922318783218149808537210712780660412301729655917441546549321914516504576
a=pow(2,175)
b=b//a
n=pow(5,175)
m=gmpy2.invert(pow(2,9825,n),n)*b%n
print(long_to_bytes(m))

真·guessguess

from random import shuffle
from secret import secret_msg

ALPHABET = '0123456789abcdef'

class Cipher:
    def __init__(self, key):
        self.key = key
        self.n = len(self.key)
        self.s = 7

    def add(self, num1, num2):
        res = 0
        for i in range(4):
            res += (((num1 & 1) + (num2 & 1)) % 2) << i
            num1 >>= 1
            num2 >>= 1
        return res

    def encrypt(self, msg):
        key = self.key
        s = self.s
        ciphertext = ''
        for m_i in msg:
            c_i = key[self.add(key.index(m_i), s)]
            ciphertext += c_i
            s = key.index(m_i)
        return ciphertext

plaintext = b'The secret message is:'.hex() + secret_msg.hex()

key = list(ALPHABET)
shuffle(key)

cipher = Cipher(key)
ciphertext = cipher.encrypt(plaintext)
print(ciphertext)

# output:
# 85677bc8302bb20f3be728f99be0002ee88bc8fdc045b80e1dd22bc8fcc0034dd809e8f77023fbc83cd02ec8fbb11cc02cdbb62837677bc8f2277eeaaaabb1188bc998087bef3bcf40683cd02eef48f44aaee805b8045453a546815639e6592c173e4994e044a9084ea4000049e1e7e9873fc90ab9e1d4437fc9836aa80423cc2198882a

add函数即异或,需要根据已知的明密文信息解一系列的异或方程

太菜了,不会做呀,😢

问了学长,可以用z3解,不得不说z3确实高级,有时间学习一下

https://ericpony.github.io/z3py-tutorial/guide-examples.htm

C='85677bc8302bb20f3be728f99be0002ee88bc8fdc045'
M=b'The secret message is:'.hex()
lines=[]
for i in range(1,len(M)): 
     l=[int(M[i],16),int(C[i],16),int(M[i-1],16)] 
     l.sort()
     a,b,c=l 
     lines.append(f"g[{a}]^g[{b}]^g[{c}]==0")

lines=set(lines)

from z3 import *
g=[BitVec(f"g{i}",4) for i in range(16)]
s=Solver()

for i in lines:
    s.add(eval(i))

for i in range(16):
    for j in range(i+1,16):
        s.add(g[i]!=g[j])

s.add(g[4]==0)
s.add(g[5]^g[8]==7)

ans_key=[]
while(s.check()==sat):
    m=s.model()
    cond=[]
    key=[0]*16
    for d in m.decls():
        #exec(f"key[{int(d.name()[1:])}]={m[d]}")
        exec(f"key[{m[d]}]={int(d.name()[1:])}")

        cond.append(eval(f"g[{int(d.name()[1:])}]!={m[g[int(d.name()[1:])]]}"))
    ans_key.append("".join([hex(i)[2:] for i in key]))    
    s.add(Or(cond))

print(len(ans_key))    
print(ans_key[0])



from random import shuffle
#from secret import secret_msg

ALPHABET = '0123456789abcdef'

class Cipher:
    def __init__(self, key):
        self.key = key
        self.n = len(self.key)
        self.s = 7

    def add(self, num1, num2):
        res = 0
        for i in range(4):
            res += (((num1 & 1) + (num2 & 1)) % 2) << i
            num1 >>= 1
            num2 >>= 1
        return res

    def encrypt(self, msg):
        key = self.key
        s = self.s
        ciphertext = ''
        for m_i in msg:
            c_i = key[self.add(key.index(m_i), s)]
            ciphertext += c_i
            s = key.index(m_i)
        return ciphertext

    def decrypt(self, c):
        key = self.key
        s = self.s
        msg = ''
        for c_i in c:
            m_i = key[self.add(key.index(c_i), s)]
            msg += m_i
            s = key.index(m_i)
        return msg


plaintext = b'The secret message is:'.hex() #+ secret_msg.hex()

from Crypto.Util.number import *
C1="85677bc8302bb20f3be728f99be0002ee88bc8fdc045b80e1dd22bc8fcc0034dd809e8f77023fbc83cd02ec8fbb11cc02cdbb62837677bc8f2277eeaaaabb1188bc998087bef3bcf40683cd02eef48f44aaee805b8045453a546815639e6592c173e4994e044a9084ea4000049e1e7e9873fc90ab9e1d4437fc9836aa80423cc2198882a"
i=1
for key in ans_key:
    cipher = Cipher(key)
    ciphertext = cipher.encrypt(plaintext)
    if ciphertext == C:
        print(key)
        print(ciphertext)
        print(C)
        print(i)
        i+=1
    print(long_to_bytes(int(cipher.decrypt(C1),16)))

Lousy RSA

from Crypto.Util.number import bytes_to_long, getStrongPrime
from math import gcd
from Crypto.Random import get_random_bytes

def encrypt(number):
    return pow(number,e,N)

def lousy_encrypt(a,m):
    return encrypt(pow(a,3,N)+(m << 24))

flag = open('flag.txt','r').read().encode()
out = open('output.txt','w')
e = 3
p = getStrongPrime(512)
q = getStrongPrime(512)

while (gcd(e,(p-1)*(q-1)) != 1):
    p = getStrongPrime(512)
    q = getStrongPrime(512)

N = p * q

out.write("N : " + str(N) + "\n")
out.write("e : " + str(e) + "\n")

r = bytes_to_long(get_random_bytes(64))

ct = []
ct.append(encrypt(r << 24))

for c in flag:
    ct.append(lousy_encrypt(c,r))

out.write(str(ct))

我们已知了

(r<<24)3 mod(n)

由于flag的前几位形式已知我们可以知道(p+r<<24)3 mod(n) 其中p是已知的

这里我们采取相关信息攻击求出r<<24,接下来就对每一个密文爆破flag每位的ascii码即可

c1=149900171835862374060335887491153377541027184249474956689195735955230966523493926129315141881804062755664031730255840080025135704363451053539051167747450666906965139532043093921747831846368512305949114161644765284651683995613003391114428881271222944854143265104835808089774097565659965277118965172611893264866
c2=134295821310962030082713568128602827084237469791883537614829493295739934437473108540870522651247035963182837101610762570886149119801415188502333747437834012469622932977269917310179263301661686154112155505918138582133349062393820175487702027177570479181982215961233950080183468338948906570739038118522934788376
n=158536846238275423914947481073113424533526180656717405309161196281232207528203815364797958517001734023930982062439351810143667702212867792366070388790029407710773769461508513539133495089105658332125241506530159552827074642113147970816573262372244977534828829844706959484184601345468559454909507952204147341221

def related_message_attack(c1, c2,n):
    PRx.<x> = PolynomialRing(Zmod(n))
    g1 = x^3- c1
    g2 = (x+99^3)^3- c2
    def gcd(g1, g2):
        while g2:
            g1, g2 = g2, g1 % g2
        return g1.monic()
    return -gcd(g1, g2)[0]
print(related_message_attack(c1,c2,n))


c=[149900171835862374060335887491153377541027184249474956689195735955230966523493926129315141881804062755664031730255840080025135704363451053539051167747450666906965139532043093921747831846368512305949114161644765284651683995613003391114428881271222944854143265104835808089774097565659965277118965172611893264866, 134295821310962030082713568128602827084237469791883537614829493295739934437473108540870522651247035963182837101610762570886149119801415188502333747437834012469622932977269917310179263301661686154112155505918138582133349062393820175487702027177570479181982215961233950080183468338948906570739038118522934788376, 89946656314991762517113663760010842536634820660256483891273278001330132742448132913348082523673705245952871380740934793963352616422259519097362568028142489834916726476659893620632902551339750249449411867616672760093475985040007802862410682420623532093744163084333038376931023457136027245094687628215049156151, 70622547140344018389438010141382045823703836817518978589502328284958764735039341195386095905663265408719223239597580747141346555123611381062841110942222258205947383347776806741162218955044217009679443625001399881470133767355773348121141392721244912689176124659010632807048563405088941355310092590756067266828, 110471857553293427054691319962013754323537325843687522669633931865106544004916233779087908386105726477307185514378864807242922270149021469683547221455942745513297146046564317236536007696913964851988102791832846647924807728986996466237466028579586987240227183777626081312887338401564175880155416699453353169115, 98770588648389348916377759493831369269119004469055817119383418137174337899419904541979632155668334461520966354997012528080118258684994721455216781874779836697729355893996055465782708143227803694720626457109104508283521502360090868796197895133053734631389077999180682367884640066118061318955177992496315327399, 66568133067051437765933652482336779410912889169992057343327951707089723188620165878330471121701739579319697864854836695250261808395826845182201323839761407289397754689093155787365326525379915711935927484704891065486398670873522909673436132136861344629926020085506653501768301801782079530878703409358559604328, 37221643880890900149924233455711131534367754076604645612205285502262515236770528185929495972034329989130181567423087216152202095338296766603545879777946458296945357975386519866709110050591686144615786791900962194789259969787872906606153655312416698848995995703077125919188318955170375788599218123925821936941, 152923358580082051104580951446095016515023431381772146388662279202851578584253408778019384032630929435134886003665199004325855287890953399107316080788101986604110644202466914500718852063214849595233786274698252598194324557331795165230448744859589112738893184777739962562044980260530578090200254997244968580761, 134295821310962030082713568128602827084237469791883537614829493295739934437473108540870522651247035963182837101610762570886149119801415188502333747437834012469622932977269917310179263301661686154112155505918138582133349062393820175487702027177570479181982215961233950080183468338948906570739038118522934788376, 48939144535524955087281679080274886466317684276131180122230682194044208254393564978047732940775432870928630669675460778367632016199100378410749103676106881931616292777476161939584039643887308252754836980848959135402173881943604173054928742981116754102519818899696759807754360952317920927845901337284102444746, 100841320683694122294948295593706734996410545419158546430863623302068950877162147516705977804450196507449026564572344794412097961726622385808466245711334290575123358815657999032863152641643742592701912819905627970937026747760911979535252260980793267533412585107673876432152197173846598018864425862180183182507, 100356257189353723622736782554153604942980220656301108099443760926138889417886149171374521505536029581313185153313719710878745135155254113078020082859479434142748165133071539351138029384493238887847685956053797935009283233613243654431518336259007137473119539963127716833753815101862150324745720490563173339569, 24003675551048405284848419042259658717509344054056958315368302658477704219006637392122077311539155782950186190460524774873973332149071981551730653474787714411299727188175949687016291293476191109402331193086057316699958663423338750470031727786989667121326404554122821270438173955064889063351577022696318420665, 101435621188171996071868352313593941946774706774234979788474272083876987442301513828856455234511150788292000614760958780158163212415736236758734890647701041796019016542252383008686710454637696074474027363602947069224154513533200893782630842801408007195821472040227715130018788123393252942116184603662784485704, 134295821310962030082713568128602827084237469791883537614829493295739934437473108540870522651247035963182837101610762570886149119801415188502333747437834012469622932977269917310179263301661686154112155505918138582133349062393820175487702027177570479181982215961233950080183468338948906570739038118522934788376, 121163398067418296253833357950660610977509274356674373903261422208934085541686761606881190997100306728285553823776505639600171018599190567259300238444528126588109782961583239725156359020857798435744293608811423918055204453470271288375677471445144882153261488568137157816893472694473887164450106934028318484406, 30514731120982424644106889607831732841335498932157782654360751243843840705556751516463484229173450409494368642054793513019422444963756368032878732433047540716823302740080623755351411099896669175609035727495224646337204261791310406159276837965162287502306456689625443192539629343182408536892265334916055000026, 70622547140344018389438010141382045823703836817518978589502328284958764735039341195386095905663265408719223239597580747141346555123611381062841110942222258205947383347776806741162218955044217009679443625001399881470133767355773348121141392721244912689176124659010632807048563405088941355310092590756067266828, 3366377825051140683773772774814288193290722210151622161046183585546582934232355536127492017131455685812617098713065546155378702858680741657231013237953612429832683693016454323453261429129612432744052370496733462799725511292391947776064452314092261050806663977798446618004749134330124945123235494014964093505, 109819401782918730835954876976895040329963785922788645170030432672915028655724847334663802692854917898083403138595753385941343978916444510623980816914944081580073173302604829072881507874087124676287938310414869111425402501539538364077248888076493536233398721451452742604813854742524943529096870205907752348188, 3366377825051140683773772774814288193290722210151622161046183585546582934232355536127492017131455685812617098713065546155378702858680741657231013237953612429832683693016454323453261429129612432744052370496733462799725511292391947776064452314092261050806663977798446618004749134330124945123235494014964093505, 30514731120982424644106889607831732841335498932157782654360751243843840705556751516463484229173450409494368642054793513019422444963756368032878732433047540716823302740080623755351411099896669175609035727495224646337204261791310406159276837965162287502306456689625443192539629343182408536892265334916055000026, 123691868157643817927972686357348948440347889194832888579324046692819862004459196510298458351411879965904775800543567659764050060877035500556808058005612210712944751471136850876181162175774964682307651839772682384895881229223421515447883281046067342423456318011976678666063077622141478742996192262079137068838, 48939144535524955087281679080274886466317684276131180122230682194044208254393564978047732940775432870928630669675460778367632016199100378410749103676106881931616292777476161939584039643887308252754836980848959135402173881943604173054928742981116754102519818899696759807754360952317920927845901337284102444746, 101435621188171996071868352313593941946774706774234979788474272083876987442301513828856455234511150788292000614760958780158163212415736236758734890647701041796019016542252383008686710454637696074474027363602947069224154513533200893782630842801408007195821472040227715130018788123393252942116184603662784485704, 30527028666174894662833445025729694941904360362281979621692935426442023311858035718389403071533817781943052337900723601921185742574012237358531961703428747865432843975315406219692048996762793563498667635017253522627701131088913055467046990836774092755553893402768748385087686429270454990623907916270511207056, 30514731120982424644106889607831732841335498932157782654360751243843840705556751516463484229173450409494368642054793513019422444963756368032878732433047540716823302740080623755351411099896669175609035727495224646337204261791310406159276837965162287502306456689625443192539629343182408536892265334916055000026, 30527028666174894662833445025729694941904360362281979621692935426442023311858035718389403071533817781943052337900723601921185742574012237358531961703428747865432843975315406219692048996762793563498667635017253522627701131088913055467046990836774092755553893402768748385087686429270454990623907916270511207056, 134295821310962030082713568128602827084237469791883537614829493295739934437473108540870522651247035963182837101610762570886149119801415188502333747437834012469622932977269917310179263301661686154112155505918138582133349062393820175487702027177570479181982215961233950080183468338948906570739038118522934788376, 101435621188171996071868352313593941946774706774234979788474272083876987442301513828856455234511150788292000614760958780158163212415736236758734890647701041796019016542252383008686710454637696074474027363602947069224154513533200893782630842801408007195821472040227715130018788123393252942116184603662784485704, 101435621188171996071868352313593941946774706774234979788474272083876987442301513828856455234511150788292000614760958780158163212415736236758734890647701041796019016542252383008686710454637696074474027363602947069224154513533200893782630842801408007195821472040227715130018788123393252942116184603662784485704, 30514731120982424644106889607831732841335498932157782654360751243843840705556751516463484229173450409494368642054793513019422444963756368032878732433047540716823302740080623755351411099896669175609035727495224646337204261791310406159276837965162287502306456689625443192539629343182408536892265334916055000026, 47453554410065410281385701380945329975782034635362758101660789729776095964464512669350946286366834837271436771806547511769587920304516865697944753284242262404736988792245421938312567939640666986097890888018384613859730699201948480848139929739863205440845661524156240492546643969050416768704341790617501030864, 101435621188171996071868352313593941946774706774234979788474272083876987442301513828856455234511150788292000614760958780158163212415736236758734890647701041796019016542252383008686710454637696074474027363602947069224154513533200893782630842801408007195821472040227715130018788123393252942116184603662784485704, 123011463620863783403471803975056119686696890620164394534722147557753039692277695273591369703314909528178182374858258584699091942956316722254354495461054660847674281017397484357535280281435953019402765563162274623318625149417940332966888214884001277602673098613024606953842263062323090154771331588094577904643, 134295821310962030082713568128602827084237469791883537614829493295739934437473108540870522651247035963182837101610762570886149119801415188502333747437834012469622932977269917310179263301661686154112155505918138582133349062393820175487702027177570479181982215961233950080183468338948906570739038118522934788376, 123691868157643817927972686357348948440347889194832888579324046692819862004459196510298458351411879965904775800543567659764050060877035500556808058005612210712944751471136850876181162175774964682307651839772682384895881229223421515447883281046067342423456318011976678666063077622141478742996192262079137068838, 101435621188171996071868352313593941946774706774234979788474272083876987442301513828856455234511150788292000614760958780158163212415736236758734890647701041796019016542252383008686710454637696074474027363602947069224154513533200893782630842801408007195821472040227715130018788123393252942116184603662784485704, 121163398067418296253833357950660610977509274356674373903261422208934085541686761606881190997100306728285553823776505639600171018599190567259300238444528126588109782961583239725156359020857798435744293608811423918055204453470271288375677471445144882153261488568137157816893472694473887164450106934028318484406, 30527028666174894662833445025729694941904360362281979621692935426442023311858035718389403071533817781943052337900723601921185742574012237358531961703428747865432843975315406219692048996762793563498667635017253522627701131088913055467046990836774092755553893402768748385087686429270454990623907916270511207056, 3366377825051140683773772774814288193290722210151622161046183585546582934232355536127492017131455685812617098713065546155378702858680741657231013237953612429832683693016454323453261429129612432744052370496733462799725511292391947776064452314092261050806663977798446618004749134330124945123235494014964093505, 30527028666174894662833445025729694941904360362281979621692935426442023311858035718389403071533817781943052337900723601921185742574012237358531961703428747865432843975315406219692048996762793563498667635017253522627701131088913055467046990836774092755553893402768748385087686429270454990623907916270511207056, 3366377825051140683773772774814288193290722210151622161046183585546582934232355536127492017131455685812617098713065546155378702858680741657231013237953612429832683693016454323453261429129612432744052370496733462799725511292391947776064452314092261050806663977798446618004749134330124945123235494014964093505, 70622547140344018389438010141382045823703836817518978589502328284958764735039341195386095905663265408719223239597580747141346555123611381062841110942222258205947383347776806741162218955044217009679443625001399881470133767355773348121141392721244912689176124659010632807048563405088941355310092590756067266828, 149392555892203769543002657610777009611972871715239993400685004730254078260834571706374172295597041011662779644378174901788972701224833722011876070130358461683879882424977940586298128828641095021895176008360732409385191281441335155729189395005367414282489769031561273372764500517747749648674269713599868054302, 38766851018238054893836148225050699150041924010543781005512493157270250737092795599650145568625845223627676111274384611357648878996241461431119066828314261254323489659948068587548835094721422770308674264768301479261894567754200931640542789756384350903986277797377336771213742108830808558616678915888355829941]
a=149900171835862374060335887491153377541027184249474956689195735955230966523493926129315141881804062755664031730255840080025135704363451053539051167747450666906965139532043093921747831846368512305949114161644765284651683995613003391114428881271222944854143265104835808089774097565659965277118965172611893264866
n=158536846238275423914947481073113424533526180656717405309161196281232207528203815364797958517001734023930982062439351810143667702212867792366070388790029407710773769461508513539133495089105658332125241506530159552827074642113147970816573262372244977534828829844706959484184601345468559454909507952204147341221
rr=90143437414860926746251171418854569943500370026543665569987896435319868139472335066669222299285602019092190258415215823718079551568000292753926777099260992159744
m=[]
for i in range(1,len(c)):
    for j in range(127):
        if pow(pow(j,3)+rr,3,n)==c[i]:
            m.append(j)
print(bytes(m))

Not That Right Use

from Crypto.Util.number import *
from secret import flag
import gmpy2
import random

length_bit = 8192
def generate_key(length_bit = 8192):
	q = getPrime(length_bit)
	f = random.getrandbits(length_bit//2)
	while True:
		g = random.getrandbits(length_bit*3//8)
		if gmpy2.gcd(f,g) == 1:
			break
	h = gmpy2.invert(f, q)*g % q
	return h,q,f,g

def encrypt(m,h,q):
	m = bytes_to_long(m)
	r = random.getrandbits(length_bit//2)
	enc = (r*h + m) % q
	return long_to_bytes(enc)

def decrypt(enc,f,g,h,q):
	a = f*enc % q
	b = gmpy2.invert(f,g)*a % g
	return long_to_bytes(b)

h,q,f,g = generate_key()
pub = open("pub.key","w")
pub.write(str(h)+"\n")
pub.write(str(q))
pub.close()

enc = open("enc","wb")
enc.write(encrypt(flag,h,q))
enc.close()

经典NTRU了,构造一个相应的格,规约后即为f,g(一般这数据是设计好的,也可以根据bit长度估计一下最短向量的长度,心里有个底)

import gmpy2
h = 140641654480309646661460752259009805238822983063359975743381261932998899184657124924009078027641660038632664812668296524565206464727520596895026388236060597071386726013858963646501909196012396523837136988240197784437301120862384415682149940533848605250394303113175634035415167283080872735105912832870108712880945146080491825953020939705109174820916829051689692620946211242161384869371254560708250183882247373951211750966153182266054977202080568980091991771341013245919227004891065056914748466875350300140600531409616529059949886077689971297827093124675618542008989955575344877827824040946659512030038751389893253831481412516711878799875665224067139882771597407869970351450430459419948729296146331395877370686156516399740856252014616811497494914814385899755904538139847880089751542568309978231883094168561891730860752672873293261989147250409991608262872830092259084716940417114648971958597960369718849774615105540721662399447525067048358560864789407380815740563275439433805528298375095604942955338684305941359986487934315953665121858289306142097815651312478757549908167872661314913947544946927600211726850023950066392630122882839485809938848969950265325406399686586314459280991301825054645472425674527422929972887391753238816923298623579429710609368219213051797207053195961056438004296815009848196702292268936140424621874190909040512919014723673109665119192714879264861148038121817069654007213479519085780137202965768316745672909214544256962033590044776596987318613883438618931569568770820849164854311957684349997002160055168894414227617344006000575498315925335544219161846832480926999315432632883472713932971843620942616934646926067124395446944817779007843821815929039660037988200894593303504735755586137601186627884346462317235217848459593022989695194335576580395608745533282003408295857616739627596114657034449337931786787816708834202430301485318191988716906057312812712966166482682666772164391035856970600473354659224228523748418482322369646074712031322484015675331188701826840899169239647159728457797185599341417975052131005330363975351239128277681330549494029848264189699117329464205714708985625181438636031578843174246581394478846033426716126183473299468283652853483151156325335551346299229916621899845783802680366480774960939565022117840145287070125249514544755884841252084725187489065017117288468998533234739167462719883594746485521270177090828004405816695890424237068837967556932724183111259469809936198958551342439901421853536441105951848942732141671755288
q = 721062963295306780224288865760990406705513413320561732579234627711939010604916641502092203177136835588541554259063811291724295326953780525988898494239189350240494500021294136439018702342345820168271819324239839692861840016935631311071537166467243301000506704801343901587217940601797154207151921328887191874341607566625648510662958547199740852292999143208619354521973490573519876933142879407979683083573289638308100864165321388700902121078266071026038820486271316744664851483993423823069500303784383402304857035906448474159407085076020845226366206779141953496917489352476217054101214862066665066280950745072263325003643813350410844887077930774020933179459662916264650762216248605817745559194567515555850407282821340092531175262602702689180998414973022172701379180086212961061419818399053186026560842353748858519340974555352846705106500626664423314580198973011348673520120756781149651665967392752894792766334085124576134896850861070432338086277928670454001217670204592159022929789345510699644329966648502723120607881524783034562999715359179899943667274544446186555535385342026523507272796317613533963130150740855860225218332454607928768586519196388270192942980483940301171902740523758767325732435445754037509355869523812180653852667149772589024163493166632487347370811001485499960660824873526525919202671251942237597925764302445772724119412342705274451132940388410843886761306608395515200717447949626428049390906934269615447989583695806837918559467964483511193999073458761627082013487166837347281447834645376827978448760118048190148555572650537226385951360112553300387850015554277302469446739321719203700104354051152513702957057612668569467778263927730960518541792141873558358570677673100354450667297984686325175580976679505813813087110507883692083480127292287072406007262614228999824198116147220636799150068583032192358361413551877727766941745214486818182944108269772327140216300601094319506495541728100804461508755639873982377181607116052192238012365235618004165882010754149050486945338325383652930339212117826439488162732673179327060653649674194138447978815851287502201747481323578543139551676130822000071019318961666705089853728546154158421964235939702012776690925139910891383388310243996693561285917954515846454468095240887216321982651836906224349855624967761406539747280802571696734421390708879090880910004109042791548443392008271506467298812179909867611515314534888779065371104453531718962387778109331723060221708419208865118130890948962620930751351862376780409
c=588529356965030272025601048861282065021017902423164264957441586920595872039895404577255060274952541620315018969680195236465977272648652287926496543780173650574305499297716276827858805927298162208072303645283316405452651523836300258701988005355462277459875749978643895956961980467177804300387767414485993724320752395808791573881273230913748801373284405366594883666020631291276729848223537472276347125889834098129339716781471747034001410355814674928405649297961406796494833489565097910117203986219593353105481771936122718520536309366303961744867901990013705583165049702866175649386129367497873297054880401873031133188695262882654806285250254062236029461999697492837693504031022413406804330735094841148426551764288094879463057233019026422469014402428741654099663670413177889700803143516686274186664290312914022712001020975681794284476755306982329761414416554633826317934023660554506240542417335582689320936413929582635040851938378673355395047591192878234906774517888492511273362194115721382787428142413514396337877140039660775671326039060700550442211666812163244332762784047751975372230479416550318062822478588883067886438254695396783950270796813646987304649115877778929479117735381509546765888903982084857084146199858327966366481894960817384939327571190145773428855235037692518669027348557875061654802806227997673990112539114617853746089796693008271617776258890685231202093199769390648648724394621369070381058697619434434832764604338681140468898430273958259274423206535125100012671267337454233857407519190779123591857743660990034703847602695635498882322688596411189459783776748556641094779989138912494831839398857272788856710386704790450677690265116557152577245683557633429067370300903617226202997324638833015986591267108399829799306550735742117392415154266621030491837810396414282733584581932559949197413360798641627400507259389841455683789600794101460317701439910041563732131818865623789707908194392983359341050463836331965882104965958953776930066271528305080002935616971821352074253274211712644496549129601236468590933739942097889191987452132024182362123132201878709183393780456917565933067892953248097550146353078515168723528393603206246180698646597545792807716410931432281068936474760372741067644411320258900899808020539775178893382637068507862640029652464833884426244030678683387274373604759929344023706613753521672136720742565422001830029817188207010482846041392439542661849175431101244019020590777117194607762930230409875058098534619014803651392511587270579935
M = Matrix([[1, h], [0, q]])
fg = M.LLL()[0]
f, g = fg[0], fg[1]
def decry(c,f,g,q):
    a=c*f%q
    m=a*gmpy2.invert(f,g)%g
    print(m)
decry(c,f,g,q)

so Damn big e?

n1 = 0x7e503bdb2d037da083601c2945b668bbad980789cb4671b20fee013295319cc43a5b4defca704474c793fa2bd86eacd5552da0f0dc37a42eafd379d9216c0f3a1687ca42c5aa40500435374495fa0ebce37340bf6f98046c58443497457e4e442206a322ecfb60ee846f7aeb1e72f6804609a194ba9e28d6449a0e06d214525ce043afffd96eb9cb8e09b16722153ba5198bce185b5ad24b845b39a0940e5b9a7ad896c3e472b5d49cdb5956b91ef069d81fe399fcf5f3f02f465896bbf4ecbde7ba9cda0c510f14ba2b0673173c7916c284bf7a63613225ece3563a6d843ef06d731d0404646b97a4bc4a3ec4e77751d3c5fd280bf8b0277ae1cade8b1fbdf9
e1 = 0x45a1ee446ca0df0720f77b576f8c197a5033f5cefec5bc8a2ddd9da021ff389d8991e1822abbe9efe60204094c252195f6a4c898ce4f4ee0ef726bd0fcfe7741749bd9cc1cbbec83cc133743d4c746c2736da2452bfeaea1d031f10719f33fa4ef3b8878951b2b70cead75a608d883968a17cd04f19eb3a58e5d55e01790658248a0a26404131a070d3b3c9cb4a1d9d98eadc392199300fbf5ee472296e36dccef2e796b9b51e6693767d40336875ab62c41231ea9fb90bcad4df203b4459abb8d0e402de474cd802e2bfbc01d3b2d55f96b44ceec56ad6c4f3809cfa30b102bc5edc1607c613734571e1dbdb13ace896d1931a53fc9088ead61d78bc30fe78d
c1 = 0x5b4331a4de52d57c7ff77ae03a75b96629c76509d0fd003c27966ca0bd8a7e1a835eee6fe9b02afe78507b43e9efdb9c13f7cbdacd5d18d45ca98ab5538fbf6500a9b314e7e260bab673ae8a38c41b056bea895953ad7257cf30b9a1ba598a1ef01b251964feb2a63e09d8b699a14f1bf3d464809dab3c514fe7c6f59be9c434a694215ebafe547035323f90a661b9c5c73208ef0cbc21c0e9abbdaa65cc4bbaf8c2c47841aefcabd89bbaa3a6f2a9df6d3d8a0eedbec7c28c94fb369b426449b7d6ec5daed4d07df92d057e02cacbfdda0c94afce396dda307c8cc6ecd51c084fa2cfe3a31edde97018ba0de31b8cdeabe34f51ceebdf8834340605d5d71279
n2 = 0x878717447ff85bff1c360384309b5731edffd0ade56117d3b8b72b2ab9296633437e3f5fb09c57e8658c1dc1de5d7a9ba003923d3e9d8e124afe71c6fd0c9985988961198c5c21ed46dfad45399ec9d4c6a6a0ca793e5c721333db2ceed863bc919544024a2a630e9788e9f5afadbd3a291bbda804ed70c6e9b9a599cb3a4d14ed9325000c19d988a79af2e44ff1e14766a0465837125107a9c2cf7a76980d6f86aaf9f926ea0e46d641d3478112de0824bf9c5e726a7d5b7c92cbc1906d3d778e9a612290e043e2b3afd4f0a806254640772fd25980b009b4136d685e52725482ac61e1b679d13eb0d2b06df080fffc677a1b9afbcf327fba6a3ed8fbc7e22d
e2 = 0x837ebb33e9bbb4a5662d484099db6a435c68d630acdfe317aed1a089fcb9deb4df3c328a36c8f1f14045374e8cd4a75e6480bc04489fbf86a1d324b6c2c31ce11dd50d6cb75f9be5b01d2b756aac22f3c7c17f42b47b9bba52575912faa482214158c935ea1d943d62f2a5242c00771a983b1428edbefbe43b8bcad116e6a110ebc3305f622fe131596889450b16a69b8567086939f7f4766f3cb93c1cc63c0ee1f6b2a4ce0de084b760e1f7dd3d5542a4f958969f0b17f5268eddb78b68d3348ef0e6be831c3846325985170f06ad25f5af5a04ada0f2aa3c93ad8c940966248698e72d6f029b0af9af91634aae13319faf985ce77ec4c35b416a8100050c7d
c2 = 0x26049d5d64a85ad3e89d7933a0d296651d566d71314485d2c4c74e8fa462f0c95d43daca9bbbc2557efd7441286e5de65b6067f9df6eb6b9ece0439f7ce7b0ee5e97607b3de1f7e591461469482975e9e2161e5ef1664b44d994c2d294884e0ddaab5c19a1a292d057dc517c9b4cb2dbdcfdbab02972cfd0a7d00f34320c4bc887ea2531ecf188e50e0f33995770b54affe30ebbce85bff955aa66c8e28e5708b0f3d3f52f07dbe5bf155968a65deb94f877ae7904b3dbc848e29d465452a07c373799a30452985e5b9933a57ca2d5227c40fed42e9537435c9f3221749db451c3861bbf57a4901f81d6794d0ad10ba882e8ba99e320cb12edd0b8c7194ded33
n3 = 0xd0a6712277676e497a6c09871e09ca7e87a0a09cc9c7a402ff12617eb2da499651724c4bfc4bdee713062c93ac852d627954cd59ed95b97d4ace621d8b86b867b9ff4b58c45c83f51fb4dcb12a15eaba0bf7370c29b1178a1bee585c4263ac7c1f0846bf4b5d2e8be1ec7bbaa023a8439deaaeeebd04d1188692a2223820c447606662e27af3f1fc45332dcea5214b05946d65e73bc8e9a17dc5093a2b0241b5166e6310e9bd0e1a20f9a5cb0f1925ba00b71bff78b058a167ee5dcadf428e1d3e4c077710dc073025a7813160fe825c8e3c81ef5e5070226b5d89a1ce86e91b3ce7cf3b5d590fa467a8defb2f96083291a74996dff53dfc44883a6a1c2e4651
e3 = 0x25b452f7ef6177efeb93d117aa856ca788713ff813af2f577246ed3a0a8cf244032197abd38c42677a0b7a3693108207b71ac7c934cc96d8cfafbe27e1a3ecda72796f0c09d9308e14f62be5bd913bb28afb6f92dc7a362e871d0f8667b9f44ffa2bcd240c554da99fe159599d68a9f7c4aa869b44edb382315b3ffb75bd2b12ba60f7ac667551756d13cb88e2be3f9959ab99fc4a063b8b53d208950f6db139d486f5f7351fa75010ad5177c07e4b2226298678518dd5145be36d4901c69949800f5e63be0b9fd7297eb204d76fd8c87217ea30a5495add4b5d901caabc929ee72de78d6ed3ae760c985ff58703f46046352d17926db6bcd57839c0a3ca9cfd
c3 = 0x874354398f60a93239229e47157f12c2c5b34886cacfe9b236ec545a5dc503c9e5cd38552eeb024d7562fed842368bde2e1744b222aa5f857684de402924a1b493c715a679ad17ab2251c1ad8e92fa83f45c4fb33154e09de088704acd4f14a4d3f8099aba4e2e2a4bc3baf35f32485ca67de3338cf0fd2276af6eb35751b0378709cb2aaff033146bc5d2f94fde12cb2286173af2f582b1841db9fb136667f2f90aca690f6041ad84380ecb86b443949d05bee5a08305b26f3efd53d0ae6e2e9cae6c4b4c36b2ae7d826117512e4c1d12dcce75b35d55b737970e3dc809c04b5aa309583e6a9650bd58415805be3c8175bf9546b24c8ce833a402f9b5d2ef35

不会做😭,看wp要读篇论文,过段时间复现
已完成复现 https://www.cnblogs.com/oyrd/articles/15840866.html

Hammingway

import random
from functools import reduce

flag = open("flag", "r").read()

flag = "".join(str(format(ord(c), '08b')) for c in flag)
flag = [[int(j) for j in flag[i:i+11]] for i in range(0, len(flag), 11)]
code = []
for i in flag:
    for j in range(4):
        i.insert(2**j-1, 0)
    parity = reduce(lambda a, b: a^b, [j+1 for j, bit in enumerate(i) if bit])
    parity = list(reversed(list(str(format(parity, "04b")))))

    for j in range(4):
        if parity[j] == "1":
            i[2**j-1] = 1
    
    ind = random.randint(0, len(i)-1)
    i[ind] = int(not i[ind])
    code.extend(i)

enc = "".join([str(i) for i in code])
open("enc", "w").write(enc)

注意到汉明码具有一比特纠错功能,这里实现他的纠错效果即可

from functools import reduce
c='110011000111011001111000011000000110101101110101011110110100101000010100001010101100110101101001110101001011001011101110010001110001010101011011011000101100100011110011110001000011110001110001111111001100001000101110010001110110000001110010010010000100011000000001001101111110010111110011111010110111000101000011001101000101000001011011001001011111111000100000110101110000000101011111011101011101101101100110111110110100111010010100110110001111111001111011100000100110011000100001110001010000011101011111'
c=list(c)
m=[]
for i in range(0,len(c),15):
    code=c[i:i+15]
    ham = reduce(lambda a, b: a ^ b, [j + 1 for j, bit in enumerate(code) if int(bit)])
    code[ham-1]=str((int(code[ham-1])+1)%2)
    for j in range(4):
        code[2**j-1]=''
    m.extend(code)
m=''.join(m)
pt=[]
for i in range(0,len(m),8):
    a=m[i:i+8]
    pt.append(int(a,2))
print(bytes(pt))

^o^

from Crypto.Util.number import *
from secret import n,o,_,flag

def any(m):
	return bytes_to_long(m)^o^pow(2,2**_,n)

print(n,o,_,any(flag))

#(126176329335043454027341235009057683290541781096785538088437185779950106283534462102786883,22456023784134158064387550786352078427103553489348641216173010466267938277785173301732037264951635050700506776189809535326121257316490294752439819127486709456258090566784874248887194200916292508316349668172694553726134727726937633467532396106605496205841004277926961591604901357597262377953003319850049478502819166543968493292912201066602832545685929727421332846592671475883986049409546411338070434784675992855275254782158499562211464363321053581615280674425860714715529804670567409115827118589244016504450514019111124308126165185658681843519312254372108072512792854040590016772780908271525769845284796145687079308339,1138895128842708275167,22456023784134158064387550786352078427103553489348641216173010466267938277785173301732037264951635050700506776189809535326121257316490294752439819127486709456258090566784874248887194200916292508316349668172694553726134727726937633467532396106605496205841004277926961591604901357597262377953003319850049478502819166543968493292912201066602832545685929727421332846592671475883986049409546411338070434784675992855275254782158499562211464363321053581615280674425860714715529804670567409115827118589244016504450514019111124308126165145471041075065947806083270394708336810934202426175949363009508477208686445248781032485832)

解密只需异或运算,但是会发现因为幂次过大无法计算,所以我们需要对幂次做处理,我们发现n是可分解的,于是我们对模数mod(phi(n))即可

from Crypto.Util.number import *
a=[126176329335043454027341235009057683290541781096785538088437185779950106283534462102786883,22456023784134158064387550786352078427103553489348641216173010466267938277785173301732037264951635050700506776189809535326121257316490294752439819127486709456258090566784874248887194200916292508316349668172694553726134727726937633467532396106605496205841004277926961591604901357597262377953003319850049478502819166543968493292912201066602832545685929727421332846592671475883986049409546411338070434784675992855275254782158499562211464363321053581615280674425860714715529804670567409115827118589244016504450514019111124308126165185658681843519312254372108072512792854040590016772780908271525769845284796145687079308339,1138895128842708275167,22456023784134158064387550786352078427103553489348641216173010466267938277785173301732037264951635050700506776189809535326121257316490294752439819127486709456258090566784874248887194200916292508316349668172694553726134727726937633467532396106605496205841004277926961591604901357597262377953003319850049478502819166543968493292912201066602832545685929727421332846592671475883986049409546411338070434784675992855275254782158499562211464363321053581615280674425860714715529804670567409115827118589244016504450514019111124308126165145471041075065947806083270394708336810934202426175949363009508477208686445248781032485832]
m=a[3]
o=a[1]
_=a[2]
n=a[0]
p1 = 611738359
p2 = 914351299
p3 = 648863389
p4 = 973139887
p5 = 848994661
p6 = 940957051
p7 = 856368371
p8 = 775357619
p9 = 806952673
p10 = 834612803
phi=(p1-1)*(p2-1)*(p3-1)*(p4-1)*(p5-1)*(p6-1)*(p7-1)*(p8-1)*(p9-1)*(p10-1)
a=pow(2,_,phi)
def any(m):
	return (m)^o^pow(2,a,n)
print(long_to_bytes(any(m)))

rsa-rsa-rsa-rsa

import os
import gmpy2
from Crypto.Util.number import bytes_to_long
from secret import flag

def genPrime(bits):
    number = bytes_to_long(os.urandom(bits // 8))
    return gmpy2.next_prime(number)

e = 1667

p, q = [genPrime(700), genPrime(1400)]
keyA = (p * q, gmpy2.powmod(e, -1, (p - 1) * (q - 1)))

p, q, r = [genPrime(700) for i in range(3)]
keyB = (p * q * r, gmpy2.powmod(e, -1, (p - 1) * (q - 1) * (r - 1)))

p, q = [genPrime(700) for i in range(2)]
keyC = (p * q * r, gmpy2.powmod(e, -1, (p - 1) * (q - 1) * (r - 1)))

p, q = [genPrime(700) for i in range(2)]
keyD = (p * q * q, gmpy2.powmod(e, -1, (p - 1) * (q - 1) * q))

key = [keyA, keyB, keyC, keyD]
key.sort()

for n, d in key:
    print('Pubkey:\n', n, d % (2**1050))
    flag = pow(flag, e, n)

print('Final encrypted:\n', flag)

RSA中d的已知低位攻击

这里根据数据检查互素性即可求出n的公共因子r

这里记录其中一步的求解过程

已知n=pqr , r , d0(d的低1050位)

记pq=nr

∵ed=k×phi+1=>ed0≡k×(p-1)(q-1)(r-1)+1 mod(21050)

ed0≡k(r-1)(nr-p-q+1)+1 =>ed0q≡k(r-1)(nrq-nr-q2+1)+q mod(21050)

接下来爆破k解一个二次模方程

最后设置检验,由于此处爆破出的结果的大小可达21050即直接得到了q,不需要进行q的已知低位爆破,直接检查爆破结果与n的公约数即可,由于此处的e还是有点大的,爆破过程会稍微长一点,下面给出pub4的解密,其他类似

import gmpy2
import sympy
def partial_p(p0, kbits, n):
    if gmpy2.gcd(p0,n)!=1:
        return p0
    else:
        return 0

def find_p(d0, kbits, e, n):
    X = var('X')
    for k in range(1, e+1):
        results = solve_mod([e*d0*X - k*X*(n-X+1) + k*n == X], 2^kbits)
        for x in results:
            p0 = ZZ(x[0])
            p = partial_p(p0, kbits, n)
            if p:
                return p
pub1=(1932038554996040104455315883223718472713346303330978743187996729621529739811658796197488223680412961958556887967491813511917170439647307828115472638585061826614468592481442868170090215351305925734264287520730497594994002140743068998862077851863298594873771123822744767803224906340976228342363101074033729879279238569509131400285857667919295999183513229060721575824944210340220184232383953260959482459809500905579066796423460415005468731499877425631734048522986804875919132786153939377820467381744176688418461727816693147502213213443376334599763827118508992087636947292972915017881722657189677917877434729457682857780869117786951,5912397705121717556140784657839641276560016575788920678668312850282756456341071738849340091721631088367775989603962369060157436838599496513280991842470122870570378689158520323429323908937960430964492381345224198651911458858050453721123669314789402584706012298518271648142729102770808241490823703064903677427178678987)
pub2=(3131941372466165986449739075865674968940174516444076890636643699669723723624476772239531739488887900237270630167942798909976360814710578884208330959980913704031373375334097086496506714284879981190426211509126158904765890049203697875840397068619455247802512255186427221538191894428225298900004231340034286465730171834031703088563214778317659451882235661464904425245012884275748455326419836548780784469413852141646848930684399793701878360640328085712887402813460070572277272227166256367362553115896571208152861417127327011927963063263882998956777761230189213433480309856104225339302750882900096482310202396770196005219615987514591,6868327978266104802989981973163703169084555636189784576185238791210063194494388661448473806872716472633244760268088234379444819398858802986829208689016378717268858566806477769143597241086404105945418733687540225015490422345056492001144261514258758982987176876603622870246393409441550222724784227760607803005148775595)
pub3=(10917617097027265819941199316245708170664160322239112396992379752685149315630190490833569034344683693982148527246306753579034132187820876052547216920239096359749160292797938505063486556690953030692992535714104625710877777307612335669496734575845403728813048203197554540098183478830776569082345496253038419373074472138418756601605374254337538019930772982193317933908317697869554266829969870439418941090745812562872389999750219688406179614975768418558172158692416388137635116617826776163051924280348502765388774834534253485204220529953203590706632081252443788723009621033253377031581260077729777730562359860834341986687191557500091,710016105956319812070196605372318197237647995205776902826343969564168786127883195056045540440980051252709799006465642410089439983838848338421298134182240503034311901611777832870887544745630013027374872143628363811646853589142393730120315860912598068353846852210199572425834904863374715504479538347687533932269822763)
pub4=(6258481099173792024819474693106946368509556265824075910806389420555433719530245040141261998807861113767884111671342271029919841711711451328448935904736886474775877276202237359977901024567156613869337571238366773386318181308244237935111072607256271603656248526102492009598490205120638143923415224899689908073058800131284179621374129893525361577639595306070201323091432351719890284142312117565661804884081697597556630696419503309791419750920380224952740990294316717474919958301157249871723798444410218228692985548446454088523506882711893486354157312740234878194977819815946236879045967624220542070450161828690568738574846066444577281,2806980746913087054428141202947110250935818433820162370601349094569030624334740692976405122418159297203918181430168687556227936388861062069029464526241058280610192563178711275063698079728866019927374256044090494931048809359682558905005574381364419252965309956377206006737941726025977314039045950483033199847327597975)
e=1667
c=4863472644674217870502565424693713184000486927536995099651919590240866271469253214344182197334842137507506086858073884082195321114866653889949375924127756080834433032454456087411507323678798402153608823661022078160023141062260191255620270915331691502139415828179122879192294099884444457864136735926806260011876510858736421882145300532909608975279197160825647548849553174913916658119199697996174288038879828745214652265872117421930778762203853307243931789294163101430752597851152391642867666313642265617715322464199460030394197177929755093316075034884004768661209784916266357741690678348488199658622049287166258613947571770322996041
r=304638331320481268163138611517965845496568256221655432858547689589115159924032407549669321779378717473668562428569960589364902228881784141496830122429070596778200772640542355062106843431507096043904169247235421
key = [pub1,pub2,pub3,pub4]
p=find_p(key[3][1],1050,e,key[3][0])

EasyBits

from Crypto.Util.number import long_to_bytes
from functools import reduce
from secret import flag

def count(s):
	seq0=[]
	seq1=[]
	cnt0=0
	cnt1=0
	for i,b in enumerate(s):
		if b=='0':
			if i!=0 and s[i-1]=='1':
				seq1+=[cnt1]
				cnt1=0
			cnt0+=1
			if i==len(s)-1:
				seq0+=[cnt0]
		else:
			if i!=0 and s[i-1]=='0':
				seq0+=[cnt0]
				cnt0=0
			cnt1+=1
			if i==len(s)-1:
				seq1+=[cnt1]
	return [seq0,seq1]

def genN(seq):
	MAX = lambda l:reduce(lambda a,b: max(a,b),l)
	a = int(''.join(str(i) for i in seq[0]),MAX(seq[0])+1)
	b = int(''.join(str(i) for i in seq[1]),MAX(seq[1])+1)
	return a*b

with open('ciphertext','wb') as w :
	w.write(long_to_bytes(genN(count(''.join(bin(ord(i))[2:].zfill(8) for i in flag))))) 

对算法逆向,首先对结果进行分解遍历找到合适的原数组,再根据数组恢复bits信息

from functools import reduce
from itertools import combinations
a1=544595079558994543939523656419724930553860455113812380055988020817
a2=1603284485789102527932517130294371239263
a3 = 11
a4 = 11
a5 = 48449
a6 = 59123
a7 = 8694766963
a8 = 69630045151
a9 = 103388070465146659
a10 = 444180493923722421083
a11 = 30585433443292955619949165033
n=257341678671014174901705941161725480777217699326282679647327740348082868304405278349012885595624093813001761459371505300727815357112995028183296998092408041699940235629702457970518156536007414219436741641
l=[]
MAX = lambda l:reduce(lambda a,b: max(a,b),l)
MIN = lambda l:reduce(lambda a,b: min(a,b),l)
for i in range(1,11):
    l.extend(combinations([a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11],i))
ll=[]
for i in l:
    aes=1
    for j in i:
        aes*=j
    ll.append([aes,n//aes])
print(len(ll))
def f(n,x):
    a=[0,1,2,3,4,5,6,7,8,9,'A','b','C','D','E','F']
    b=[]
    while True:
        s=n//x
        y=n%x
        b=b+[y]
        if s==0:
            break
        n=s
    b.reverse()
    t=[]
    for i in b:
        t.append(a[i])
    return t
s=[]
for i in ll:
    for j in range(3,8):
        aa=f(i[0],j)
        for k in range(3,8):
            bb=f(i[1],k)
            if MAX(aa)==j-1 and MAX(bb)==k-1 and MIN(aa)!=0 and MIN(bb)!=0:
                s.append([aa,bb])
print(s)

到这里我们惊奇地发现居然只有对称的两组,于是我们对其中一组逆向第一个算法,注意到原信息是由ascii码转值过来的,注意首位都是01开头即可

s=[[2, 2, 2, 2, 2, 1, 2, 3, 4, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 5, 1, 5, 2, 1, 3, 2, 1, 5, 1, 5, 2, 3, 2, 1, 1, 1, 1, 1, 5, 1, 5, 1, 2, 3, 1, 1, 2, 3, 1, 5, 1, 5, 2, 2, 2, 1, 5, 1, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 5, 1, 5, 2, 1, 1, 3, 1, 1, 1, 5, 1, 5, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 5, 1],[1, 2, 2, 1, 3, 4, 1, 2, 1, 1, 1, 1, 1, 3, 1, 4, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 4, 3, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 5, 2, 2, 1, 1, 1, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 1, 1, 1, 2, 1, 3, 2, 2, 3, 3, 1, 1, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 1, 1]]
def decry(s):
    a=s[0]
    b=s[1]
    m=[]
    for i in range(len(a)):
            m.append('0'*b[i])
            m.append('1'*a[i])
    return m
m=''.join(decry(s))
k=[]
for j in range(0,len(m),8):
    k.append(int(m[j:j+8],2))
print(bytes(k))

HardLCG?

from Crypto.Random.random import randrange
from Crypto.Util.number import getPrime
from gmpy2 import gcd
from Lazzaro import flag

def gen():
	while True:
		p = getPrime(1024)
		a, b = divmod(p-1, 33)
		if b == 0 and gcd(33, a) == 1:
			break
	while True:
		q = getPrime(1024)
		if gcd(33, q - 1) == 1:
			break
	n = p * q
	phi = (p - 1) * (q - 1) // 33
	y = 1
	while True:
		y = randrange(n)
		x = pow(y, phi, n)
		if x != 1:
			break
	return (n, y)

def encrypt(pt, key):
	n, y = key
	x, a, b = [randrange(n) for _ in range(3)]
	for m in pt.hex():
		yield pow(y, int(m, 16), n) * pow(x, 33, n) % n
		x = (a * x + b) % n

key = gen()
print(key)
for ct in encrypt(flag, key):
	print(ct)

看wp复现的,又是Gröbner基,果然还是学了不会用

将flag的前几个已知明文带入构造四个多项式求basis

但是这个求Gröbner基的过程确实长,怕不是跑了一两个小时

import gmpy2
key=(20623877646340590962223635291514785423640278353064605576656665895234753719969044647876287414748502639626061064647723981425902882596261226939159212319820707456132546354738550941331831338293876902413797152566214196077276579516450773373386256022788103540347016401218374917148581433181321149589195358262527253507054442169228038613486071848737507683006156238371189898152827548017577733303526373862969164386901207602061523331521735527021074777942471059641913577749747312226864653562025575265850793188083269637850260230541082536124906397344665873053143155438233313588910411432240488507732015344639861657034853269363178639727, 7661596935290892523904925260039601000141559184842735421201455234828457743903803890109586307551536777783579763139083110743491925979323153741838781883901824659957261867362971181599979372572739187373897716424299777561032562506783588957230500517144891546322438915410883617017029203991282750273253845967678717425468514051661018764104008346092662497761170069581766177990196815276467932524677779176365034335850808778889917855029776015303078524824351155610678812384675485228217563480038057525669220956439055563863724289089993739669388925727632435191417574235279628794054675126426347970961902081312610842843021777411059783298)
n=key[0]
y=key[1]
c=[5251966955329620969277085868846046573740004481060886468610267930666159423891560457187633343249948997078782960346289849719612597525327073294489388341761271382566011635985566565197449160580096603659370205479785660824913918394185980018014423634006310216179756563070419475175927906292218397165547156760344682798994638703899654269216737328162047938054240628824241649663019001590137734906211857253207975848618066532921528628600693749078169224753774855775082606018078919944900952300180368994399396347776114590941873911312046921246656831524300958972611612814231073513026799216635182880260276524749432811131251179695987685491,19822603123315448229829626827715717557584065218936318285201458376729218179023799352504529547526264794200855482304018942873381183675897104842944326155349387795617848070609062925678392349371817624320383488033358162188136791811625150582754091969578660423419281364376031332421318058037838414387599169041682035179246827163901252822385800415477286304938710304744392029479564327507414223486798982174205654457871478079965090935964468817300143346710669778647816183731039843775446908016387043956529699602071708626386719507448978351694532082498576727174297925968062904786914601769332238620940313084156934081535526184063402198822,18332958714136239853147143064157161423894428390840921264124200281268935430633181098054287021931721466097316111900466709853541999164380665548761415458084069774142313359194822768437283179419281511681311712505684512254484215746272289690306172347685820807338963436880271891142026936522161679455307619896969932761524924201269279710479728633783021221594279891849138333711460189086069323906469257109322460406179512064640601864311357554044695274732132094589354749295324871907696047115708260309125013250269101885755702596016700228199005354868165734678619757077898391231469919116186796978099397017228243794055889129630414578856,15654870883460944203943961145543633035305603506643674187613567461771520050971070392176515160810648225630160921252352610674992737277327824301033131608739385809460387332626026687202998913592782605208024310526951522812679044934917414013189989936763191348136289460062720950731589628776337222501779263331239587061215566391696275446709577772304927639990145951221810760907586959040153190980234060529229327338576942647605460460685366279244644917196298425893369844207834396007549519716945691741898140093761040898916328737645387835006229831970757157992561725345324633175299034816223395429053101124120487846389993881403768166402]
cc=[]
c1=c[0]*gmpy2.invert(pow(y,6),n)%n
c2=c[1]*gmpy2.invert(pow(y,6),n)%n
c3=c[2]*gmpy2.invert(pow(y,6),n)%n
c4=c[3]*gmpy2.invert(pow(y,12),n)%n
e=33
PR.<x,a,b>=PolynomialRing(Zmod(n))
f1=x^e-c1
f2=(a*x+b)^e-c2
f3=(a*(a*x+b)+b)^e-c3
f4=(a*(a*(a*x+b)+b)+b)^e-c4
G=Ideal([f1,f2,f3,f4]).groebner_basis()
print(G)

output=[b^33 + 16031687681177907248731031106082046196362558940389190255537920893145278260286186831523688673333192709870180269448459115020499242726557799472029498927808183571694532236791470608993975536490885438905622390965115959074869323064908456911560692727529505067005994279754215775384427879356092504963716002623372203199418209335799902790854478293726197240930905916546493173300196731230308972845161325516831421989645927863218953446403645799210040113180827338577062437843063425801235374223870280587800564503052151609902710448869255249235953139314068973351768698335553450774317048331793548447779610399475742044142856472721422554252, x + 19273630051510876312028391948837130735559208530601797464391382917792739466325914056141065300498343340591344736403760513707146649944931967528633072671181734629473104000685763356947423520154733094933740307690528808117934669125915530810122957885994908078588429750529786188113270477435992793081069497323891177683400254185453579959748876069492114290921372263522180441799350952526490822582269221989842284408016211692186738000383244537681346381562162044241189434156766219536542878090727248253344901540508081140668346127813642906869146875906098145393854465651620142592736674147352241598199227782415983728513549919289028035006*b, a + 19255502845055412494598156639186616977802533137859779779902434831491836632514118685219567091760922002974700395494838207560910788891198053116098070738572880218251383744888875681528762990709335016405977187591854312499564408903116456345536613238133835182879724101843007204894689108900895904528831541718387315010453778789309715503074739542111359648647225147147549555028959409565019986507914741468663755721701013341829910852217510865839702310998721303523474490806043450340937431580688386148251268735510141169465022196449586256590370203695806295665636890157261086050821487370217048191147285067128866295244210874555960577148]

到这里我已知a的值,x1=kb(k已知),b33在mod(n)下的结果

由已知我们有xi+1=axi+b mod(n) 其中x1=K1b

构造数列Ki+1=(aKi+1)

假设xi=Kib =>xi+1=(aKi+1)b mod(n)

=>xi+133=(aKi+1)33b33=Ki+133b33 mod(n)

此时我们便能用上b33mod(n)的结果了

注意到ymxi33=cimod(n) 爆破m即可

cc=[]
c1=-16031687681177907248731031106082046196362558940389190255537920893145278260286186831523688673333192709870180269448459115020499242726557799472029498927808183571694532236791470608993975536490885438905622390965115959074869323064908456911560692727529505067005994279754215775384427879356092504963716002623372203199418209335799902790854478293726197240930905916546493173300196731230308972845161325516831421989645927863218953446403645799210040113180827338577062437843063425801235374223870280587800564503052151609902710448869255249235953139314068973351768698335553450774317048331793548447779610399475742044142856472721422554252
c2=-19273630051510876312028391948837130735559208530601797464391382917792739466325914056141065300498343340591344736403760513707146649944931967528633072671181734629473104000685763356947423520154733094933740307690528808117934669125915530810122957885994908078588429750529786188113270477435992793081069497323891177683400254185453579959748876069492114290921372263522180441799350952526490822582269221989842284408016211692186738000383244537681346381562162044241189434156766219536542878090727248253344901540508081140668346127813642906869146875906098145393854465651620142592736674147352241598199227782415983728513549919289028035006
c3=-19255502845055412494598156639186616977802533137859779779902434831491836632514118685219567091760922002974700395494838207560910788891198053116098070738572880218251383744888875681528762990709335016405977187591854312499564408903116456345536613238133835182879724101843007204894689108900895904528831541718387315010453778789309715503074739542111359648647225147147549555028959409565019986507914741468663755721701013341829910852217510865839702310998721303523474490806043450340937431580688386148251268735510141169465022196449586256590370203695806295665636890157261086050821487370217048191147285067128866295244210874555960577148
key=(20623877646340590962223635291514785423640278353064605576656665895234753719969044647876287414748502639626061064647723981425902882596261226939159212319820707456132546354738550941331831338293876902413797152566214196077276579516450773373386256022788103540347016401218374917148581433181321149589195358262527253507054442169228038613486071848737507683006156238371189898152827548017577733303526373862969164386901207602061523331521735527021074777942471059641913577749747312226864653562025575265850793188083269637850260230541082536124906397344665873053143155438233313588910411432240488507732015344639861657034853269363178639727, 7661596935290892523904925260039601000141559184842735421201455234828457743903803890109586307551536777783579763139083110743491925979323153741838781883901824659957261867362971181599979372572739187373897716424299777561032562506783588957230500517144891546322438915410883617017029203991282750273253845967678717425468514051661018764104008346092662497761170069581766177990196815276467932524677779176365034335850808778889917855029776015303078524824351155610678812384675485228217563480038057525669220956439055563863724289089993739669388925727632435191417574235279628794054675126426347970961902081312610842843021777411059783298)
n=key[0]
y=key[1]
be=c1%n
a=c3%n
c=c2%n
m=[]
for i in range(len(cc)):
    for j in range(16):
        k = pow(c,33,n) * be%n
        if pow(y,j)*k%n==cc[i]:
            m.append(j)
            c=a*c+1
pt=[]
for i in range(0,len(m),2):
    s=hex(m[i])[2:]+hex(m[i+1])[2:]
    pt.append(int(s,16))
print(bytes(pt))
posted @ 2022-01-16 21:57  hash_hash  阅读(1930)  评论(0)    收藏  举报