文章目录

  • 知识导入:
  • 题一
    • 题目描述:
    • 题目分析:
  • 题二
    • 题目描述:
    • 题目分析:
  • 题三
    • 题目描述:
    • 题目分析:
  • 收获与体会:

知识导入:

  • 总结:
    Franklin-Reiter相关消息攻击(Franklin-Reiter related-message attack):如果两个信息之间存在已知的固定差异,并且在相同的模数n下进行RSA加密,那么就有可能恢复出这两个消息
  • 简单点说就是m和m+a两个明文在相同的e和n下进行加密,那么m就可以破解
如果两条消息之间仅存在已知的固定差异并且在相同的RSA模N下加密那么就有可能同时恢复它们m1 = bytes_to_long(flag)m2 = a * m1 + bc1 = pow(m1,e,n)c2 = pow(a * m1 + b,e,n)其中c1,c2,e,n都已知,那么m1,m2可被破解

题一

题目描述:

from secret import flag
from Crypto.Util.number import *m1 = bytes_to_long(flag)
N = getPrime(512)*getPrime(512)
e = 17c1 = pow(m1, e, N)a = getRandomNBitInteger(512)
b = getRandomNBitInteger(512)
m2 = a * m1 + b
c2 = pow(m2, e, N)print(N, a, b, c1, c2, sep="\n")# 51296885372346449295388453471330409021784141081351581975478435681552082076338697136130122011636685327781785488670769096434920591920054441921039812310126089859349902066456998315283909435249794317277620588552441456327265553018986591779396701680997794937951231970194353001576159809798153970829987274504038146741
# 13256631249970000274738888132534852767685499642889351632072622194777502848070957827974250425805779856662241409663031192870528911932663995606616763982320967
# 12614470377409090738391280373352373943201882741276992121990944593827605866548572392808272414120477304486154096358852845785437999246453926812759725932442170
# 18617698095122597355752178584860764221736156139844401400942959000560180868595058572264330257490645079792321778926462300410653970722619332098601515399526245808718518153518824404167374361098424325296872587362792839831578589407441739040578339310283844080111189381106274103089079702496168766831316853664552253142
# 14091361528414093900688440242152327115109256507133728799758289918462970724109343410464537203689727409590796472177295835710571700501895484300979622506298961999001641059179449655629481072402234965831697915939034769804437452528921599125823412464950939837343822566667533463393026895985173157447434429906021792720

题目分析:

典型的Franklin-Reiter相关消息攻击,直接上解题代码:

n=51296885372346449295388453471330409021784141081351581975478435681552082076338697136130122011636685327781785488670769096434920591920054441921039812310126089859349902066456998315283909435249794317277620588552441456327265553018986591779396701680997794937951231970194353001576159809798153970829987274504038146741
a=13256631249970000274738888132534852767685499642889351632072622194777502848070957827974250425805779856662241409663031192870528911932663995606616763982320967
b=12614470377409090738391280373352373943201882741276992121990944593827605866548572392808272414120477304486154096358852845785437999246453926812759725932442170
c1=18617698095122597355752178584860764221736156139844401400942959000560180868595058572264330257490645079792321778926462300410653970722619332098601515399526245808718518153518824404167374361098424325296872587362792839831578589407441739040578339310283844080111189381106274103089079702496168766831316853664552253142
c2=14091361528414093900688440242152327115109256507133728799758289918462970724109343410464537203689727409590796472177295835710571700501895484300979622506298961999001641059179449655629481072402234965831697915939034769804437452528921599125823412464950939837343822566667533463393026895985173157447434429906021792720
e=17import libnum
def franklinReiter(n,e,c1,c2,a,b):R.<X> = Zmod(n)[]f1 = X^e - c1f2 = (X*a+ b)^e - c2# coefficient 0 = -m, which is what we wanted!return Integer(n-(compositeModulusGCD(f1,f2)).coefficients()[0]) # 系数# GCD is not implemented for rings over composite modulus in Sage# so we do our own implementation. Its the exact same as standard GCD, but with# the polynomials monic representation
def compositeModulusGCD(a, b):if(b == 0):return a.monic()else:return compositeModulusGCD(b, a % b)m=franklinReiter(n,e,c1,c2,a,b)
print(libnum.n2s(int(m)))
# flag{a593591a-3749-cc52-0c27-e897fac2c967}

或者(本质一样,看起来更简洁一些):

