密码学-古典密码
前言
古典密码学(Classic cryptography)和现代密码学(Modern cryptography)的主要差别在于计算机的使用,一般来说,古典密码学是基于字符的,而现代密码学是基于二进制位的。
代换
代换密码是将明文中的字符替代成其他字符,即替代转换,若整个加密过程中每个字符采用同一张表替代,则为单表代换密码,类似的,若整个加密过程中每个字符采用不同的表替代,则为多表代换密码,典型的单表代换密码有凯撒密码、培根密码等,多表代换密码有维吉尼亚密码等。
置换
置换密码(Transposition Cipher)是一种通过改变明文中字符的顺序,而不是替换字符内容来进行加密的密码方法。置换密码的基本特点是加密过程中没有字母的替换,所有的字符都保留原样,只是它们的顺序发生了变化。因此,置换密码通常被认为是一种通过排列顺序来混淆信息的方法
1.1凯撒密码
凯撒密码(Caesar cipher)就是将明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量为3时,所有的字母A将被替换成D,B变成E,以此类推
eg:
明文:flag{This is a example!}
偏移量:3
密文:iodj{wklv lv d hadpsoh!}
在线解密网址
https://www.qqxiuzi.cn/bianma/kaisamima.php
但是ctf比赛中,还有一种变异的凯撒,就是每一位的偏移量都是不一样的,但是之间的偏移量是有一定的规律的
eg:
先对应码表
可以看到第一个字符向后移了5,第二个向后移了6,第三个向后移了7,以此类推
str="afZ_r9VYfScOeO_UL^RWUc"
k=5
for i in str:print(chr(ord(i)+k),end='')k+=1
#以上只是一个简单的例子
#flag{Caesar_variation}
1.2培根密码
培根密码是一种替换密码,每个明文字母被一个由5字符组成的序列替换。以下是全部的对应关系(另一种对于关系是每个字母都有唯一对应序列,I和J与U/V各自都有不同对应序列):
如果你看到一串字符里全是A和B,并且5个一组的时候,没错了,就是他。培根加密只能加密字母。 flag ==>AABAB ABABB AAAAA AABBA
网址
https://www.metools.info/code/bacon193.html#google_vignette
1.3维吉尼亚密码
维吉尼亚密码是在单一恺撒密码的基础上扩展出多表代换密码,根据密钥(当密钥长度小于明文长度时一般为循环使用,密钥越长相对破解难度越大)来决定用哪一行的密表来进行替换,以此来对抗字频统计
为了生成密码,需要使用表格法。这一表格包括了 26 行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换
对于明文的第一个字母 A
,对应密钥的第一个字母 L
,于是使用表格中 L
行字母表进行加密,得到密文第一个字母 L
。类似地,明文第二个字母为 T
,在表格中使用对应的 E
行进行加密,得到密文第二个字母 X
。以此类推,可以得到:
明文:ATTACKATDAWN
密钥:LEMONLEMONLE
密文:LXFOPVEFRNHR
解密的过程则与加密相反。例如:根据密钥第一个字母 L
所对应的 L
行字母表,发现密文第一个字母 L
位于 A
列,因而明文第一个字母为 A
。密钥第二个字母 E
对应 E
行字母表,而密文第二个字母 X
位于此行 T
列,因而明文第二个字母为 T
。以此类推便可得到明文
链接:
http://www.hiencode.com/
1.4埃特巴什码
埃特巴什码是一种以字母倒序排列作为特殊密钥的替换加密,也就是下面的对应关系
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBA
明文:flag{This is a game!}
密文:uozt{gsrh rh z tznv!}
链接:
http://www.practicalcryptography.com/ciphers/classical-era/atbash-cipher/
1.5栅栏密码
特点:栅栏密码是一种简单的移动字符位置的加密方法,加密前后的字符数不变
栅栏密码的加密方式:把文本按照一定的字数分成多个组,取每组第一个字连起来得到密文1,再取每组第二个字连起来得到密文2……最后把密文1、密文2……连成整段密文
一般题目都会告诉栅栏数,如果没有只能进行枚举了
链接:https://www.qqxiuzi.cn/bianma/zhalanmima.php
1.6摩斯密码
特征:用点(.)和划(-)来编码范围0-9、A-Z的字符,字母不区分大小写,两个字母之间的空格用斜杠(/)或者三个点(.)或者一个划(-)表示,两个单词之间的间隔是七个点(.)。 根据摩斯编码的原理,CTF中也有出现过变种的摩斯编码,比如点(.)和划(-)用数字0和1来表示等此类变种的思路。
http://ctf.ssleye.com/morse.html (编码的时候不转换空格) http://rumkin.com/tools/cipher/morse.php (空格用斜杠表示)
1.7ROT5/13/18/47
ROT5:只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。
ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。
ROT18:这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。
ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126,
链接:http://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php
1.8常见的编码
1.8.1base家族
base64:
特征特点:密文由64个字符(A-Z,a-z,0-9,+,/)组成,末尾可能会出现1或2个’=’ 最多有2个
链接:
http://ctf.ssleye.com/base64.html
base32:
密文由32个字符(A-Z,2-7)组成,末尾可能会有‘=’,但最多有6个
链接:
http://ctf.ssleye.com/base64.html
base16:
密文由16个字符(0-9,A-F)组成
链接:
http://ctf.ssleye.com/base64.html
base36:
密文由36个字符(0-9,a-z)组成,加密仅支持整数数字,解密仅支持字符串,不支持中文 密文由36个字符(0-9,A-Z)
链接:
http://ctf.ssleye.com/base36w.html
base58:
Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址,Base58不使用数字”0”,字母大写”O”,字母大写”I”,和字母小写”l”,以及”+”和”/”符号
链接:
http://ctf.ssleye.com/base58w.html
base62:
密文由62字符(0-9,a-z,A-Z)组成
链接:
https://base62.io/(支持中文)
http://decode-base62.nichabi.com http://ctf.ssleye.com/base62.html(仅支持数字)
base91:
密文由91个字符(0-9,a-z,A-Z,!#$%&()*+,./:;<=>?@[]^_`{|}~”)组成
链接:
http://ctf.ssleye.com/base91.html
base100:
也就是常见的表情符号
1.8.2ascii编码
用1个字节的8位数来编码英文字符集,即所有字母数字等英文符号可以用二进制数、十进制、十六进制来表示。比如大写字母A可分别用二进制数(01000001)、十进制(65)、十六进制(0x41)来表示
个别的字母就是通过码表对照即可,这里可以结合变异的凯撒(对照前面的几个字母flag)
链接:
http://www.ab126.com/goju/1711.html
http://ctf.ssleye.com/cencode.html
1.8.3unicode编码
国际标准字符,将全球的各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台文本信息的转换,当编码和解码的字符集出现不一致的时候就会出现乱码。
一般有四种表示形式
链接:
http://tool.chinaz.com/tools/unicode.aspx
1.8.4URL编码
一个字符ascii码的十六进制,然后在前面加上%
%66 f
%61 a
%6C l
%67 g
链接:
http://www.hiencode.com/url.html
1.8.5brainfuck
密文由+.<>[]’ && ‘!.?或者’+-.<>[]’等组成
一般和Ook编码出现
链接:
https://www.splitbrain.org/services/ook
还有许多的编码,就不再阐述了
Reference
https://cloud.tencent.com/developer/article/1419464
https://xcbyao.com/2020/01/21/Crypto_classical/
https://blog.csdn.net/wanfengchuifu/article/details/135910625
https://hello-ctf.com/HC_Crypto/Classicalcipher/#rail-fence
后记
自己也是一个刚刚学习的小白...
如果文中有错误的地方,请各位大佬不吝赐教,也欢迎大家来捧场!