一. 引言
密码在我们的生活中应用于方方面面,我们的微信、QQ、支付宝、以及我们去银行取钱,都需要输入正确的密码,所以密码学在计算机信息安全上面都是非常重要的。我们现在每天打开的网络页面,浏览的视频内容都是表层网络,仅仅相当于网络世界中的冰山一角,隐藏于水下部分还有非常大,我们俗称为“暗网”,这里隐藏了较多的非法手段获取信息的手段,例如:我们在表层网络试图输入账号和密码登录系统,在整条信息传输链条上,我们的信息有可能在网络传输的任何环节被截获,如果我们传输的信息都是明文,那么对于“hacker”来说太好了,基本无需解密就能获取到用户的敏感信息。所以对数据加密,在数据传输环节就非常重要了,通常网络上通过数字证书、加密算法、非对称加密密钥等技术完成互联网数据传输加密,实现互联网安全保护。
其实密码学,在很早以前就存在,据说两千年前,古罗马名将凯撒为了防止敌人获取情报,便使用密码传送情报,凯撒的做法很聪明,就是为二十几个罗马字母建立一张对应表,如果不知道对应表,即便拿到情报也是无法解码获取具体信息的。
接下来我们结合CTF中的密码学考点,我们总体来介绍一下密码学,密码学分为简单编码和解码、古典密码和现在密码
接下里我们分别介绍一下对应的内容。
二. 编码和解码
2.1.比特
⼀个⽐特(位)可以表示两种状态:0 或 1。所有的信息最终都将表示为⼀个⽐特序列的形式。
2.2.字节
⼀个字节对应8⽐特。每个字节可以表示28=256种状态。8个⼆进制位为⼀个字节单位。⼀个英⽂字⺟(不分⼤⼩写)占⼀个字节的空间,⼀个中⽂汉字占两个字节的空间。英⽂标点占⼀个字节,中⽂标点占两个字节。
2.3.ASCII
ASCII(American Standard Code for Information Interchange, 美国信息交换标准代码),这是为了在计算机中表示字符,美国⼈搞的⼀套编码(所谓编码,其实就是字典),⼀开始只考虑了⾃⼰⽤得到的,包括:拉丁字⺟及标点符号、阿拉伯数字、⼀些控制字符。
2.4.URL(百分号)编码
统⼀资源定位符(Uniform Resource Locator, URL)是 Internet 上标准的资源地址,可视为⽹络上的⻔牌。
如果 URL 中出现了 拉丁字⺟ 、 阿拉伯数字 、 . -_~ 外的符号,则必须⽤使⽤百分号编码(转码),所以URL 编码也称为 百分号编码 。
⽐如我们⽤百度查询 1+2=3实际查询的⽹址是这样:https://www.baidu.com/s?wd=1%2B2%3D3
2.5.Base系列
base64 base64将6bit作为⼀个字节,因此base64可以有64种码值,包含**1-9,a-z,A-Z,以及“+”、“/”,还有“=”作为填充位。
base32 Base32使⽤了ASCII编码中可打印的32个字符(⼤写字⺟A-Z和数字2-7)**对任意字节数据进⾏编码.Base32将串起来的⼆进制数据按照5个⼆进制位分为⼀组,由于传输数据的单位是字节(即8个⼆进制位).所以分割之前的⼆进制位数是40的倍数(40是5和8的最⼩公倍数).如果不⾜40位,则在编码后数据补充"="。
三. 古典密码
3.1 换位密码(栅栏密码)
所谓栅栏密码,就是把要加密的明⽂分成N个⼀组,然后把每组的第1个字连起来,形成⼀段⽆规律的
话。这⾥以2栏栅栏加密为例。
明⽂:The quick brown fox jumps over the lazy dog
去空格:Thequickbrownfoxjumpsoverthelazydog
分组:Th eq ui ck br ow nf ox ju mp so ve rt he la zy do g
第⼀组:Teucbonojmsvrhlzdg
第⼆组:hqikrwfxupoeteayo
密⽂:Teucbonojmsvrhlzdghqikrwfxupoeteayo
3.2 单表替换密码
3.2.1 凯撒密码
加密时会将明⽂中的 每个字⺟ 都按照其在字⺟表中的顺序向后(或向前)移动固定数⽬(循环移动)作为密⽂。
当偏移量是 3 的时候:
明⽂:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密⽂:DEFGHIJKLMNOPQRSTUVWXYZABC
3.2.2 rot13
ROT13是凯撒密码的一个特例。k=13即偏移量是13正好是26个英文字母的一半。把每个字母的字母表中向前(或向后)移动13个字母。
特点:加密和解密算法完全相同
扩展————rot家族
rot5、rot13、rot18、rot47
ROT5:只对数字进⾏编码,⽤当前数字往前数的第5个数字替换当前数字
ROT18:这是⼀个异类,本来没有,它是将ROT5和ROT13组合在⼀起,为了好称呼,将其命名为
ROT47:对数字、字⺟、常⽤符号进⾏编码,按ASCII值进⾏位置替换(可显示的ascii共有94个),将字符ASCII值往前数的第47位对应字符替换当前字符。
3.2.3 乘法密码
模逆运算,满足:
3.2.4 仿射密码
是⼀种单表代换密码,字⺟表中的每个字⺟相应的值使⽤⼀个简单的数学函数映射到对应的数值,再把对应数值转换成字⺟。
这个公式意味着每个字⺟加密都会返回⼀个相同的字⺟,意味着这种加密⽅式本质上是⼀种标准替代密码。因此,它具有所有替代密码的弱点。
3.3 多表替换密码
3.3.1 普莱菲尔密码
是第⼀种⽤于实际的双字替换密码,⽤双字加密取代了简单代换密码的单字加密,很明显这样使得密⽂更难破译。
普莱菲尔密码⼜称为单⽅密码(Single Cipher)之后⼜出现它的升级版Double Playfair,也就是⼆⽅密码 (Two-square Cipher),在之后⼜有四⽅密码(Four-square Cipher)。
例如:2字母代换密码
密钥由5x5矩阵给定,将英文字母随机填入矩阵中,把i和j当作一个字母(因为矩阵只能装25个字母)
使用关键词生成密钥:可选定一个关键词作为密钥,除去重复字母后依次按行填入阵中,而后将字母表中还没用上的各字母继续按行填入阵中,得到密钥矩阵K。例:关键词monarchy
3.3.2 维吉尼亚密码
是在单⼀恺撒密码的基础上扩展出来的多表代换密码,根据密钥(当密钥⻓度⼩于明⽂⻓度时可以循环使⽤)来决定⽤哪⼀⾏的密表来进⾏替换,以此来对字频统计。
26 x 26 方阵
在线加密解密工具
脚本加解密
>>> from pycipher import Vigenere
>>> Vigenere('encryption').encipher('public key distribution')
'THDCGRDMMQMFVIGQNBWBR'
>>> Vigenere('encryption').decipher('THDCGRDMMQMFVIGQNBWBR')
'PUBLICKEYDISTRIBUTION'
3.4 替换密码
3.4.1 培根密码
是⼀种替换密码,每个明⽂字⺟被⼀个由5字符组成的序列替换,以下是两种对应关系:
3.4.2 莫斯密码
也叫莫尔斯电码,因⽆线电⽽⽣。由点、划、空格组成。
许多⼈都认为 SOS 是三个英⽂词的缩写。其实是和摩斯密码有关的。
sos的摩斯电码表示为: ··· — ··· 。三短代表S,三⻓代表O,所以紧急求救信号就被简称为
SOS。
S.O.S 是国际摩尔斯电码救难信号,并⾮任何单词的缩写。鉴于当时海难事件频繁发⽣,往往由于不
能及时发出求救信号和最快组织施救,结果造成很⼤的⼈员伤亡和财产损失,国际⽆线电报公约组织于1908
年正式将它确定为国际通⽤海难求救信号。光线发射⽅法为:短光——⻓光——短光。
3.4.3 猪圈密码
也称九宫格密码、朱⾼密码、共济会密码或共济会员密码,是⼀种以格⼦为基础的简单替代式密码。
参考:
例如:
在线加密解密
变种
圣堂武⼠密码(Templar Cipher) 是共济会的 猪圈密码 的⼀个变种,⼀直被共济会圣殿骑⼠⽤。
3.4.4 JSfuck
JSFuck 只⽤ 6 个字符 ! + 来编写 JavaScript 程序。
false => ![]
true => !![]
undefined => [][[]]
NaN => +[![]]
0 => +[]
1 => +!+[]
2 => !+[]+!+[]
10 => [+!+[]]+[+[]]
Array => []
Number => +[]
String => []+[]
Boolean => ![]
Function => [][“filter”]
eval => [][“filter”]“constructor”()
window => [][“filter”][“constructor”](“return this”)()
在线加解密
3.4.5 BrainFuck
BrainF**k 语⾔只有⼋种符号,所有的操作都由这⼋种符号 > < + - . , [ ] 的组合来完成。
在线加解密
3.4.6 Ook
由 Ook. Ook! Ook? 或者 . ! ? 三种组成
在线加解密
四. 现在密码
4.1 对称密码体制
对称密码体制是⼀种传统密码体制,也称为私钥密码体制。在对称加密系统中,加密和解密采⽤相同的密钥。因为加解密密钥相同,需要通信双⽅必须选择和保存他们共同的密钥。
4.1.1 流密码(Stream Cipher)
流密码也称为序列密码,每次加密数据流的⼀位或⼀个字节。
流密码的基本思想:利⽤密钥 ,并通过密钥流产⽣器产⽣⼀个密钥流
例如 RC4 密码就属于流密码
4.2 非对称密码
⾮对称密码体制也叫公钥密码体制,该技术就是针对私钥密码体制的缺陷被提出来的。在公钥加密系统中,加密和解密是相对独⽴的,加密和解密会使⽤两把不同的密钥,加密密钥(公开密钥)向公众公开,谁都可以使⽤,解密密钥(秘密密钥)只有解密⼈⾃⼰知道,⾮法使⽤者根据公开的加密密钥⽆法推算出解密密钥,顾其可称为公钥密码体制。
⼀般的钥匙都是既能上锁、也能开锁的。但是,⾮对称加密中,密钥有两种:公有密钥、私有秘钥。公有密钥⽤于上锁(加密)。私有密钥⽤于解锁(解密)。
4.2.1 RSA
最常⻅的⾮对称加密就是RSA。
(1)选择两个大素数p、q,且p不等于q;
(2)计算n=pq;
(3)计算φ(n)=(p-1)(q-1);
(4)选择一个整数e,1<e<φ(n),且e与φ(n)互质;
(5)计算d,满足ed ≡ 1 (mod φ(n)),换言之,d是关于φ(n)的乘法逆元。即ed % φ(n) = 1,其中%表示求余运算。
公钥为(n,e),私钥为(n,d)。
RSA在CTF比赛中还是一个常见的提醒,主要就是要提前准备好对应的脚本。后面我们会详细解读RSA的整体过程
五. CTF密码学技巧分享
其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但是会给留一些线索,所以写此文的目的是想给小伙伴做题时给一些参考,当然常在CTF里出现的编码也可以了解一下,文章肯定有许多没有提及到,欢迎小伙伴补充,总之,希望对小伙伴们有帮助吧!
CTF中的密码学也有很多技巧可以使用,比如1.熟练掌握密码工具的使用。2.理解应用各种编码知识。3.多了解各种各样的密码类型。最后,还需要一个扎实的数学功底,**为什么说数学很重要呢?**即便在CTF中我们接触到没有见到过的提醒,至少我们可以从数学出发,毕竟密码分析的各个环节都离不开数学分析,比如整除理论需要了解素数、合数、因数、倍数、整除等基本概念,掌握唯一分解定理、裴蜀定理、扩展欧几里得定理、算数基本定理等基本定理。同余理论需要了解同余、原根、底数、指数、平方剩余、同余式、同余方程等基本概念,掌握欧拉定理、费马小定理、中国剩余定理、二次互反律、威尔逊定理等基本定理。。
六. 结论与展望
CTF密码学的知识点可以说特别多,并且脑洞也特别大,所以在解题的时候,需要我们联系多种情况,开阔我们的解题思路。今天分享了部分CTF密码类型,以及提供了一些在线解题方法,密码学是一个不断发展的过程,加密手段和破解手段都是在不断发展中,所以密码学以后还会出现更多的类型。我认为CTF比赛中密码学会紧跟时代发展,不但要求比赛者对古典密码进行了解,更需要对现代密码,比如RSA这类,在我们生活中广泛应用的加密算法进行深入的掌握,RSA是一个很大的话题后续我们会进一步聊RSA相关的因式分解题目。
参考:
CTF中那些脑洞大开的编码和加密