import libnum
n=51296885372346449295388453471330409021784141081351581975478435681552082076338697136130122011636685327781785488670769096434920591920054441921039812310126089859349902066456998315283909435249794317277620588552441456327265553018986591779396701680997794937951231970194353001576159809798153970829987274504038146741
a=13256631249970000274738888132534852767685499642889351632072622194777502848070957827974250425805779856662241409663031192870528911932663995606616763982320967
b=12614470377409090738391280373352373943201882741276992121990944593827605866548572392808272414120477304486154096358852845785437999246453926812759725932442170
c1=18617698095122597355752178584860764221736156139844401400942959000560180868595058572264330257490645079792321778926462300410653970722619332098601515399526245808718518153518824404167374361098424325296872587362792839831578589407441739040578339310283844080111189381106274103089079702496168766831316853664552253142
c2=14091361528414093900688440242152327115109256507133728799758289918462970724109343410464537203689727409590796472177295835710571700501895484300979622506298961999001641059179449655629481072402234965831697915939034769804437452528921599125823412464950939837343822566667533463393026895985173157447434429906021792720
e=17
import binascii
def franklinReiter(n,e,c1,c2,a,b):PR.<x> = PolynomialRing(Zmod(n))g1 = (x)^e - c1g2 = (a*x+b)^e - c2def gcd(g1, g2):while g2:g1, g2 = g2, g1 % g2return g1.monic() # return -gcd(g1, g2)[0]m=franklinReiter(n,e,c1,c2,a,b)
print(libnum.n2s(int(m)))
# flag{a593591a-3749-cc52-0c27-e897fac2c967}
  • 其中:
def gcd(g1, g2): while g2:g1, g2 = g2, g1 % g2return g1.monic() # return -gcd(g1, g2)[0]
  1. 使用辗转相除法求多项式的最大公因子
  2. 在代数中,一个多项式的首项系数通常被称为该多项式的引导系数(leading coefficient),而将多项式变成首项系数为1的形式被称为将多项式化为首一形式(monic form)
  3. 调用函数g1.monic()将g1转换为首一多项式(monic polynomial),并返回该多项式。
  4. 使用g.monic()[0],则会返回g(x)除以引导系数后得到的多项式的常数项
    比如:g.monic() = x + 32412345
    那么:g.monic()[0] = 32412345

题二

题目描述:

from Crypto.Util.number import getPrime,bytes_to_long,long_to_bytes
from functools import reduce
from secret import flag, x, ym = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n = p*q
print(n)assert(reduce(lambda x,y:x&y,[(i-5)*i+6==0 for i in x]))
assert(reduce(lambda x,y:x&y,[(j-15)*j+44==0 for j in y]))print(pow(reduce(lambda x,y:x*m+y,x),17,n))
print(pow(reduce(lambda x,y:x*m+y,y),17,n))# n = 23772599983135215481563178266884362291876571759991288577057472733374903836591330410574958472090396886895304944176208711481780781286891334062794555288959410390926474473859289842654809538435377431088422352076225067494924657598298955407771484146155998883073439266427190212827600119365643065276814044272790573450938596830336430371987561905132579730619341196199420897034988685012777895002554746080384319298123154671447844799088258541911028041717897434816921424155687677867019535399434825468160227242441375503664915265223696139025407768146464383537556265875013085702422829200814612395116961538432886116917063119749068212699
# c1 = 10900151504654409767059699202929100225155892269473271859207513720755903691031362539478242920144073599515746938827937863835169270383721094542639011665235593065932998091574636525973099426040452626893461449084383663453549354608769727777329036059746386523843912382289597182615339786437186169811342356085836838520978047561127661777189045888648773949147220411427306098338616422692914110656004863767719312410906124366000507952960331116878197129010412361636679449281808407214524741732730279777729251515759320442591663641984363061618865267606007355576230009922421807527598213455112981354590909603317525854070358390622096569841
# c2 = 17298679220717326374674940612143058330715465693318467692839033642321129433471254547497087746971317567301086124779289015934582615377165560688447452762043163082394944604062014490446763247008217251611443338103074143809936437694543761369945095202092750900940979469994907399829695696313513303922266742415376818434932335640062684245008822643258497589196668426788916969378417960200705779461808292296450298558001909603602502604228973101048082095642290047196235959438278631661658312398313171590515776453711432353011579809351076532129444735206408591345372296372378396539831385036814349328459266432393612919118094115543053115450

