2021能源安全大赛RSA-number

import gmpy2
from Crypto.Util.number import *
nbits = 1024
p = getPrime(nbits)
q = getPrime(nbits)
e = 65537
n = p*q
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
pinv = gmpy2.invert(p, q)
qinv = gmpy2.invert(q, p)
flag = "********************"
m = bytes_to_long(flag)
c = pow(m, e, n)
print(e)
print(phi)
print(c)
print(pinv)
print(qinv)
#e=65537
#phi=16214196677409842191749663213231966223463566653203568400729814072064956461861752278166553612908715656550967320972074537503601239318720270129995303074646212737965783268459229106835490417712668363359171821708318720809832159572282727511389992615663441511503229704750580492198821606998317710868668828833141425196622473234579399775579260766468635789016596133769105704618517033189110246711345632295573082254981344927876365625171289065905073217354890942522382600791119629881635451001620199711984737382369947788979240377635737790856929955955970018372806837656838074878040088010958855603338894383834400898168898618138035821760
#c=10604018404112829207653109426421330872764960317584135942976846332774968746963495249471791454332018210024138118402034077993086458923434620824648601296546049400784253605007345552068039256920909136573149623993650033977431024066666079287398686091212994858934967000073682790106585918576271349858494852312801806759693201090168582692590718584072906358808826192436677670097858207614448463997654563107791219248280328276122250827703702624009318075976748693174206978841677406243656787173843544323747984786489504681386107186529318709829786795782849615751624805732251794730394312662114841018929734575979077218728057604916282584549
#pinv=41227525122641731027803576353121502216886898566530090754910822233885820938630571029851581473120591477480350097934822292149235531143326884563227004577488643415686764380038498101774124058390324990260637107448524600734605221941232886887041892234469421509329336000703903447902913943927720581260808815020884284053
#qinv=96682167531431432828019735553573344641300497261009819846367358362042455665591587442956765031952285358537009209824632767606759833549222627721046066423193573378463757319043876813146540965827319020631984549384593998428481208271733978137361346913047429919163939654471574485561505945941232191428058440607575906773

根据题意,易得 d = gmpy2.invert(e,phi)

有了 c , d , pinv, qinv 求m :m = c^d % n , n = p * q

根据费马小定理

sympy解方程 

c = pow(m, 2, r)

from sympy.ntheory.residue_ntheory import nthroot_mod# nthroot_mod(a,n,p) Find the solutions to x**n = a mod pm = nthroot_mod(c,2,r)from Crypto.Util.number import *print(long_to_bytes(m))

换表

在Python 2.x中。该表是256个字符的字符串。可以使用string.maketrans:

>>> import string
>>> tbl = string.maketrans('ac', 'dx')
>>> "abcabc".translate(tbl)
'dbxdbx'

在Python 3.x中

>>> "abcabc".translate({ord('a'): 'd', ord('c'): 'x'})
'dbxdbx'

[2021]XOR

参考文章 [GKCTF 2021]XOR_m0_57291352的博客-CSDN博客[GKCTF 2021]XOR题目from Crypto.Util.number import *from hashlib import md5a = getPrime(512)b = getPrime(512)c = getPrime(512)d = getPrime(512)d1 = int(bin(d)[2:][::-1] , 2)n1 = a*bx1 = a^bn2 = c*dx2 = c^d1flag = md5(str(a+b+c+d).encode()).hexdihttps://blog.csdn.net/m0_57291352/article/details/119974008DASCTF|June GKCTF X DASCTF应急挑战杯WriteUP-MISC&CRYPTO篇 - 云+社区 - 腾讯云本次竞赛涵盖WEB、CRYPTO、MISC、PWN、REVERSE常规CTF五大类赛题。https://cloud.tencent.com/developer/article/1844889

 题目

from Crypto.Util.number import *
from hashlib import md5a = getPrime(512)
b = getPrime(512)
c = getPrime(512)
d = getPrime(512)
d1 = int(bin(d)[2:][::-1] , 2)
n1 = a*b
x1 = a^b
n2 = c*d
x2 = c^d1
flag = md5(str(a+b+c+d).encode()).hexdigest()
print("n1 =",n1)
print("x1 =",x1)
print("n2 =",n2)
print("x2 =",x2)#n1 = 83876349443792695800858107026041183982320923732817788196403038436907852045968678032744364820591254653790102051548732974272946672219653204468640915315703578520430635535892870037920414827506578157530920987388471203455357776260856432484054297100045972527097719870947170053306375598308878558204734888246779716599
#x1 = 4700741767515367755988979759237706359789790281090690245800324350837677624645184526110027943983952690246679445279368999008839183406301475579349891952257846
#n2 = 65288148454377101841888871848806704694477906587010755286451216632701868457722848139696036928561888850717442616782583309975714172626476485483361217174514747468099567870640277441004322344671717444306055398513733053054597586090074921540794347615153542286893272415931709396262118416062887003290070001173035587341
#x2 = 3604386688612320874143532262988384562213659798578583210892143261576908281112223356678900083870327527242238237513170367660043954376063004167228550592110478

