编码
与密码区别:过程可逆
。
HEX
from Cryoto.Util.number import *
flag="flag{123}"
print bytes_to_long(flag)
print long_to_bytes(bytes_to_long(flag))
Base家族
base64/32/16:基于64/32/16种Bytes表示所有bytes。
base64 | a-z A-Z 0-9 + / 共64个以及 = |
base32 | A-Z 2-7 共32个以及 = |
base16 | 0-9 A-F 共16个 |
ASCII码
XXencode
UUencode
Shellcode
shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制之机械码,以其经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机械码,让电脑可以执行攻击者的任意指令。
源于谷歌
shellcode编码为可执行文件,其中特征为以PYIIIIIIIIIIIIII7Q
开头。
攻击:github 上下载 shellcodeexec 直接运行文件。
Unicode
为每种语言每个字符设定了统一并且唯一的二进制编码。
Escape/Unescape
又叫%u编码,采用UTP-16BE模式。
Escape编码/加密: 字符对应UTF-16 16进制表示方式前面加%u。
Unescape编码/解密: 去掉%u,将16进制还原,由utf-16转码。
HTML实体编码
字符 | 实体名称 | 实体编号 |
“ | " | " |
‘ | ' | ' |
& | & | & |
< | < | < |
> | > | > |
敲击码
对信息通过使用一系列的点集声音来编码而证明。
1 | 2 | 3 | 4 | 5 | |
1 | A | B | C/K | D | E |
2 | F | G | H | I | J |
3 | L | M | N | O | P |
4 | Q | R | S | T | U |
5 | V | W | X | Y | Z |
例子:O 位置 (3, 4) 敲击码为 … ….
莫斯电码
古典密码
m/p表示明文 K表示密钥 c表示密文。
移位密码
简单移位密码
明文根据k的长度分组,按照key值变换顺序。
曲路密码
明文填入一个表中,按照一定的顺序曲路遍历。
云影密码
只含01248四个数字,其中0用于分隔,其他数字做和之后转化为明文。
栅栏密码
密钥k表示栅栏长度。
遍历x(0-k):把要加密的明文分成k个一组,然后取每组第x个字符一次连接。
替代密码
替换表可以是单个或者多个。
单表替换
凯撒密码
埃特巴什码
通过将字母表的位置完全镜面对称后获得字符的替代表进行加密。
经典单表替代密码
完全没有任何顺序的替代。
培根密码
用两种不同的字体表示密文。
有正常的字也有斜体。
A | AAAAA | G | AABBA | N | ABBAA | T | BAABA |
B | AAAAB | H | AABBB | O | ABBAB | U/V | BAABB |
C | AAABA | I/J | ABAAA | P | ABBBA | W | BABAA |
D | AAABB | K | ABAAB | Q | ABBBB | X | BABAB |
E | AABAA | L | ABABA | R | BAAAA | Y | BABBA |
F | AABAB | M | ABABB | S | BAAAB | X | BABBB |
http://rumkin.com/tools/cipher/baconian.php
象形替代密码
猪圈密码、跳舞的小人等。
JS编码
在谷歌控制台可以直接输出的编码。
典型的JSFxxk编码、颜文字编码等等。
一些烧包编码
与佛论禅,与熊论道等等。
仿射密码
替代表生成方式:
c=am+b mod n
其中m为明文对应字母得到数字,n为字符数量, c为密文。a,b 为密钥。
解密 m = modinv(a)(c-b) mod n。
多表替代
维吉尼亚密码
密钥根据位置而产生改变。
攻击方式
词频统计
卡西斯基实验
三个相同的字母出现 :ABC
- 不同明文,不同密钥:碰巧
- 相同明文,相同密文:两个明文之间差为为密钥的长度的倍数。
分组密码
将明文分组(长度为n一组),分别进行加密。
- ECB
- CBC
- CFB
- OFB
- CTR
攻击方式
CBC比特翻转攻击
已知明文攻击
明文分成两组进行加密。
- Dec(C2)[i]=C1[i]^M2[2]
- M2[i]=Dec(C2)[i]*C1[i]
- X=Dec(C2)[i]^(C1[i]^X^M2[i])
在第一个分组对应位置上异或上X和M2[i]即可。
CBC选择密文攻击
明文每次加密前会和IV异或,IV每组会更新为上一组的密文。
- 待解密的密文为:C|C时
- Decrypt(C)^C=M1
- Decrypt(C)^IV=M0
- 综合得Decypt(C)^C^Decrypt(C)^IV=M1^M0
- IV=M1^M0^C
如果能通过一个oracle或者其他方式得到C|C密文的话,就可以逆推IV。
Feistel结构
如果F是线性→实现已知明文攻击。
- F()→Ki
- L, R
- R, L^R^K1
- L^R^K1, L^K1^K2
- L^K1^K2, R^K2^K3
- ……
每一轮都是可推理的,而且每个内容均为L^R^固定的常数。
只要知道一组明密文对,就可以解密所有密文。
序列密码(流密码)
流密码是使用一个随时间变换的加密变换,一次加密一个明文的独立符号单位。
通常都是 PRNG(由种子产生随机数)。
Random Prediction 随机数预测。
通过预测部分算法上的随机数进行攻击。
level 0:Brute Seed
调用python中的time()获取本地时间。
攻击方法:time.time()打印时间。
level 1:Linear Congruential PRNG
lever 2:hardrpd
杂凑函数(哈希函数)
消息摘要:把消息或数据压缩成摘要,使数据量变小。
cmd5网站可以进行查询。
哈希长度扩展攻击
MAC消息验证码:用于验证消息真实性,而伪造MAC可以下载文件。
如果知道message和MAC,和key长度,就算不知道key的值,也能计算出MAC。
MD结构hash函数特点:消息填充方式——添加一个1,再添加0到448同余。长度 % 512 == 448。每一块得到的链接变量都会被作为下一次执行hash函数的初始向量IV。在最后一块的时候,才会将其对应的链接变量转化为hash值。
格式:message+padding+extension
哈希函数以区块为单位操作数据,消息被填充到区块长度整数倍。
计算扩展值的第一步是创建一个新的MAC。
攻击者的MAC=SHA1(extension+padding)←覆盖registers初始值。
hashpump。
哈希碰撞
构造两个内容不一样的param,使其哈希值MD5一致,都能正常运行程序,但是做到的事情完全不同。
攻击方式:把构造的txt拖到fastcoll上面,生产两个xxx开头的文件,把MD5文件提交,就可以拿到flag。