题目分析:

  • 首先来看一下下面这一串
assert(reduce(lambda x,y:x&y,[(i-5)*i+6==0 for i in x]))
 1. [(i-5)*i+6==0 for i in x] 使用列表推导式判断等式是否成立,若成立,返回True,否则False,故列表中最终得到的是[True,True]2. 为什么是True呢,因为用了assert断言函数,如果为真则正常执行,如果为假则报错,过程中断给的题目是会正常运行下去的,故该结果应为True,3. 由此可以反推出x = [2,3](解方程得到),显然也可以知道下一串中y = [4,11]4. reduce函数是应用lambda表达式对列表([True,True])中的每一个元素依次进行异或操作5. PS:“lambda x,y:x&y”中的‘x’与“[(i-5)*i+6==0 for i in x]”中的‘x’并不是同一个!!!(如果这里清楚了,那这句话就是真的弄明白了!)
  • 所以推出(解方程相信大家都会)

x = [2,3]
y = [4,11]

  • 接下来看最后一串:
reduce(lambda x,y:x*m+y,x)

这里就不过多说理论方面的了,我直接举个例子吧

x = [1,2,3,4]
reduce(lambda x,y:x+y,x),使用reduce对x进行累积
x = 1,y = 2,==>
x+y = 3 ①
x = ①,y = 3,==>
x+y = 6 ②
x = ②,y = 4,==>
x+y = 10 ③
即 1+2+3+4

最终得到的结果为10
再举个更难一点的例子

x = [1,2,3,4]
reduce(lambda x,y:x*m+y,x),使用reduce对x进行累积
x = 1,y = 2,==>
x*m+y = 1*m+2 ①
x = ①,y = 3,==>
x*m+y = (1*m+2)*m+3 ②
x = ②,y = 4,==>
x*m+y = ((1*m+2)*m+3)*m+4 ③

最终得到的即为式③

  • 由此可以得知题目中
reduce(lambda x,y:x*m+y,x) = 2*m+3
reduce(lambda x,y:x*m+y,y) = 4*m+11
  • 最终得到:
c1 = pow(2*m+3,17,n)
c2 = pow(4*m+11,17,n)
  • 又是典型的Franklin-Reiter相关消息攻击,直接上代码解题
import libnum
n = 23772599983135215481563178266884362291876571759991288577057472733374903836591330410574958472090396886895304944176208711481780781286891334062794555288959410390926474473859289842654809538435377431088422352076225067494924657598298955407771484146155998883073439266427190212827600119365643065276814044272790573450938596830336430371987561905132579730619341196199420897034988685012777895002554746080384319298123154671447844799088258541911028041717897434816921424155687677867019535399434825468160227242441375503664915265223696139025407768146464383537556265875013085702422829200814612395116961538432886116917063119749068212699
c1 = 10900151504654409767059699202929100225155892269473271859207513720755903691031362539478242920144073599515746938827937863835169270383721094542639011665235593065932998091574636525973099426040452626893461449084383663453549354608769727777329036059746386523843912382289597182615339786437186169811342356085836838520978047561127661777189045888648773949147220411427306098338616422692914110656004863767719312410906124366000507952960331116878197129010412361636679449281808407214524741732730279777729251515759320442591663641984363061618865267606007355576230009922421807527598213455112981354590909603317525854070358390622096569841
c2 = 17298679220717326374674940612143058330715465693318467692839033642321129433471254547497087746971317567301086124779289015934582615377165560688447452762043163082394944604062014490446763247008217251611443338103074143809936437694543761369945095202092750900940979469994907399829695696313513303922266742415376818434932335640062684245008822643258497589196668426788916969378417960200705779461808292296450298558001909603602502604228973101048082095642290047196235959438278631661658312398313171590515776453711432353011579809351076532129444735206408591345372296372378396539831385036814349328459266432393612919118094115543053115450
e = 17
import binascii
def franklinReiter(n,e,c1,c2):PR.<x> = PolynomialRing(Zmod(n))g1 = (2*x+3)^e - c1g2 = (4*x+11)^e - c2def gcd(g1, g2):while g2:g1, g2 = g2, g1 % g2return g1.monic()return -gcd(g1, g2)[0]m=franklinReiter(n,e,c1,c2)
print(libnum.n2s(int(m)))
# flag{r54__r3l473d_m355463_4774ck_4l50_c4ll3d_fr4nkl1n_r3173r_4774ck~}

