题外话:最近某人在参加CTF比赛,为了寻找共同话题,并督促很久没动过脑的我学习,也给我讲解了几道题。经过考虑,加密方面的题和我的专业相符些,所以决定先攻破这方面的一些习题,权作打发时间了。在此总结一些作题过程中涉及的算法,加深记忆。
1.base64
概述:把明文对应成64个字符的加密算法。
方法:每个字符对应8位二进制数,因此可把字符转化为二进制数。将每6个二进制数作为一个单位,那么共有64个这样的6位二进制数。设定64个字符与上述二进制数一一对应。如此,在对字符加密时,可先将字符转化为二进制数,再将二进制数对应到64个字符。
注意:字符转化的二进制数的个数一定是8的倍数,但不一定是6的倍数,不方便加密。一种解决方法是,将现有的数字进行补零,凑成6的倍数。但是,若补零后的二进制数的个数不是8的倍数,则在解密时又无法顺利转换为明文字符。因此,在补零时需要使二进制数的个数同时是6和8的倍数。目前,有一种通用的凑整方式:向明文字符中添加特殊的字符“=”(也可转化为8位二进制数)。明文字符转化的二进制数的个数只可能有三种情况:除以6余0,除以6余2,除以6余4。第一种情况无需处理,第二种情况下,在明文字符后加两个“=”,可将转化后的二进制数的个数变为6的倍数。第三种情况下,在明文字符后加一个“=”,可将转化后的二进制数的个数变为6的倍数。
2.Caesar加密
概述:把明文字符依次对应到后n个字符
方法:依次对应即可,如a对应到c,b对应到d,等等。
3.Morse码
概述:把明文字符对应成点和划。
方法:有根据字母形状设计的对应表。
4.幂数加密
概述:以序号代替英文字母,然后将序号表示为2的次方的和,将次方作为明文编码。
方法:如,e对应的序号为5,那么5=2^0+2^2,e对应的编码为02。
5.栅栏加密
概述:把一行明文分成n行,然后按列读取为密文。
方法:尽量把明文分割为长度相等的行,再读取。
注意:其变体是w型栅栏加密。
6.培根密码
概述:通过两种字符表示明文(以A和B为例)
方法:将明文中的每个字母都转换为A和B组成的5个字母。有对应密码表。
7.乱入一个新学到的方法,可以查看字符串的编码:
chardet.detect(s)
可查看字符串s的编码方式,置信度。
8.RSA加密