目录
1.base64,base32 ,base16编码
1.1.base64编码
base64索引表
Base64是用于传输8Bit字节码的编码方式之一,每6个比特 作为一个单元,对应某个可打印字符,包括字母A-Z、a-z、数字0 - 9,这样共有62个字符,剩余二个在不同系统上而不同。每三个字节有24个比特,对应4个base64单元,即3个字节表示4个可打印字符。
例如:编码'Man'
如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个“=”号,代表补足的字节数。也就是说,当最后剩余一个八位字节(一个byte)时,最后6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号
例如
1.2 base32:
base32索引表
1.3 base16:
base16索引表
练习题一:
https://cryptopals.com/sets/1/challenges/1
import base64
s='49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d'
flag = base64.b16decode(s)
print(flag)
小结:
1、base16编码其实就把字符转成ascii码的16进制。
2、b64encode和b16encode只能对bytes类型的数据进行编码,但解码时可以对bytes类型和string类型的数据都可以解码。
1.4、补充常见的密码
1.4.1古典密码学
古典密码的加密是将明文的每一个字母代换为字母表中的另一个字母。
1.4.1.1凯撒密码
凯撒密码加密时将明文中的每个字母按字母表顺序向前或向后移动固定数目作为密文
题目
加密一次,再来一次,然后回到起点。1Ebbg8Vf7Abg3Nyybjrg
思路:2次,为Rot13
1.4.1.2 移位密码
移位密码可以任意移动,后期不仅处理26个字母,还会处理数字和特殊字符。参照ASCII表进行位移。
1.4.1.3 仿射密码
原理
仿射密码的加密函数是E(x)=(ax+b)(mod m),其中
- x表示明文按照某种编码得到的数字
- a和m互质
- m是编码系统中字母的数目
解密函数是D(x)=a-1(x-b)(modm),其中a-1是a在Zm群的乘法逆元。
乘法逆元:
a* a -1(mod m)=1例如:
加密
解密
具体python代码可参考:
题目
使用仿射函数y=3x+9加密得到的密文为JYYHWVPIDCOZ,请尝试对其解密。flag为flag{大写明文}。
思路:
y=3x+9——>3x + 9 = y(mod 26)——>x = 3^-1(y-9)mod 26(3的乘法逆元是9)->x=9(y-9)mod 26
注意是三等号
1.4.1.4多表代换密码
- 该算法基于5*5的字母矩阵,该矩阵使用一个关键词构造(即密钥)
- 从左到右、从上到下顺序,填入关键词的字母(去除重复字母)后,将字母表其作余字母填入。(I=J)
- 将明文两个分为一组,若出现相同字母,则用X替代最后字母。在每组中,查找矩阵替换:
- 若两个字母同行,则用右方字母替换
- 若两个字母同列,则用下方字母替换
- 若即不同行也不同列,则用矩阵对角字母替换
1.4.1.5 棋盘密码
1.4.1.6 Vigenere维吉尼亚密码
使用26个字母购成字母阵横行为明文列,纵向为密钥列
加密: C = P + K(mod26)
解密: P = (C-K)%26
题目:
今天来和Caesar学习一-点新知识吧: Google下?听说与FLAG这个字符串有关: kwam{atgksprklzojozb}
思路:当时走了弯路,后来尝试了Vigenere
1.4.1.7 培根密码(bacon)
本质上是二进制,没有用01,而是AB
题目
先按照五个一组重新排序
bAcon iSaME aTpro dUcTp rePar edfrO mapig andUs uALLy cUReD
在对照表可以得到flag
ilikebacon
1.4.1.8 栅栏密码(Railfence)
2栏栅栏密码:
比如明文:THEREISACIPHER
去掉空格后变为:THEREISACIPHER
两个一组,得到:THEREISACIPHER
先取出每行第一个字母:TEESCPE
再取出每行第二个字母:HRIAIHR
连在一起就是:TEESCPEHRIAIHR
而解密的时候,先把密文从中间分开,变为两行:
T E E S C P E
H R I A I H R
再按上下上下的顺序组合起来:
THEREISACIPHER
分出空格,就可以得到原文了:
THEREIS A CIPHER
主要像是矩阵,以列为顺序依次取数。
多栏栅栏密码:
明文:THEREISACIPHER
七个一组:THEREISACIPHER抽取字母:TAHCEIRP EHIE SR
组合得到密码:TAHCEIRPEHIESR
可以通过分析密码的字母数来解出密码
比如:TAHCEIRPEHIESR
一共有14个字母,可能是2栏或者7栏
尝试2栏--》失败
尝试7栏--》成功当字母数m为偶数时,分栏数可能是其因子
当字母数m为奇数时,可能是前m-1个均分,最后一个独自成行,当然也可能m+1均分,任意分都有可能
题目
Caesar 被困住了2333333,13 根栅栏,怎么办?h{igr},aarclietflhf-_peecirroc,eo_fhlels caifnge
1.4.1.9 摩斯密码(Morse)
用.和_表示,以前用于发电报
可以在网上在线工具直接计算
http://www.zhongguosou.com/zonghe/moErSiCodeCon verter.aspx
或者:
http://rumkin.com/tools/cipher/morse.php