题三

(NEEPUSec CTF 2021 RSA)

题目描述:

from Crypto.Util.number import *
from sympy import nextprime
import gmpy2
import randomdef encode (p1,p2,e):not_hint = (p1 + 1) * (p2 + 1)S = gmpy2.invert(e, not_hint)not_p = S%(p1+1)return not_pflag = b'Neepu{********************}'
flag = bytes_to_long(flag)
p = getPrime(512)
q = getPrime(512)
n = p*q
e = nextprime(random.randint(1,1000))
d = gmpy2.invert(e, (p-1)*(q-1))
c = pow(flag, e, n)
print(c)
print(n)m = encode(p, q, e)
c1 = pow(m, 7, n)
c2 = pow(m+e, 7, n)
print(c1)
print(c2)c = 78543767285872349029076059073458316000847341792088805258173041942425687239313215276670106926320359777962661495032475004417723103701253550583245518206305422982968675291500865382213182669036827898932991063338163290845510339896689210314509493839746410486257998875782496654704288722251878269643040214139429715671
n = 91995272927105081122659192011056020468305570748555849650309966887236871318156855318666540461669669247866754568189179687694315627673545298267458869140096224628114424176937828378360997230874932015701507629238213240839370628366083111028544554453150572165461450371411341485911677167168492357154684642531577228543
c1 = 10186066785511829759164194803209819172224966119227668638413350199662683285189286077736537161204019147791799351066849945954518642600518196927152098131117402608793752080104402893792812059620726950782670809837962606250674588612783027976958719051829085903720655233948024280118985875980227528403883475592567727892
c2 = 46182103994299145562022812023438495797686077104477472631494150222038404419414100727667171290098624214113241032861128455086601197239761085752413519627251290509474327611253599768650908336142621210005389246714504358370629231557080301516460985022782887233790302054696967900384601182742759555421864610431428746119

题目分析:

c1 = pow(m, 7, n)
c2 = pow(m+e, 7, n)

很熟悉的两串,但其中有两个未知数,以上两题都只有一个未知数,所以先要把e给求出来,再使用Franklin-Reiter相关消息攻击求出m。如何求e呢,这里便用到了短填充攻击(Coppersmith’s short-pad attack)【目前本人也没看此攻击手法,等推到了原理再说】,不多说,直接上解题代码

def short_pad_attack(c1, c2, e, n):PRxy.< x, y > = PolynomialRing(Zmod(n))PRx.< xn > = PolynomialRing(Zmod(n))PRZZ.< xz, yz > = PolynomialRing(Zmod(n))g1 = x ^ e - c1g2 = (x + y) ^ e - c2q1 = g1.change_ring(PRZZ)q2 = g2.change_ring(PRZZ)h = q2.resultant(q1)h = h.univariate_polynomial()h = h.change_ring(PRx).subs(y=xn)h = h.monic()kbits = n.nbits() // (2 * e * e)diff = h.small_roots(X=2 ^ kbits, beta=0.4)[0]  # find root < 2^kbits with factor >= n^0.4return diffdef related_message_attack(c1, c2, diff, e, n):PRx.< x > = PolynomialRing(Zmod(n))g1 = x ^ e - c1g2 = (x + diff) ^ e - c2def gcd(g1, g2):while g2:g1, g2 = g2, g1 % g2return g1.monic()return -gcd(g1, g2)[0]if __name__ == '__main__':c2 = 10186066785511829759164194803209819172224966119227668638413350199662683285189286077736537161204019147791799351066849945954518642600518196927152098131117402608793752080104402893792812059620726950782670809837962606250674588612783027976958719051829085903720655233948024280118985875980227528403883475592567727892c1 = 46182103994299145562022812023438495797686077104477472631494150222038404419414100727667171290098624214113241032861128455086601197239761085752413519627251290509474327611253599768650908336142621210005389246714504358370629231557080301516460985022782887233790302054696967900384601182742759555421864610431428746119n = 91995272927105081122659192011056020468305570748555849650309966887236871318156855318666540461669669247866754568189179687694315627673545298267458869140096224628114424176937828378360997230874932015701507629238213240839370628366083111028544554453150572165461450371411341485911677167168492357154684642531577228543e = 7diff = short_pad_attack(c1, c2, e, n)print("difference of two messages is %d" % diff)m1 = related_message_attack(c1, c2, diff, e, n)print("m1:", m1)print("m2:", m1 + diff)
  • 另一种方法求m(直接爆破e):
