ctf-wechall-Crypto

1.Caesar I

获得一段字符串,根据提示使用凯撒解密,即可获得唯一一句相对有意义的话QUICK BROWN FOX JUMPS OVER THE LAZY DOG OF CAESAR AND YOUR UNIQUE SOLUTION IS........。

2.Transposition I

获得一段字符串,根据提示使用置换加密,看到开头字符串“oWdnreuf.lY uoc”,猜测开头应该是“Wonderful. You",以此作为依据,发现当以长度为6做划分可得到有意义的句子Wonderful. You can read the message way better when the letters are in correct order. I think you would like to see your password now: ........。,

3.Simple Substitution I

获得一段字符串,根据提示是做了单表替换,使用Substitution Cipher Solver工具快速对该字符串进行解密,观察,对不对的单词进行微调后(http://cryptoclub.org/tools/cracksub_topframe.php)得到结果by the almighty god you can read this my friend i am impressed very well done your solution key is pplrlpcdmsfh this little challenge was not too hard was it(注意大小写)

4.Caesar II

由题意可知这一次使用的是移位加密,不同于凯撒加密的是范围由26个字母变为128个ascii字符,但思路一致,可通过

miwen="15 3D 3D 32 20 38 3D 30 7A 20 47 3D 43 20 41 3D 3A 44 33 32 20 3D 3C 33 20 3B 3D 40 33 20 31 36 2F 3A 3A 33 3C 35 33 20 37 3C 20 47 3D 43 40 20 38 3D 43 40 3C 33 47 7C 20 22 36 37 41 20 3D 3C 33 20 45 2F 41 20 34 2F 37 40 3A 47 20 33 2F 41 47 20 42 3D 20 31 40 2F 31 39 7C 20 25 2F 41 3C 75 42 20 37 42 0D 20 7F 00 06 20 39 33 47 41 20 37 41 20 2F 20 3F 43 37 42 33 20 41 3B 2F 3A 3A 20 39 33 47 41 3E 2F 31 33 7A 20 41 3D 20 37 42 20 41 36 3D 43 3A 32 3C 75 42 20 36 2F 44 33 20 42 2F 39 33 3C 20 47 3D 43 20 42 3D 3D 20 3A 3D 3C 35 20 42 3D 20 32 33 31 40 47 3E 42 20 42 36 37 41 20 3B 33 41 41 2F 35 33 7C 20 25 33 3A 3A 20 32 3D 3C 33 7A 20 47 3D 43 40 20 41 3D 3A 43 42 37 3D 3C 20 37 41 20 32 37 30 2F 34 37 37 37 41 3D 37 40 7C"

list1=miwen.split(' ')
mingwen=""
sign=True

for j in xrange(1,128):
    for i in list1:
        mingwen=mingwen+chr((int(i,16)+j)%128)
    for i in mingwen:
        if ord(i)>126 or ord(i)<33:
            sign=False
            break
    if sign:
        print mingwen
        print j
        
    mingwen=""
    sign=True

 找出基本由正常英文字母和一些标点符号组成的句子"GoodRjob,RyouRsolvedRoneRmoreRchallengeRinRyourRjourney.RThisRoneRwasRfairlyReasyRtoRcrack.RWasn'tRit?R128RkeysRisRaRquiteRsmallRkeyspace,RsoRitRshouldn'tRhaveRtakenRyouRtooRlongRtoRdecryptRthisRmessage.RWellRdone,RyourRsolutionRisR.........“然后将”R“改为空格,就得到正常英语句子,即可得到结果

5.Digraphs

由题意可知,这里的加密方法是将一个字符加密为两个字符。所以首先编程提取出组成句子的由两个字符组成的基本单元,并将其随机替换成一个字符组成的单元(即对任意一个基本单元都替换成唯一对应的一个字符,不同基本单元对应字符不同),此时题目变为了单表替换(但其中由大小写和标点),观察字符串,我们看到句子结尾和第一个单词结尾相同,意味着由30个密文字符(15个明文字符)组成的单词可单独成句,可以想到“congratulations“,然后剩余字符按照正确英语单词和语法进行填充。即可获得句子Congratulations. You decrypted this message successfully. Has not too difficult either? was itx Hell? good job. Anter this keyword as solution:  ........代码如下:


s="tchwxlfpdgzkkvkafczkkvhlhwxlcsxq fkhwka kjxabedgroockvxakj kvzxhlcs anxacscszkfpxa cskabebexacscsyskafcfcroxq klzkcs xlhwkv kvhwhw kjhlysyshlbekafckv xahlkvzxxadgbq nuzkcs hlkvkf klxafcfcbq fphwhwkj uwhwekxq bbxlkvxadg kvzxhlcs xjxaronuhwdgkj zkcs cshwfckakvhlhwxliy hwdganfpxlandgfcbekjekbexq"
'''
将组成句子的基本单元提取出来(字符串不能有空格)
lists=s.split(" ")
list1=[]
i=0
str1=""
for i in lists:
    if list1.count(i)==0:
        list1.append(i)

print list1
'''
#将基本单元随即换成字符并作调整知道得到正确的句子
dict1={'tc':'C','hw':'o','xl':'n','fp':'g','dg':'r','zk':'a','kv':'t','ka':'u','fc':'l','hl':'i','cs':'s','fk':'Y','kj':'d','xa':'e','be':'c','ro':'y','oc':'p','zx':'h','an':'m','ys':'f','xj':'k', 'iy':':','xq':'.','kl':'H','bq':'?','nu':'w','kf':'x','uw':'j','ek':'b','bb':'A'}
mingwen=""
str1=""
i=0
while i<len(s):
    if s[i]==" ":
        mingwen+=" "
        i=i+1
    else:
        str1=s[i:i+2]
        mingwen+=dict1[str1]
        i=i+2

print mingwen

6.Baconian

由题意可知这是使用培根加密,观察字符串可知道是将大小写换成不同字母进行培根解密即可

s="BaCoN's cIphEr or THE bacOnIAN CiPHer iS a meThOD oF sTEGaNOGrapHY (a METhoD Of HidIng A sECRet MeSsaGe as OpPOsEd TO a TRUe CiPHeR) dEVIseD BY francis bAcoN. a MessAge Is coNCeALED in THe pRESenTatIoN OF TexT, ratHer thaN iTs coNteNt. tO enCODe A MEsSaGe, eaCh lETter Of THe pLAInText Is rePLAcED By A groUp oF fIvE OF thE LettERS 'a' Or 'b'. thIS REPlacEMenT is dOnE aCcORdiNG To The alPhABet oF THe BACOnIAN cIpHeR, sHoWn bElOw. NoTe: A SeCoNd vErSiOn oF BaCoN'S CiPhEr uSeS A UnIqUe cOdE FoR EaCh lEtTeR. iN OtHeR WoRdS, i aNd j eAcH HaS ItS OwN PaTtErN. tHe wRiTeR MuSt mAkE UsE Of tWo dIfFeReNt tYpEfAcEs fOr tHiS CiPhEr. AfTeR PrEpArInG A FaLsE MeSsAgE WiTh tHe sAmE NuMbEr oF LeTtErS As aLl oF ThE As aNd bS In tHe rEaL, sEcReT MeSsAgE, tWo tYpEfAcEs aRe cHoSeN, oNe tO RePrEsEnT As aNd tHe oThEr bS. tHeN EaCh lEtTeR Of tHe fAlSe mEsSaGe mUsT Be pReSeNtEd iN ThE ApPrOpRiAtE TyPeFaCe, AcCoRdInG To wHeThEr iT StAnDs fOr aN A Or a b. To dEcOdE ThE MeSsAgE, tHe rEvErSe mEtHoD Is aPpLiEd. EaCh 'TyPeFaCe 1' LeTtEr iN ThE FaLsE MeSsAgE Is rEpLaCeD WiTh aN A AnD EaCh 'TyPeFaCe 2' LeTtEr iS RePlAcEd wItH A B. tHe bAcOnIaN AlPhAbEt iS ThEn uSeD To rEcOvEr tHe oRiGiNaL MeSsAgE. aNy mEtHoD Of wRiTiNg tHe mEsSaGe tHaT AlLoWs tWo dIsTiNcT RePrEsEnTaTiOnS FoR EaCh cHaRaCtEr cAn bE UsEd fOr tHe bAcOn cIpHeR. bAcOn hImSeLf pRePaReD A BiLiTeRaL AlPhAbEt[2] FoR HaNdWrItTeN CaPiTaL AnD SmAlL LeTtErS WiTh eAcH HaViNg tWo aLtErNaTiVe fOrMs, OnE To bE UsEd aS A AnD ThE OtHeR As b. ThIs wAs pUbLiShEd aS An iLlUsTrAtEd pLaTe iN HiS De aUgMeNtIs sCiEnTiArUm (ThE AdVaNcEmEnT Of lEaRnInG). BeCaUsE AnY MeSsAgE Of tHe rIgHt lEnGtH CaN Be uSeD To cArRy tHe eNcOdInG, tHe sEcReT MeSsAgE Is eFfEcTiVeLy hIdDeN In pLaIn sIgHt. ThE FaLsE MeSsAgE CaN Be oN AnY ToPiC AnD ThUs cAn dIsTrAcT A PeRsOn sEeKiNg tO FiNd tHe rEaL MeSsAgE."

codebook1 = {
    'A':"aaaaa",
    'B':"aaaab",
    'C':"aaaba",
    'D':"aaabb",
    'E':"aabaa",
    'F':"aabab",
    'G':"aabba",
    'H':"aabbb",
    'I':"abaaa",
    'J':"abaab",
    'K':"ababa",
    'L':"ababb",
    'M':"abbaa",
    'N':"abbab",
    'O':"abbba",
    'P':"abbbb",
    'Q':"baaaa",
    'R':"baaab",
    'S':"baaba",
    'T':"baabb",
    'U':"babaa",
    'V':"babab",
    'W':"babba",
    'X':"babbb",
    'Y':"bbaaa",
    'Z':"bbaab",
}
def zhuanhua(s):
    str1=""
    j=0
    for i in s:
        if ord(i)>64 and ord(i)<91:
            str1=str1+"b"
            j=j+1
        elif ord(i)>96 and ord(i)<123:
            str1=str1+'a'
            j=j+1
        if j==5:
            str1+=" "
            j=0
    return str1
def decode(s):
    cipher=""
    ss = s.split(" ")
    for c in ss:
        sign=True
        for k in codebook1.keys():
            if codebook1[k] == c:
                cipher+=k
                sign=False
                break
        if sign:
            #cipher+=c
            pass
    return(cipher)

a=zhuanhua(s)
b=decode(a)
print b
mingwen=""
for i in b:
    if i=="X":
        mingwen+=" "
    else:
        mingwen+=i
print mingwen.lower()

 注意要将无法匹配字典中的单元扔掉,且原题中有将‘x’转化为空格的提醒。

7.Substitution II(与Digraphs基本相同)

由题意可知,这里的加密方法是将一个字符加密为0-255中随机一个16进制数。所以首先编程提取出组成句子的由组成的16进制数基本单元,并将其随机替换成一个字符组成的单元(即对任意一个基本单元都替换成唯一对应的一个字符,不同基本单元对应字符不同),此时题目变为了单表替换(但其中由大小写和标点),观察字符串,我们看到句子结尾和第一个单词结尾相同,意味着由30个密文字符(15个明文字符)组成的单词可单独成句,可以想到“congratulations“,然后剩余字符按照正确英语单词和语法进行填充。即可获得句子Congratulations! This one was harder, but you got it! very well done fellow hacker! The problem with this cipher is that the key is pretty long! I will come up with a better encryption sheme any soon! your solution is: ........代码如下:

s="79 85 89 11 4B 63 52 E9 96 63 52 00 85 89 D0 D7 6D B5 F6 00 D0 6D 85 89 98 6D E1 63 D0 6D F6 63 4B 32 98 4B 75 6D 7F E9 52 6D FF 85 E9 6D 11 85 52 6D 00 52 D7 6D B3 98 4B FF 6D E1 98 96 96 6D 32 85 89 98 6D B7 98 96 96 85 E1 6D F6 63 A5 33 98 4B D7 6D B5 F6 98 6D D6 4B 85 7F 96 98 92 6D E1 00 52 F6 6D 52 F6 00 D0 6D A5 00 D6 F6 98 4B 6D 00 D0 6D 52 F6 63 52 6D 52 F6 98 6D 33 98 FF 6D 00 D0 6D D6 4B 98 52 52 FF 6D 96 85 89 11 D7 6D 3B 6D E1 00 96 96 6D A5 85 92 98 6D E9 D6 6D E1 00 52 F6 6D 63 6D 7F 98 52 52 98 4B 6D 98 89 A5 4B FF D6 52 00 85 89 6D D0 F6 98 92 98 6D 63 89 FF 6D D0 85 85 89 D7 6D 45 85 E9 4B 6D D0 85 96 E9 52 00 85 89 6D 00 D0 68 6D D0 00 B7 98 96 89 89 63 D6 00 4B 96 D7"
'''
lists=s.split(" ")
list1=[]
i=0
str1=""
for i in lists:
    if list1.count(i)==0:
        list1.append(i)

print list1

'''
dict1={'79':'C','85':'o','89':'n','11':'g','4B':'r','63':'a','52':'t','E9':'u','96':'l','00':'i','D0':'s','B5':'T','F6':'h','32':'d','3B':'I','98':'e','75':',','6D':' ','68':':','D7':'!','E1':'w','7F':'b','FF':'y','B3':'v','B7':'f','A5':'c','33':'k','D6':'p','92':'m','45':'y'}
lists=s.split(" ")
str1=""
for i in lists:
    str1+=dict1[i]

print str1

8.Pimitive Encryption

由题目可知原文件zip与key做异或得到我们下载的zip,用winhex打开我们下载的zip与zip文件头部做异或可得到“0x332e31343135”,发现其对应字符“3.1415”,猜测是用圆周率作为key进行加密,用圆周率解密后得到zip文件可以解压:

mask_in=open("pimitive.zip","rb")
mask= bytearray(mask_in.read())
mask_in.close()
key_in = open('1.txt','rb')
key = bytearray(key_in.read(len(mask)))
key_in.close()
for x in xrange(len(mask)):
    key[x] ^= mask[x]
key_out = open('masked_key.zip','wb')
key_out.write(key)
key_out.close()

获得bmp文件,打开即可获得结果

9.Chessy Hawks

获得一个棋盘,可以想到直角坐标系,以左下角为原点,x轴坐标为a,b,c,d......,y轴坐标为1,2,3,4....,组合在每一点可形成一个十六进制数,棋盘上有两种颜色圈住的数字,猜测一种为加,另一种为减,可得结果“6652333350776e31335a

10.Bacon Returns

由题意可知这是使用了培根加密,但发现在结尾处全都是由小写字母组成,猜测密文可能只有大写字母,将其按正常字母顺序对半分开,前一部分和后一部分对应不同字符,用培根解密即可得到结果:you can read the hidden message so i will tell you the solution which is twelve random letters .........


s="bacON's CIpHER OR tHe bacOnIaN CIPHeR iS a meTHoD oF StEGAnoGrApHy (A meThOD Of hidiNG a SecReT meSsAGE aS opposED To A truE CIpHEr) DEvIsEd bY fRaNCiS bacON. a meSsAGe iS cOnCEaled iN The PrEsENtAtIOn oF TeXT, rAtHeR ThaN ITs ContEnt. to EnCoDE a meSSAGE, each leTTEr oF THE pLaiNTEXT IS RePLaced bY a gRoup oF FIvE OF tHe leTtErs 'A' Or 'B'. THIS rEpLACEMEnt IS dOnE ACcOrDING TO The alPHAbeT oF tHe bacONiaN CiPHeR, ShOwn BelOw. notE: A sEcOnD VeRSiOn oF bacON's CIPHEr usEs A UnIQUE cODe fOR each leTtER. iN OTHER WorDs, I aND J Each haS ITS own pATtERN. THe WRiTeR mUst MAKE USe OF Two DiffeREnt typEfaceS FOR ThiS CIPheR. AFTeR PrEpARInG a falSE meSSage WiTH tHe SAMe NUmbeR oF LeTtERS aS All OF tHe aS AnD bS iN tHe REAL, sEcReT meSsAGe, TWo typEfaceS aRE chOSeN, OnE TO rEprEsENT aS AND tHE otHEr BS. tHEn Each leTTeR OF The falSe meSsAge mUst BE prESEntEd iN tHe aPproprIaTe TYPEFace, accORdiNG TO wHEtHeR It stAnDS FOR aN A Or A b. To DEcODE THe meSSage, The REvErsE meTHoD Is AppLIed. each 'TYpEface 1' leTtEr In tHe falSe meSsAge iS RePLAced WiTH AN A aNd each 'TYpEface 2' leTtER iS rEpLaced WItH a b. THE bacONiaN ALPhabeT Is tHeN usED To rECovER THE OrIgiNAl meSSage. aNy MEtHoD Of WrItInG THe meSSAGe THAt AllOws two DiStINcT rEprEsENtAtIONS fOR EACh chaRAcTeR CAn BE UsED For tHe bacOn CIpHeR. bacOn HimSelf prepared a biliteral alphabet[2] for handwritten capital and small letters with each having two alternative forms, one to be used as a and the other as b. this was published as an illustrated plate in his de augmentis scientiarum (the advancement of learning). because any message of the right length can be used to carry the encoding, the secret message is effectively hidden in plain sight. the false message can be on any topic and thus can distract a person seeking to find the real message."
codebook1 = {
    'A':"aaaaa",
    'B':"aaaab",
    'C':"aaaba",
    'D':"aaabb",
    'E':"aabaa",
    'F':"aabab",
    'G':"aabba",
    'H':"aabbb",
    'I':"abaaa",
    'J':"abaab",
    'K':"ababa",
    'L':"ababb",
    'M':"abbaa",
    'N':"abbab",
    'O':"abbba",
    'P':"abbbb",
    'Q':"baaaa",
    'R':"baaab",
    'S':"baaba",
    'T':"baabb",
    'U':"babaa",
    'V':"babab",
    'W':"babba",
    'X':"babbb",
    'Y':"bbaaa",
    'Z':"bbaab",
}


def zhuanhua1(s):
    str1=""
    j=0
    for i in s:
        if ord(i)>64 and ord(i)<78:
            str1=str1+"a"
            j=j+1
        elif ord(i)>77 and ord(i)<91:
            str1=str1+'b'
            j=j+1
        if j==5:
            str1+=" "
            j=0
    return str1
def decode(s):
    cipher=""
    ss = s.split(" ")
    for c in ss:
        sign=True
        for k in codebook1.keys():
            if codebook1[k] == c:
                cipher+=k
                sign=False
                break
        if sign:
            #cipher+=c
            pass
    return(cipher)

a=zhuanhua1(s)
b=decode(a)
print b
mingwen=""
for i in b:
    if i=="X":
        mingwen+=" "
    else:
        mingwen+=i
print mingwen.lower()

11.Gizmore Encryption

由加密代码可得开始x=1,k=-1,每一轮k=k+x,当k大于密钥长度时k=0,x=x+1,当x大于密钥长度时x=1,然后密文对应字节等于明文对应字节异或密钥[k]异或e,同时已知密钥长度位11,且是a-z,A-Z中,而明文在正常英文字符中,可通过对每一位密钥进行分别加密和语义,确定密钥以及明文,代码如下:

s="64 74 7A 59 6B 3A 36 5B 7E 37 72 49 73 69 65 2A 6D 45 5E 73 37 55 6B 7F 0C 77 73 49 36 4D 70 40 6F 0C 63 43 21 5E 74 77 51 24 62 7E 7B 79 37 75 49 6E 70 38 2A 55 44 5C 65 37 45 77 2A 4D 7B 60 56 7F 42 75 0D 2A 65 63 0C 76 43 64 7A 51 24 74 73 32 69 78 6E 40 36 6D 70 2A 78 43 40 36 74 4D 6A 2A 40 73 60 5A 73 0C 73 0C 67 49 64 5F 60 4B 74 36 5C 6A 36 62 7A 6F 37 72 43 7A 71 62 63 6E 42 15 70 78 5E 71 67 5F 3A 21 58 73 40 7E 45 64 4B 37 59 72 0C 79 79 42 24 6F 79 67 2A 64 6E 40 60 61 72 2A 68 58 1B 36 58 44 28 2A 65 36 60 40 7B 43 61 58 2A 4A 78 5E 66 43 65 36 41 6B 36 62 77 66 7B 21 55 79 71 36 7E 69 49 15 66 76 5F 77 7D 43 64 65 16 36 1E 21 1E 3A 1D 52 18 35 69 57 23 71 2A 36 5F 7C 2A 74 60 5F 73 24 6F 65 74 0C 54 64 72 0C 77 7E 45 7A 6D 0C 62 5E 6B 45 64 4B 37 4D 6F 48 31 7E 54 72 73 36 7C 65 37 6D 59 75 6F 3A 2A 78 43 40 36 7A 4D 7D 68 49 36 6F 49 73 48 32 5F 65 41 72 0C 6C 43 63 73 15 67 7F 66 7A 6F 65 75 49 6E 70 38 2A 55 44 5C 65 37 45 77 2A 58 7E 64 0C 73 42 76 0C 65 4A 37 58 69 49 31 7B 50 77 65 77 75 6F 39"
list1=s.split(" ")
keystr1="abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ"
mingwen=""
lkey=11
for ch in keystr1:
 #从0开始增长密钥,将可以确定的密钥位确定,不可以确定的密钥位可以线填充,最后根据语义确定
    key='I'+ch      
    x=1
    k=-1
    sign=True
    for i in list1:
        k=k+x
        if k>=lkey:
            k=0
            x=x+1
            if x>=lkey:
                x=1
        if (k%lkey)<len(key):
            mingwench=(ord(key[k%lkey])^(int(i,16)^ord('e')))%128
            if (mingwench<91 and mingwench>64) or (mingwench<123 and mingwench>96)or (mingwench<58 and mingwench>47) or (mingwench==33) or (mingwench==10) or (mingwench==44) or (mingwench==46) or (mingwench==58) or (mingwench==63) or (mingwench==32) or (mingwench==34):
                mingwen+=chr(mingwench)
            else:
                sign=False
                break
            
        else:
            mingwen+=" "
    if sign:
        print mingwen
        print ch
    mingwen=""

12.Save the world

有题可得3个对相同明文rsa加密获得的密文c1,c2,c3和三个公钥(n1,e1),(n2,e2),(n3,e3),且e1=e2=e3=3。这时我们可以用RSA低幂爆破来直接计算明文,而且我们还能得知m的三次方除n1为c1,除n2为c2,除n3为c3,可用中国剩余定理计算出一个基础数在进行爆破,代码如下:

import gmpy2
gmpy2.get_context().precision=5000

n1=67108337285130152841142557048979836392659321891857101226732337281870319219630063308425261001094568350046449570317350200345069218868069937257334549833448872476614876540784326223874329257870403617101833443821600387071916268539809093718680249166808635061387807508685444808747478914853774065015492846530346393353
c1=59058347096109371168795252122846264164451858386505373224717251386760070715998321616322872045496360926010965597694014530236569746798289883620698223974595367916085717978321529423973042614191915468707322332091455074345692573515857940306572327140400350462809984034174154399693239167252702004158475615822913969287
n2=72291820644801851050330848110159409202048919534527955164120302762396644587973560056961559507263386276590810913644140431966430239440589187607901445455506476844642551722261333276197428423259685681788297978506553640688246992377440543586422646431425963957419557354223431017425961356384309621186050871003908824523
c2=6883263686330952184273822891213591005924705168937975803056469379223409544614680809888088032770672596940790664538600692174951037808814433024269560545952391984729877968807887091176040788850793084257461538315949143092080737002404840007500340125359757260591604068743351078048379311774951289024843307735044171207
n3=104783788987827067930027452786608829382069127222045660514968202129202628419456254428420482380928992774984332897768761789989189306007432083874165500533674664850382891750853847082861247537097054898628900960779958023749459758924880679450916956553601431823839124186749459819727500823704168760828991322166878406679
c3=31530233954435234871615474461082257860814574852516832348566750745247980529778060741121062564921306275042716802719690563904928683994299563976201039979006456180637367868349438046345194799904021862696709805385084593929161922092328004450918869656249671823890686732759451197371660447696246493681072092464092210096
N1=n2*n3
N2=n1*n3
N3=n1*n2
N=n1*n2*n3
proN1=gmpy2.invert(N1,n1)
proN2=gmpy2.invert(N2,n2)
proN3=gmpy2.invert(N3,n3)
N=((c1*N1*proN1)%N+(c2*N2*proN2)%N+(c3*N3*proN3)%N)%N
i=1
while True:
    res=gmpy2.iroot(N*i,3)
    if res[1]:
        print res[0]
        break
    i=i+1
    print i

 根据题意将结果后二十位填入即可

猜你喜欢

转载自blog.csdn.net/zhang14916/article/details/81164443
今日推荐