分析可知,a_bit、b_bit的低位逐位爆破4种可能[0 0, 0 1, 1 1 ,1 0],查看是否满足两个条件

(1)a_bit ^ b_bit == x1_bit

(2) a、b低i位数相乘取余的结果与 a*b取余的结果一致,即

分析可知,c, d的运算中有

d1 = int(bin(d)[2:][::-1] , 2) # 取d的二进制倒序
n2 = c*d
x2 = c^(d1)

因此爆破时,同时爆破4个位,即c、d的高位c_high_bit、d_high_bit,c、d的低位c_low_bit、d_low_bit  。此时验证条件改为:

(1)c_low_bit ^ d_high_bit == x2_low_bit

(2)c_high_bit ^ d_low_bit  == x2_high_bit

(3)(c_low_bit[:-i] * d_low_bit[:-i])  mod (2**i )== n2_low_bit mod (2**i )

(4)(c_high_bits + c_low_bits) * (d_high_bits + d_low_bits ) <= n2

(5)(c_high_bits + c_low_bits + 0b01111111110) * (d_high_bits + d_low_bits + 0b01111111110) >= n2

0b0111111110 是c或d的填充部分,根据i位数改变长度, 即中间部分全部填充1

#coding:utf-8
import itertools
def get_ab():n1 = 83876349443792695800858107026041183982320923732817788196403038436907852045968678032744364820591254653790102051548732974272946672219653204468640915315703578520430635535892870037920414827506578157530920987388471203455357776260856432484054297100045972527097719870947170053306375598308878558204734888246779716599x1 = 4700741767515367755988979759237706359789790281090690245800324350837677624645184526110027943983952690246679445279368999008839183406301475579349891952257846a_list, b_list = [0], [0]cur_mod = 1for i in range(513):cur_mod *= 2nxt_as, nxt_bs = [], []for al, bl in zip(a_list, b_list):for ah, bh in itertools.product([0, 1], repeat=2):aa, bb = ah*(cur_mod // 2) + al, bh*(cur_mod // 2) + blif ((aa * bb % cur_mod == n1 % cur_mod) and ((aa ^ bb) == x1 % cur_mod)):nxt_as.append(aa)nxt_bs.append(bb)a_list, b_list = nxt_as, nxt_bsfor a, b in zip(a_list, b_list):if a * b == n1 and a*b-n1==0 and (a^b)-x1==0:breakprint("a = ",a)print("b = ",b)#a =7836147139610655223711469747200164069484878894626166870664740637786609468164555354874619497753277560280939259937394201154154977382033483373128424196987617#b =10703774182571073361112791376032380096360697926840362483242105878115552437021674861528714598089603406032844418758725744879476596359225265333530235803365847return a,bimport itertools
def get_cd():n1 = 65288148454377101841888871848806704694477906587010755286451216632701868457722848139696036928561888850717442616782583309975714172626476485483361217174514747468099567870640277441004322344671717444306055398513733053054597586090074921540794347615153542286893272415931709396262118416062887003290070001173035587341x1 = 3604386688612320874143532262988384562213659798578583210892143261576908281112223356678900083870327527242238237513170367660043954376063004167228550592110478a_list, b_list, aa_list, bb_list = [0], [0], [0], [0]x1_bits = [int(x) for x in f'{x1:0512b}'[::-1]]#print(f'{x1:0512b}') == print(bin(x1)[2:].rjust(512,'0'))cur_mod = 1for i in range(256):cur_mod *= 2nxt_as, nxt_bs, nxt_aas, nxt_bbs = [], [], [], []for al, bl, a2, b2 in zip(a_list, b_list, aa_list, bb_list):for ah, bh, ah2, bh2 in itertools.product([0, 1], repeat=4): # [0 0 0 0# 0 0 0 1# 0 0 1 0# 0 0 1 1# 0 1 0 0# 0 1 0 1# 0 1 1 0# 0 1 1 1# 1 0 0 0# 1 0 0 1# 1 0 1 0# 1 0 1 1# 1 1 0 0# 1 1 0 1# 1 1 1 0# 1 1 1 1]aa, bb, aa2, bb2 = ah*(cur_mod // 2) + al, bh*(cur_mod // 2) + bl, ah2*(cur_mod // 2) + a2, bh2*(cur_mod // 2) + b2bb2_rev = f'{bb2:0512b}'[::-1]bb2_rev = int(bb2_rev, 2)aa2_rev = f'{aa2:0512b}'[::-1]aa2_rev = int(aa2_rev, 2)gujie = '0' * (i+1) + '1' * (510 - 2 * i) + '0' * (i+1)gujie = int(gujie, 2)if ((aa * bb % cur_mod == n1 % cur_mod) and ((ah ^ bh2) == x1_bits[i]) and (ah2 ^ bh == x1_bits[511-i]) and ((aa2_rev + aa) * (bb2_rev + bb) <= n1) and ((aa2_rev + aa + gujie) * (bb2_rev + bb + gujie) >= n1)):nxt_as.append(aa)nxt_bs.append(bb)nxt_aas.append(aa2)nxt_bbs.append(bb2)a_list, b_list, aa_list, bb_list = nxt_as, nxt_bs, nxt_aas, nxt_bbsfor a, b, aa2, bb2 in zip(a_list, b_list, aa_list, bb_list):aa2_rev = f'{aa2:0512b}'[::-1]aa2_rev = int(aa2_rev, 2)bb2_rev = f'{bb2:0512b}'[::-1]bb2_rev = int(bb2_rev, 2)a = aa2_rev + ab = bb2_rev + bif (a * b == n1):break# print(a * b - n1)# print((a ^ int(bin(b)[2:][::-1],2)) - x1)print('c=',a)print('d=',b)return a,b
a,b = get_ab()
c,d = get_cd()
from hashlib import md5
flag = md5(str(a+b+c+d).encode()).hexdigest()
print('flag=','GKCTF{'+str(flag)+'}')

题目[GKCTF 2021] RRRRsa

参考

[GKCTF 2021]RRRRsa_lrving-的博客-CSDN博客复现[GKCTF 2021]RRRRsa拿到题目后,准备操作,额,,,看了看大佬的wp,恍然大悟,分享一下解题的思路。(部分题目如下)一般看到这种像hint1的式子,都需要用gcd(,n)去分解出q或p。推导过程如下(官方题解)推导过程需要用到二项式定理和费马定理。原理如下:1)二项式定理:2)费马定理:a^p = a mod p;了解原理后,在看题解就容易多了。总结了一下:1)拿到两个式子后,先把括号去掉,然后把常数项去掉;2)之后得到的式子应该是俩个只含p或q的式子,让两个式子的p(https://blog.csdn.net/weixin_51867782/article/details/118573717

题目描述

from Crypto.Util.number import *
from gmpy2 import gcdflag = b'xxxxxxxxxxxxx'
p = getPrime(512)
q = getPrime(512)
m = bytes_to_long(flag)
n = p*q
e = 65537
c = pow(m,e,n)
print('c={}'.format(c))p1 = getPrime(512)
q1 = getPrime(512)
n1 = p1*q1
e1 = 65537
assert gcd(e1,(p1-1)*(q1-1)) == 1
c1 = pow(p,e1,n1)
print('n1={}'.format(n1))
print('c1={}'.format(c1))
hint1 = pow(2020 * p1 + q1, 202020, n1)
hint2 = pow(2021 * p1 + 212121, q1, n1)
print('hint1={}'.format(hint1))
print('hint2={}'.format(hint2))p2 = getPrime(512)
q2 = getPrime(512)
n2 = p2*q2
e2 = 65537
assert gcd(e1,(p2-1)*(q2-1)) == 1
c2 = pow(q,e2,n2)
hint3 = pow(2020 * p2 + 2021 * q2, 202020, n2)
hint4 = pow(2021 * p2 + 2020 * q2, 212121, n2)
print('n2={}'.format(n2))
print('c2={}'.format(c2))
print('hint3={}'.format(hint3))
print('hint4={}'.format(hint4))#c=13492392717469817866883431475453770951837476241371989714683737558395769731416522300851917887957945766132864151382877462142018129852703437240533684604508379950293643294877725773675505912622208813435625177696614781601216465807569201380151669942605208425645258372134465547452376467465833013387018542999562042758
#n1=75003557379080252219517825998990183226659117019770735080523409561757225883651040882547519748107588719498261922816865626714101556207649929655822889945870341168644508079317582220034374613066751916750036253423990673764234066999306874078424803774652754587494762629397701664706287999727238636073466137405374927829
#c1=68111901092027813007099627893896838517426971082877204047110404787823279211508183783468891474661365139933325981191524511345219830693064573462115529345012970089065201176142417462299650761299758078141504126185921304526414911455395289228444974516503526507906721378965227166653195076209418852399008741560796631569
#hint1=23552090716381769484990784116875558895715552896983313406764042416318710076256166472426553520240265023978449945974218435787929202289208329156594838420190890104226497263852461928474756025539394996288951828172126419569993301524866753797584032740426259804002564701319538183190684075289055345581960776903740881951
#hint2=52723229698530767897979433914470831153268827008372307239630387100752226850798023362444499211944996778363894528759290565718266340188582253307004810850030833752132728256929572703630431232622151200855160886614350000115704689605102500273815157636476901150408355565958834764444192860513855376978491299658773170270
#n2=114535923043375970380117920548097404729043079895540320742847840364455024050473125998926311644172960176471193602850427607899191810616953021324742137492746159921284982146320175356395325890407704697018412456350862990849606200323084717352630282539156670636025924425865741196506478163922312894384285889848355244489
#c2=67054203666901691181215262587447180910225473339143260100831118313521471029889304176235434129632237116993910316978096018724911531011857469325115308802162172965564951703583450817489247675458024801774590728726471567407812572210421642171456850352167810755440990035255967091145950569246426544351461548548423025004
#hint3=25590923416756813543880554963887576960707333607377889401033718419301278802157204881039116350321872162118977797069089653428121479486603744700519830597186045931412652681572060953439655868476311798368015878628002547540835719870081007505735499581449077950263721606955524302365518362434928190394924399683131242077
#hint4=104100726926923869566862741238876132366916970864374562947844669556403268955625670105641264367038885706425427864941392601593437305258297198111819227915453081797889565662276003122901139755153002219126366611021736066016741562232998047253335141676203376521742965365133597943669838076210444485458296240951668402513

看到题目 n1/n2/n3 均不可以直接分解

RoarCTF2019 RSA

题目:

常规解法:

A=(((y%x)**5)%(x%y))**2019+y**316+(y+1)/x
p=next_prime(z*x*y)
q=next_prime(z)
A =  2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n =  117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c =  41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128#分析:gmpy2.iroot(A,316)=(mpz(83), False),确定了y的范围#False表示不能完全开方,例如,iroot(1000,2)=(31,False)
#破解x,y:
A =  2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
for x in range(1,90):for y in range(1,90):try:if (((y%x)**5)%(x%y))**2019+y**316+(y+1)/x == A:print x,yexcept:pass解p和q:
import gmpy2
import sympy
n =  117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
n1 = n/166
np = (gmpy2.iroot(n1,2))[0]
p = sympy.nextprime(np)
q = n/p
print q,p破解flag:
import gmpy2
import sympyp=139916095583110895133596833227506693679306709873174024876891023355860781981175916446323044732913066880786918629089023499311703408489151181886568535621008644997971982182426706592551291084007983387911006261442519635405457077292515085160744169867410973960652081452455371451222265819051559818441257438021073941183
q=842868045681390934539739959201847552284980179958879667933078453950968566151662147267006293571765463137270594151138695778986165111380428806545593588078365331313084230014618714412959584843421586674162688321942889369912392031882620994944241987153078156389470370195514285850736541078623854327959382156753458569
e=0x10001
c=41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
n=p*q
phin=(p-1)*(q-1)e=3
while(e<0x10003): try:#d=gmpy2.invert(e,phin)#print d,ed=gmpy2.invert(e,phin)m=pow(c,d,n)flag = hex(m)[2:].decode('hex')if "CTF" in flag:print flag        except:passe = sympy.nextprime(e)       

BuuCTF_crypto(2021.10.8新-->旧)相关推荐

  1. 2021国潮新消费大会落幕,新国潮产业进入“黄金十年”

    摘要:中国文化.中国科技.中国品牌.中国潮流正在影响着整个世界的好奇心,新国潮产业正迈入黄金十年. 新与老碰撞,传统与时尚激荡,古老与现代融合,国潮产业正当时. 2021年10月21日,由国潮产业新媒 ...

  2. 国潮起·万物生,2021国潮新消费大会,见证中国品牌力量

    中国品牌在经历了大众消费时代和互联网营销时代之后,今天终于走到了一个重新审视自己的转捩点.而能让中国品牌发生质变的下一个消费时代,我们将其命名为"国潮消费时代". 在国潮消费时代, ...

  3. Java核心技术:日期和时间新旧API对比

    本文作者:小虚竹,CSDN博客专家&CSDN原力计划作者,Java领域优质创作者,掘金年度人气作者,华为云专家,阿里云专家博主,51CTO专家博主.是一个乐于分享"IT圈" ...

  4. 详解java中的日期与时间;新旧API对比;各种日期格式转换

    一.基本概念 1.本地时间 不同的时区,在同一时刻,本地时间是不同的. 全球一共分为24个时区,伦敦所在的时区称为标准时区,其他时区按东/西偏移的小时区分,北京所在的时区是东八区. 2.时区 GMT ...

  5. 湖南长郡2021高考成绩查询时间,2021年湖南新高考六校、长郡十五校联考时间公布...

    2021年湖南新高考六校.长郡十五校联考时间公布 导读:距离2021年高考时间仅剩不到一百天,各个省份都的高三学子都进入紧张阶段.开始了各种模拟考试.2021届湖南省炎德英才大联考的考试时间也已经公布 ...

  6. linux 内核 工作队列,Linux内核新旧工作队列机制的剖析和比较

    摘要:在中断驱动的程序设计中,工作队列是一种强有力的工具.但是在Linux2.6.35及其以前的内核版本中,每创建一个工作队列就创建与CPU数目相同的内核线程,耗费大量的内核资源:工作只能严格串行的处 ...

  7. 百度BCC云解析配置(新旧文档对比) - (文档篇)

    百度BCC云解析配置流程 · 新旧文档对比 百度提示: 如何修改NS服务器地址呢? 查看详情 配置流程: 序号 步骤说明 旧版地址 新版地址 新版 1. 添加域名 查看 查看 .附参考2 下载文档 2 ...

  8. Flex布局新旧混合写法详解

    flex是个非常好用的属性,如果说有什么可以完全代替 float 和 position ,那么肯定是非它莫属了(虽然现在还有很多不支持 flex 的浏览器).然而国内很多浏览器对 Flex 的支持都不 ...

  9. odoo10参考系列--ORM API 二(新旧API兼容性、模型参考和方法修饰符)

    新API与旧API的兼容性 现在的Odoo是从就的(不规律的)API过渡来的,它可能需要从一个手动桥接到另一个手动桥接: RPC层(XML-RPC和RPC)是在旧的API的形式表达,表达的纯粹的方法在 ...

最新文章

  1. kaggle训练模型
  2. 路由器+摄像头:Netgear在国内怎么走?
  3. 【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )
  4. Linux中的SELinux与chcon以及Samba实现【转】
  5. 【C#】【引用加原创】C#实现kalman滤波
  6. tomcat不能解析php,tomcat不支持php怎么办
  7. 开启防火墙web服务器访问权限 开启必要端口共外部使用
  8. JAVA分布式篇2——Zookeeper
  9. matlab 计算图像的基本参数
  10. (20)python_matplotlib解决中文乱码问题
  11. SQL处理非常见空串
  12. 编程代码分析-使用winsock搜索蓝牙设备
  13. 操作系统与裸机的区别
  14. 计算机中的CPU主频是单位,计算机CPU主频单位是MHz和GHz,他们之间怎么换算?
  15. uniapp使用百度地图
  16. R语言︱函数使用技巧(循环、if族/for、switch、repeat、ifelse、stopifnot)
  17. 程序员副业之如何利用空余时间从博客中赚钱?
  18. PlatON和IRISnet结成战略合作伙伴,共同开拓区块链企业服务市场
  19. 2. Java模板引擎 —— JavaPoet的简单使用
  20. 多媒体计算机网络机房方案,学校多媒体教室及计算机机房实施方案-20210612094112.docx-原创力文档...

热门文章

  1. 带你学微信小程序开发
  2. 和睦家 php研发,豹小秘落户和睦家,探索医疗场景新应用
  3. 零基础学java(6)——面向对象的基本特征
  4. sql数据库包含关系查询
  5. SQL语句中,为什么where子句不能使用列别名,而order by却可以?
  6. 深度优先搜索(DFS) 总结(算法+剪枝+优化总结)
  7. 史上最全的WebSettings说明
  8. C# winform chart 饼状图的使用布局
  9. 关于拼板邮票孔制作规范
  10. Clang调试诊断信息Expressive Diagnostics