import binascii
def attack(c1, c2, n, e):PR.<x> = PolynomialRing(Zmod(n))g1 = (x)^7 - c1g2 = (x+e)^7 - c2def gcd(g1, g2):while g2:g1, g2 = g2, g1 % g2return g1.monic()return -gcd(g1, g2)[0]
c1 = 10186066785511829759164194803209819172224966119227668638413350199662683285189286077736537161204019147791799351066849945954518642600518196927152098131117402608793752080104402893792812059620726950782670809837962606250674588612783027976958719051829085903720655233948024280118985875980227528403883475592567727892
c2 = 46182103994299145562022812023438495797686077104477472631494150222038404419414100727667171290098624214113241032861128455086601197239761085752413519627251290509474327611253599768650908336142621210005389246714504358370629231557080301516460985022782887233790302054696967900384601182742759555421864610431428746119
n = 91995272927105081122659192011056020468305570748555849650309966887236871318156855318666540461669669247866754568189179687694315627673545298267458869140096224628114424176937828378360997230874932015701507629238213240839370628366083111028544554453150572165461450371411341485911677167168492357154684642531577228543for e in range(1,1000):m = attack(c1, c2, n, e)try:if pow(m,7,n) == c1:print((e,m))except:pass
#结果:(71, 129256555243625096140386916253259867206651269142565502540823654159666398099455456877012993395632742360829588042575108302297567291349420390228163587340859)
#e = 71
#m = 129256555243625096140386916253259867206651269142565502540823654159666398099455456877012993395632742360829588042575108302297567291349420390228163587340859
  • 求到m,又m = s % (p+1) = d % (p+1),这不就类似于dp泄露吗,简单推导一下,把加1换成减1即可得到p,q,直接上解题代码了
import gmpy2
from Crypto.Util.number import *
e = 71
# m = 129256555243625096140386916253259867206651269142565502540823654159666398099455456877012993395632742360829588042575108302297567291349420390228163587340859
c = 78543767285872349029076059073458316000847341792088805258173041942425687239313215276670106926320359777962661495032475004417723103701253550583245518206305422982968675291500865382213182669036827898932991063338163290845510339896689210314509493839746410486257998875782496654704288722251878269643040214139429715671
n = 91995272927105081122659192011056020468305570748555849650309966887236871318156855318666540461669669247866754568189179687694315627673545298267458869140096224628114424176937828378360997230874932015701507629238213240839370628366083111028544554453150572165461450371411341485911677167168492357154684642531577228543
# dp = m ,类似的dp
dp = 129256555243625096140386916253259867206651269142565502540823654159666398099455456877012993395632742360829588042575108302297567291349420390228163587340859
for i in range(1,65535):p = (dp*e-1)//i-1if n%p == 0:q = n//pd = gmpy2.invert(e, (p - 1) * (q - 1))flag = pow(c,d,n)print(long_to_bytes(flag))break
# Neepu{Have-a-g00d-day12138}

收获与体会:

学到挺多,对相关消息攻击掌握了,对reduce(),lambda()函数理解更透彻了,
学到了dp泄露的另一种变形,嗯,不得不说,收获挺大的

浅记一下:

做完NEEPUSec CTF 2023后,感觉这个比赛的题目质量很不错,于是就找了一下它往年的题,然后就做到了NEEPUSec CTF 2021 RSA这题。一开始看它题目描述感觉很简单,但推来推去也只能得到 m * e = 1 % (p+1),m和e还是不知道,结果就是,啥都没求出来。看完wp后知道原来这里对m,e的求解有具体知识点,于是查找了很多资料,最终把这题给弄懂了。

其实一开始是本着直接套脚本的想法,但突然想到了某位前辈说的一句话 “我们是搞网络安全的,不是找flag的ctfer,别把两者搞反了”。
但其实说完全弄懂这题还是有些勉强,里面有一些小点还是不太懂的,比如求公因子后会得到x-M,其中M即为所求的m,不太明白(挠头),比如短填充攻击(还没找资料看),总之大体步骤和含义是清楚了。

