CTF中那些脑洞大开的编码和加密.docx
CTF中那些脑洞大开的编码和加密OxOO前言正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表母,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但是会给留一些线索,所以写此文的目的是想给小伙伴做题时给一些参考,当然常在CTF里出现的编码也可以了解一下。本来是想尽快写出参考的文章,无奈期间被各种事情耽搁导致文章断断续续写了2个月,文章肯定有许多没仃提及到,欢迎小伙伴补充,总之,希望对小伙伴们有帮助吧!最后欢迎小伙伴来博7V(https:/www.hackfun.org/)1.jt!:P(ps::1.1.J",j文足是川markdown,而论坛编辑器不支持markdOWn语法,虽然我已经尽力去调照对其字符,可是效果还是不尽人意,如果影响阅读理解可以去博客阅读:P)0x01目录常见编码:ASCII编码2.Base643216编码3.she1.1.code编码4 .Quoted-printab1.e编码5 .XXencode编码6 .UUencode编码ZUR1.编码8 .Unicode559 .EscapeZUnescape编码10 .HTM1.实体编码11 .敲击码(TaPcode)12 .莫尔斯电码(MorSeCode)13 .编码的故事各种文本加密换位加密:1 .栅栏密码(RaiHenCeCipher)2 .曲路密码(CUrVeCipher)3 .列移位密码(Co1.UmnarTranspositionCipher)替换加密:1 .埃特巴什码(AtbaShCipher)2 .凯撒密码(CaeSarCipher)3.ROT51318474 .简单换位密码(SimP1.eSubstitutionCipher)5 .希尔密码(HiHCipher)6 .猪圈密码(PigPenCipher)7 .波利比奥斯方阵密码(Po1.ybiUSSquareCipher)8 .更多密码(曲折加密)9 .普莱菲尔密码(PIayfairCipher)10 .维吉尼亚密码(VigenjreCipher)11 .S动密钥密码(AUtOkeyCipher)12 .博福特密码(BeaUfor1.Cipher)13 .滚动密钥密码(RUnningKeyCipher)14 .Porta密码(PortaCipher)15 .同音替换密码(HOmOPhOniCSubstitutionCipher)16 .仿射密码(AffineCipher)17 .培根密码(BaConianCipher)18 .ADFGX和ADFGVX密码(ADFGXCipher)19 .双密码(BifidCipher)20 .三分密码(TrifidCipher)21 .四方密码(FOUr-SqUareCipher)22 .棋t密码I:CheckerboardCipher)23 .跨棋盘密码(StraddIeCheckerboardCipher)24 .分组摩尔斯替换密码(FraCtiOna1.edMorseCipher)25 .Bazeries密码(BaZerieSCipher)26 .Digrafid密码(DigrafidCipher)27 .格明普市密码(GrandPr6Cipher)28 .比尔密码(Beaieciphers)29 .键盘密码(KeybOardCipher)其他仃趣的机械密码:1 .恩尼格玛密码代码混淆加密:1.asp混淆加密2 .php混清加密3 .cssjs混淆加密4.VBScript.Encode混淆加密5.ppencode6.rrencode7.jjencodeaancod8.JSfuck9.jother1(Kbrainfuck编程语占相关工具参考网站彩蛋0x02正文常见编码1.ASC1.1.编码ASCI1.编制大致可以分作:部分组成:第一部分是:ASCI1.非打印控制字符(参详ASC1.1.码表中0-31);第二部分是:ASCI1.打印字符,也就是CTF中常用到的转换;IifiM00000000010000000120000001030000001140000010050000010160000O1.1.O700000111000010009000010011000001010n0000ion12000011001300001101140000X1.1.O150000I1.1.1.160001000017-000100011800010010190001oon20000101002100010101220001011023000101112400011000250001:0012600011010270001101128000111002900011101300001mo«234S67S9O1234S6789O123456789O123333333344444444445555555555666二1.-I:二-二二-二一一一一二1.-二二二一-黑soheEEOTENQ然普鲁二8BDC1DC2DC3DC43黑«然蓝U-三Mb三M-MfM00100000建格】64O1.OO0000960010OOOXt65O1.OOOOO1.A970010001066O1.OOOO1.OB0010001XC7O1.OOOO1.1.C00100100$68O1.OOO1.OOD10000100101%69O1.OOO1.O1.E10100100110470O1.OO01X0F1020010011171O1.OOO1.1.1.G10300101000(7iO1.OO100OH10400101001)73O1.OO1001Z10500101010*74O1.OO1010J10600101011÷75O1.OOIO1.1.KX070010110076O1.OO11001.100010110177O1.OOI1.O1.M*09001011107O1.OOI1.1.ON_1100010I1.1.1./79O1.OOI1.1.1.O1110011000000O1.O1.0000p1120011000111O1.O1.OOO1.Q中00110010282O1.O1.OO1.OR1140011001133O1.OXOOUS11500110100464O1.O1.O1.OOT1160011010155O1.O1.O1.O1.U117001101106O1.OXO1.1.OVU80011011177O1.O1.O1.1.1.W11900111000888O1.O1.1000X12000111001969O1.O1.1001Y12100111010.0O1.O1.1010Z12200111011*1O1.O1.IO1.1.12300111100<92O1.O1.110012400111101S93O1.O1.I1.O1.12500111110>94O1.O1.1110A1250101I1.1.1.-三<0110C0110CO1.1.OC0110CO1.1.CC0110C0110C0110C01101011010110】O1.1.O】0110I011010110101101OUXCO1.1.1.CO1.1.1.COU1.CO1.1.1.CO1.1.1.CO1.UCO1.1.1.CO1.1.1.1omO1.1.1.二O1.1.1.IO1.1.1.1O1.1.1.1O1.1.1.131OOO1.I1.1.1.US630011I1.1.1.第三部分是:扩展ASCII打印字符(第一第三部分详见ASCII码&(httpW)耨择),编码转换示例源文本:Thequickbrownfoxjumpsoverthe1.azydog'WJJ1.byq1244(hWI1.htqudb<g11gC“rpgErthe3ydog”式50SttS52071W6ttS3SBa>S272ff7ngatt¾6ffm3B"75Wt70%7n20Xff7¾6K72*20¾74t8¾85*20X6Ctt1VAVn2OS4UFXS7SQC.En:73002004006F006700HH0>646K2071756963682062726F77206UF78206A75CD7073206F7CS572207468652(KC617逐朦A7320646F7841041C1132n3117105tt107329811411111911032102111120321061171081121个建.MO5.32:X107DX>3T2Be68268081D3542M1X>6MD5.16:372BB68268D8W之上4JBe64:MGM(XJGZeCBW1we©QnWHRQZSBsgSGRvZi47SBte64:T号号CSMOCASCH编码对应十进制:84104IO1.32113117105991073298114I1.1.11911032102I1.1.1203210611710911211532I1.1.11810111432116104IO1.321089712212132100I1.1.103对应可以转换成二进制,八进制,十六进制等。2.Base64,3216编码base64、base32,base16可以分别编码转化8位字节为6位、5位、4位。16,32.64分别表示用多少个字符来编码,这里我注重介绍base640Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的emai1.,emai1.viaM1.ME,在XM1.中存储复杂数据。编码原理:Base64编码要求把3个8位字节.转化为4个6位的字节,之后在6位的前面补两个0,形成8位个字节的形式,6位2进制能表示的最大数是2的6次方是64.这也是为什么是64个字符(A-Z,a-z,0-9.+./这64个编码字符,=号不属编码字符,而是填充字符)的原因,这样就需要一张映射表,加下:TBase64A1.phabetVa1.ueEncodingVa1.ueEncodingVa1.ueEncodingVa1.ueEncoding0A11R34i51z1B18S35j5202C19T36k5313D20U3715424E21V38a5535F22W39n5646G23X40o5757H24Y41P5868I25Z42q5979J26a4360810K27b44s619111.28c45t62>w*Z712M29d46u3i13N3047v14031f48w-15P32g49xy16Q33h50yT号号CS20G举个例子(base64):>源文本:The>>对应ascii码:84104101>>8位binary:010101000110100001100101>>6位binary:010101000110100001100101> 高位补0:OOOO1O1O1000001100010000100100101>> 对应ascii码:2163337>> 查表:VGh1.利用Pythonbase64模块,我们分别可以这样加密解密base643216:31GW1.NDOWSsy*tem32cmd.eMe-pythonC:Users1.>pythonPython2.711(v2.7.I1.:6d1.b6«68f775.Dc52015.20:40:30)ISCv.150064bit(AID6TyPe"h1.p","copyright",'credits,or"1.icene“formoreinformation.> >>Icportby64_rnj*en=Tr.÷r;i:kbrof:xC)VertheIiiy1g> »11dwen=base64.b64encode(11ingwen)printniwn加七部分VGh1.IHFIafNrIGJyb3duIGZveCBqd1.1.wcyvttaVyIHRoZSBsYXp5IGRvZw三三J>»ai*en1.三base64.b32encode(mi11swen)k»printdwen1.tRUGK1.DROVUIG2ZA三JZG653OEBTG66BANJ2124DTEBXX1.Z1.SEB2GQZJMiRQXU6JAIEXVO=> »miwn2abas64.b1.6ncod(mingwn)»>print11dwen25468G52Qn75三36B2<27261.Z三M6E782m261.西嗣22fi748652K6"Am0M61-»base5deco3Eas64.b64decodeCndwen)»>printbase64decodehequickbrownfoxjuapsoverthe1.azydo> »base32decode=bas64.b32decode(11uwen1.)> »printbas32dcod½fitzxhequickbrownfoxjua*>soverthe1.azydoWP73»>bas1.6dcodb*se64.b1.6decode(miwen2)»printbas16dcodhequickbrownfoxju三(>soverthe1.azydog> ».3.she1.1.code编码源文本:Thequickbrownfoxjumpsoverthe1.azydog'编码后:SDGW1.NOOWSsystm32cmd.eMC:UsersS,annye1.fDesktop>pythonShe1.1.codeencdec.Pysh*1.1.codhexencodedcoderro<ra11nr:guns1.in<r.<yudh*.gun1.in(rat(11ui1.co0>Whatdoyouwanttodo?/decode> >decodeP1.sinputdata:x54x68x65x7f717569x63x6b7f62x726fx77x6x7fx6*x75x6dx70x73x7fx6fx76x65x727f74x68x65x7fx6cx61x7ax79x7fx6<nx->5468657f717569636b7f62726f7767f666f787f6756d70737f6f7665727f7468657fp1.aintext>Thequickbro»nfoxju11<>soverthe1.azydogZ:UsersSunnye1.fDe三ktop>4 .Quoted-printab1.eIe码它是多用途互联网邮件扩展(MIME)一种实现方式。有时候我们可以邮件头里而能够什到这件:勺编码,编湾原理咨用(.000-0C84B99647CCMIBD7BA2O4FDF3A9719DF17153112010C50Otaco.CatntTj.t*xthta1.chrst=*cb2312*CoaUat-Trbtf«r'Encodimot44*pribttb1.pdus=3HsoVorat1.Xsptnsty1.=3ITfont-f1.y=CB=CC=K,>=C4=BF=C7=B0=D!=CT三DF三D3=D0三D2=BB三B8=F6=C!三DZ三=DF=B2三CA三C6=B1.三BF=CD=BB=A7=B6=CB=BD=三D3=C8=K=D6三A7=B8=B6三B1三A5三C7=A!=BO=FC=CT=11=C4=BF三A3=AC三B8三C3=CF=11=C4=BF=三D0三E8三C7三F3三D6三F7三D5三BIspa×spta13=3DEV*USArv0卬QG三3D,font-fi1.y三CB=CZ三CC三!5,>=BK=BF三DCC三Z1.=B9=9=D6=A7三B3=D6三H=nF=f三1.n=F=f7=n=Rr=11teF=RTter=11三i1.=n<<>nXtnn1.nnFW-rX源文木:,敏捷的棕色狐狸跳过了懒惰的狗'编码后:958F898495898B9087868792839848B97/f,9Wf15i!.(http.,''too1.sQuotedPrintab1.e.asp)5 .XXencode编码XXencode将输入文本以每三个字节为单位进行编码。如果最后剩下的资料少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit以6bit为单位分为4个组,每个组以上进制来表示所出现的数值只会落在O到63之间。以所对应值的位置字符代替。它所选择的可打印字符是:+-0123456789ABCDEFGH1.JK1.MNOPQRSTUVWXYZabCdefghijk1.mnOpqrStUVWxyz,一共64个卞符。跟base64打印字符相比,就是UUen8de多一个“二字符,少一个7字符。XXoncodeIB阳鸭校过程字符串,Ca'编码后是,Eq30源文本:Thequickbrownfoxjumpsoverthe1.azydog,编码后:'hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gM1.cft64FjNkc+'编码解码/近拉.KhttpjTwebchacuomevcharsetxxencode)6 .UUencode编码UUenCode是一种二进制到文字的编码,最早在UniX邮件系统中使用,全称:Unix-to-Uni×encoding,UUencode耨输入文本以每三个字节为单位进行编码,如果最后剩卜.的资料少于三个字节,不够的部份用零补齐。三个字节共有24个Bit,以6-bit为单位分为4个组,每个组以十进制来表示所出现的字节的数值.这个数值只会落在。到63之间。然后将每个数加上32,所产生的结果刚好落在ASCI1.字符集中可打印字符(32空白95底线)的范囤之中.源文本:Thequickbrownfoxjumpsoverthe1.azydog,编码后:'M5&AEC%U:6-K(&)R;W=N(&9O>-!J=6UP<R!O=F5R('1H92!1.87IY(&1O9PH*'编例解WMi连拉KhHPW7 .UR1.编码Ur1.编码又叫百分号编码,是统一资源定位(UR1.)编码方式。UR1.地址(常说网址)规定了常用地数字,字母可以直接使用,另外批作为特殊用户字符也可以直接用":等),剩下的其它所有字符必须通过xx编码处理.现在已经成为一种规能了,施本所有程序语言都有这种编码,如js:有encodeURI、encodeURICompoet.PHP有Ur1.enCOde、UrIdeCode等。编码方法很简单,在该字节ascii码的的16进制字符前面加.如空格字符.ascii码是32.时应16进制是20',那么Ur1.enCOde编码结果是:20源文本:Thequickbrownfoxjumpsoverthe1.azydog*编码后:%54%68%65%20%71%75%69%63%6b%20%62%72%6f%77%6e%20%66%6f%78%20%6a%75%6d%70%73%20%6f%76%65%72%20%74%68%65%20%6c%61%7a%79%20%64%6f%67编码解码锥接(http:/W8 .Unicode编码Unicode编码有以下四种编码方式:源文本:The'&xHex:'&xOO54;&xOO68;&xOO65;,&Decima1.:'&00084:&00104;&00101;,UHex:'0054U0068U0065'U+(Hex:,U+0054U+0068U+0065,i心解"Hi1.(http,too1.sU11ide.asp×)9 .EscapeUnescape彘码EscapeZUnescape加定解码/编码解码,又叫u编码,采用UTF16BE模式,ESCaPe编码/加密,就是字符对应UTF-1616进制表示方式前面加u。UneSCaPe解码/解密,就是去掉.%u"后,将16进制字符还原后,由Utf-16转科到自己目标字符如:字符“中二UTF-16BE是:-6d93",因此EScaPe是u%6d93源文本:The'编码后:'%UOO54%UoO68%UOO65'10 .HTM1.实体编码Kif实体81*实体H.QU0tMX)nHMriC&QUOt;&"4;'j.,apostrophe4apos;&"9W&ersandmp;&*冽穿<Issth4n8;&*60;'1>greatcr-tfu&6;“620皂完够编码FdH分明(.CR/tags/htm1._ref_entities,htm1.)11 .敲击码敲击码(TaPCode)是一种以非常简单的方式对文本信息进行编码的方法。因该编码对信息通过使用一系列的点击声音来编码而命名,敲击码是基广5x5方格波利比奥斯方阵来实现的,不同点是是用K字母被整合到C中,敲击码表:12 345123412.莫尔斯电码孽尔斯电码(MorSeCode)是由美国人萨缪尔孽尔斯在1836年发明的一种时通时断的且通过不同的排列眼序来表达不同英文字母、数字和标点符号的信号代码,摩尔斯电码主要由以下5种它的代码组成:1 .点(.)2 .划<-)3 .每个字符间短的停顿(通常用空格表示停顿)4 .每个词之间中等的停顿(通常用划分)5 .以及句子之间长的停顿摩尔斯电码字母和数字对应表:AN,.,+1B0一一一2CP:-.$3DQ”&.4E.R,5.FS.!-6GT-?7.H.U8.I.V.一9JW0KX(1.V).M-Z=源文本THEQUICKBROWNFOXJUMPSOVERTHE1.AZYDOG'编码后:/线编码解码传送门(httpJrumkin.8moo1.sCiPhermorse.php)摩尔斯电码除了能对字母数字编码以外还对一些标点符号,非英语字符进行了编码,而II还仃些特定意义的组合称为特殊符号,比如''表达的意思是调用信号,表示我有消息发送丁如果你感兴趣可以参考WiKi)(https:zh.wikipedia.org/wiki/%E6%91%A9%E5%B0%94%E6%96%AF%E7%94%B5%E7%A0%81)13.编码的故事推荐大家去看编码的故(httpywenku.baidu.m1.ink7ur1.=kTrscV5j5AsZq5zvBr2jdkEJW81.qgrkkKsddwWA3YI×mgeqhbe95nMxqbFPOYoVBVy3A61.ut1.cXVDY1.dZ-3iRawJpcOVZ71asO7FnxtGS)-文.各种文本加密文本加密可以将正常文本内容打乱为不可连读的文字或符号(汉字数字字母音乐符号国际音标盲文韩文日文傣文彝文箭头符号花朵符号俄文),换行等格式信息也会被清除,达到加密的作用。在进行文本加密时可以设定一个密科,这样只有知道密码的人才能解密文本.密码可以是数字、字母和下划线,最多九位。加密示例:源文本:,敏她的棕色狐狸跳过了懒惰的狗'文本加密为盲文敢撞的橡色舞狸跳过了恻柿的狗DQg口使用注码r?Mri11.:二H/诰门:TJM-加密:文本粮渔入原妫文本,便廨码则在定码衽中设定一个备码,点、击溷按拈,下方将显示加茁JB的文:飕:文本低帼入艇文本,如果有声日则在=根中渔人艇击码,点击第击搜W,下方杼显示*法后的这个文本底和解密工具可以将正常文本内S?打81为不可连读的文字或符号,决行与格式信息也会根檎,码,这祥只有如S1.击码的人才能第密文本.茁网可以是数字、字母和下打线,最多九位.将文本加密为以下钠(窑文为不可连读的指定字TD:汉字数字字母音乐符号国际音标文帏文日文傣文文箭头符号花朵符号俄文编码解啊WHeJ(httpW1.www.qqxiuzi.crvbianma,Wenbenjiami.php)换位加密1.楣栏密码”(1)介绍“拙栏密码(Rai1.-fenceCiPher)就是把要加密的明文分成N个一组,然后把每组的第1个字符组合,每组第2个字符组合每组的第N(最后一个分组可能不足N个)个字符组合,最后把他们全部连接起来就是密文,这里以2栏栅栏加密为例。明文:'Thequickbrownfoxjumpsoverthe1.azydog'去空格:Thequickbrownfoxjumpsoverthe1.azydog'分组:'Thequickbrow11foxjmpsovertheIazydog'第-1:Teucbonojmsvrh1.zdg"第一组:'hqikrwfxupoeteayo'密文:'Teucbonojmsvrh1.zdghqikrwfxupoeteayo'i川解密传辽"(httpJ/WWW2.曲路密码曲路密码(CUrVeCiPher)是一种换位密码,需要事先双方约定密钥(也就是曲路路径)。明文:'Thequickbrownfoxjumpsoverthe1.azydog-填入5行7列表(事先约定侦充的行列数)TheqUICkbr0Wf0XIUmPS0VertheIaZyd0i加密的网路线(事先约定填充的行列数)J1._1.h*qUICkbr0Wnf0XJUmP$0VertheIaZYd01.密文:'gesfcinphodtmwuqouryzejrehb×va100kT3列移位密码,(1)介绍“列移位密码(CoIUmnarTranSPOSitionCiPher)是种比较简单,易于实现的换位密码,通过一个简单的规则将明文打乱混合成密文.下面我们以明文Thequickbrownfoxjumpsoverthe1.azydog,窕钥howareU为例:填入5行7列表(事先约定填充的行列数.如果明文不能填充完表格可以约定使用某个字母进行填充)TheqUiCkbr0Wnf0XjUmP50VertheIaZyd0g密钥:'howareu'按howareu在字母表中的出现的先后顺序进行编号,我们就仃a为1,e为2.h为3,。为4,r为5,U为6W为7所以先写出a列,其次e列,以此类推写出的结果便是密文:浜W涧uh密文:'qoryinphoTkoo1.hb×vauwmtdcfsegerjez"这里提供一个行列数相等的填充规则列移位密码加解密链i(httpyciphersc1.assica1.-eraco1.umnar-Iransposition/)另外由列移位密码变化来的密码也有其他的,比如Amsco密',1.(httpkryptosamsco-cipher)(AmscoCiPher)和Cadenus密网(http:小VWW.thonky.CorTVkryptosCadenUS-CiPher)(CadenIJSCipher).替换加密1.埃特巴什码,*(1)介绍“埃特巴什码(AtbaShCiPher)是一种以字母倒序扑列作为特殊密钥的替换加密,也就是卜面的时应关系:Abcdefghijk1.mnopqrstuvwxyzZyxwvutsrqponm1.kjihgfedcba明文:'thequickbrownfoxjumpsoverthe1.azydog'密文:'gsvjfrxpyi1.dm1.cqfnkhIevigsvozabw1.t'>J1.1.Mzf(rif(http1',ciphersc1.assica1.-eraatbash-cipher)291.擞密码“(1)介绍“凯撒密码(CaeSareiPher或称恺撒加密、恺撒变换、变换加密'位移加密)是种替换加密,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被苻换成密文。例,当偏移量是3的时候,所有的字母A将被音换成D,B变成E,以此类推.更多参州https:/en.wikipedia.org,Wiki/Caesajcipher)加密实例:明文:'ThequickbrownfoxjumpsovertheIaZydog'偏移量:1密文:'Uifrvjd1.csp×ogpykvnqtpwfsuifmbazeph'CaesarencryptionInputtxtThequickbrownfoxjumpsoverthe1.azydogTransfoanauonTranstormat)nTransformedtxtROTOThequickbrownfoxjumpsOVefthe1.azydogROT1Urfrvd1.cspxogpyKvnqtPWfSufmbazephROT2Vjgswke11)dtqyphqzIwocuqxgtv)gnct)afqtROT3WWitx1.fneurzqIramxpsvryuwithodct>gROT4X1.iUymgONSafjsbnyqtwSZjVxpedchskROT5Ym1.VZnhPgwtosUcozruxIafWymQfe<JmROT6ZnkWaoqhxud1.udPaSVyUDKXZnkrg1.eumROT7MXt)PjrryvdumveqMwzvdyaoShgfKVnROT8BpmycqksJzwev11wfrcuxaWdmZbpmtihg>wo你也可以使用Python的PyCiPher模块来加解密,如果提示没有这个模块可以通过.pipinsta1.1.PyCiPher,途看,其他方式来安装pycipher模块。»>fromimport»>1»>参考表(这里是向后移位加密,向前移位解密):机I1.密码位移规律发2三w18*i1.1.K1.iropqrstovvxtJk1.iiopqkstuvvxCdefcbijk1.iroDCDEFCBIJ