Franklin-Reiter相关消息攻击相关推荐

  1. TLS/SSl相关的攻击漏洞及检测方法大杂烩!

    TLS/SSl相关的攻击漏洞及检测方法大杂烩! 曾以为爱可以排除万难,可万难过后,又有万难. 漏洞介绍: TLS/SSL介绍: SSL"安全套接层"协议,TLS"安全传输 ...

  2. TCP/IP卷一:49---ICMP之(与ICMP相关的攻击)

    涉及ICMP的攻击主要分为3类: 泛洪:泛洪将会生成大量流量,导致针对一台或者多台计算机的有效的Dos攻击 炸弹:炸弹类型(有时也称为核弹(nuke)类型)指的是发送经过特殊构造的报文,能够导致IP或 ...

  3. Eigen类型与ROS中tf相关消息类型进行相互转换工具

    在ROS机器人编程资料书中,有个Eigen消息类型与TF相关消息类型进行互相转换的工具包感觉挺好使,修改一下方便以后使用. 1.头文件 #include <Eigen/Eigen> #in ...

  4. cmd代码表白_学会这些(滑动关机、应用多开、QQ微信消息攻击、表白神器),逼格瞬间提升1000倍...

    Hi-新朋友,记得点蓝字关注我哟 // 时隔多天,今天又和大家见面了.上期分享的关于计算窗口的一些基本操作,你可以点击<关于Windows窗口的这些骚操作,Are you know?>查看 ...

  5. TCP连接管理相关的攻击

    SYN泛洪攻击 SYN泛洪是一种TCP拒绝服务攻击,在这种攻击中一个或多个恶意的客户端产生一系 列TCP连接尝试(SYN报文段),并将它们发送给一台服务器,它们通常采用"伪造"的 ...

  6. 流量数据特征相关与攻击

    数据包 根据网络协议的类型,数据包有不同的格式.数据包通常由两部分组成:数据包报头和它的有效负载 报头负责引导包在网络中传输,并标记包的源信息.在许多数据收集方法中,报头对于识别和过滤数据包变得很重要 ...

  7. LTE Initial Attach 的过程以及相关消息的具体解析 (一)

    具体的消息流过程还是按照3GPP 23.401.针对attach过程的某些流程和具体消息展开解释.并给出相对应的规范出处. 1. 首先第一条initial Attach 消息: 从具体的wiresha ...

  8. LTE Initial Attach 的过程以及相关消息的具体解析 (四)

    继续上次, MME,SGW 已经开始建立tunnel. 现在轮到PGW了. 在发送Create Session Response的时候,PGW 需要向PGW 请求用户数据. 规范3gpp 23203, ...

  9. LTE Initial Attach 的过程以及相关消息的具体解析 (二)

    接续上一次的话题,到MME 像 HSS 请求用户数据, 使用Diameter ULR/ULA过程. ULR 没什么大的描述.着重对ULA 解析下.规范参照3gpp 29272, 23401 对于ULA ...

最新文章

  1. Kubernetes v1.0特性解析
  2. 如何计算服务限流的配额
  3. Struts2核心工作原理解析
  4. js截屏 video_js获取视频截图
  5. mybatis mysql自动连接数据库_如何用mybatis链接数据库
  6. pmp每日三题(2022年2月17日)
  7. 【OpenCV学习】Cuda-OpenCV-Image-Filter
  8. Java中的6颗语法糖
  9. 需要重新格式化NameNode
  10. api-gateway实践(01)服务网关 - 原型功能
  11. 今日头条首次公开算法原理(附全文详解)
  12. 如何零成本录制一首单人ACAPPELLA
  13. VB的阶乘和伽马函数
  14. 移植LLDP协议到mips架构设备
  15. canvas实现点连线动画
  16. 计算机网络--使用网络协议分析器捕捉和分析协议数据包
  17. 基于 OpenSSL 生成自签名证书
  18. 【ML从入门到入土系列01】概述
  19. c++面试常见题·Part 2 数据结构和STL
  20. 服务器上Web.config文件不能保存,Web.Config – 由于权限不足,无法读取configuration文件...

热门文章

  1. OsWorkFlow工作流简介
  2. PostgreSQL 30天 培训视频(SQL基础,备份恢复,HA,服务端编程,大数据,内核,应用案例)
  3. 求助:matlab报错:位置 2 处的索引超出数组边界(1)
  4. 微信开发40163 40029错误总结
  5. 省市县地址联动插件distpicker 代码及示例
  6. ios打包证书申请流程
  7. 目标函数和损失函数的区别
  8. 微信小程序图片处理方案,解决加载缓慢,影响用户体验
  9. EXCEL多列内容合并且中间加字符串
  10. 免费的 ChatGPT镜像网站