Crypto

1、常见编码

ASCII编码

ASCII值(10) ASCII值(16) 控制字符 ASCII值(10) ASCII值(16) 控制字符 ASCII值(10) ASCII值(16) 控制字符 ASCII值(10) ASCII值(16) 控制字符
0 0 NUT 32 20 (space) 64 40 @ 96 60
1 1 SOH 33 21 ! 65 41 A 97 61 a
2 2 STX 34 22 66 42 B 98 62 b
3 3 ETX 35 23 # 67 43 C 99 63 c
4 4 EOT 36 24 $ 68 44 D 100 64 d
5 5 ENQ 37 25 % 69 45 E 101 65 e
6 6 ACK 38 26 & 70 46 F 102 66 f
7 7 BEL 39 27 , 71 47 G 103 67 g
8 8 BS 40 28 ( 72 48 H 104 68 h
9 9 HT 41 29 ) 73 49 I 105 69 i
10 A LF 42 2A * 74 4A J 106 6A j
11 B VT 43 2B + 75 4B K 107 6B k
12 C FF 44 2C , 76 4C L 108 6C l
13 D CR 45 2D - 77 4D M 109 6D m
14 E SO 46 2E . 78 4E N 110 6E n
15 F SI 47 2F / 79 4F O 111 6F o
16 10 DLE 48 30 0 80 50 P 112 70 p
17 11 DCI 49 31 1 81 51 Q 113 71 q
18 12 DC2 50 32 2 82 52 R 114 72 r
19 13 DC3 51 33 3 83 53 S 115 73 s
20 14 DC4 52 34 4 84 54 T 116 74 t
21 15 NAK 53 35 5 85 55 U 117 75 u
22 16 SYN 54 36 6 86 56 V 118 76 v
23 17 TB 55 37 7 87 57 W 119 77 w
24 18 CAN 56 38 8 88 58 X 120 78 x
25 19 EM 57 39 9 89 59 Y 121 79 y
26 1A SUB 58 3A : 90 5A Z 122 7A z
27 1B ESC 59 3B ; 91 5B [ 123 7B {
28 1C FS 60 3C < 92 5C / 124 7C |
29 1D GS 61 3D = 93 5D ] 125 7D }
30 1E RS 62 3E > 94 5E ^ 126 7E `
31 1F US 63 3F ? 95 5F _ 127 7F DEL

还有扩展字符。ASCII码一共从0~255个字符。

Base64编码

简述: 将任意字节数据 通过Base64编码 生成可见的字符串(A-Z,a-z,0-9,+,/)。

算法:

  • 将非二进制数据转换为二进制数据
  • 6bit 为一组划分
  • 6bit 扩展成 8bit
  • 对照Base64编码索引表 得出编码后的 可见字符串
  • 若出现最后一组不足 8bit 则补0。每补 2bit 个 0 则在可见字符串结尾添加一个 ‘ = ‘

例如

  • 编码前字符串: abcd

  • 转换为二进制 00111101 00111110 00111111 01000000

  • 6bit为一组划分 001111 010011 111000 111111 010000 00

  • 扩展到 8 bit 00001111 00010011 00111000 00111111 00010000 0000

  • 补齐完整 00001111 00010011 00111000 00111111 00010000 00000000

  • 编码后字符串 YWJjZA==

  • 验证

使用python进行base64编码/解码

  1. import base64
  2. pwd = 'TVNEUzQ1NkFTRDEyM3p6'
  3. user = 'Can u see me'
  4. print(base64.b64decode(pwd))
  5. print(base64.b64encode(user))

Unicode

简述: 字符集,为每种语言中的所有字符设定统一且唯一的编码。相当于一本很厚的字典。使用4个字节表示所有字符。

例如: 国 –> Unicode编码 –> \u000056FD

UTF-8编码

简述: 实现了对ASCII码的兼容。能够灵活的变换长度

编码规则:

  • 单个字节的字符,二进制最高位为0,其余对应为Unicode码点[PS:字符对应编码后的数字]

    UTF-8 Unicode码点范围
    00xxxxxx 0000 0000 - 0000 007F
  • N个字节的字符,高字节高N位为1(判断字节数),第N-1位为0,剩余字节高2位为10,剩下二进制位对应Unicode码点。

    UTF-8 字节数 Unicode码点范围
    110xxxxxx 10xxxxxx 2 0000 0080 - 0000 07FF
    1110xxxxx 10xxxxxx 10xxxxxx 3 0000 0800 - 0000 FFFF
    11110xxxx 10xxxxxx 10xxxxxx 10xxxxxx 4 0001 0000 - 0010 FFFF

例子: “国” —> UTF-8编码 –> 0xE5 0x9B 0xBD

  • “国”对应Unicode码点 0x56FD (‭0101 0110 1111 1101)

  • 得出“国”对应UTF-8 格式为 ‬1110xxxx 10xxxxxx 10xxxxxx

  • 将Unicode码点从低位开始填充,不足补零

    11100101 10011011 10111101

  • 转换为16进制 0xE5 0x9B 0xBD

  • 验证 查看UTF编码

参考文献:彻底弄懂 Unicode 编码—hezh1994

URL编码

简述: URL编码格式采用 百分号+十六进制形式的ASCII码,解决在URL解析中出现字符解析歧义的问题。

对非法字符编码:对于非ASCII字符,官方RFC文档建议使用UTF-8进行编码得到相应字节。

编码过程例如:

①ASCII字符: url –> URL编码 –> %75%72%6c

  • u r l 对应转换为75 72 6c
  • 在加上百分号 %75 %72 %6c

②非ASCII字符: 你好 –> URL编码 –> %E4%BD%A0%E5%A5%BD

  • 你 好 对应转换为 0xE40xBD0xA0 0xE50xA50xBD

    UTF-8编码

  • 加上百分号 %E4%BD%A0 %E5%A5%BD

2、常见加密算法

换位加密

栅栏加密

算法:

  • 去空格后,将明文分割成N个/组
  • 将每组的第i个组合在一起
  • 将分割的字符串重新连接即得到密文。

例子: 明文 username password —> upsaesrsnwaomred

  • 分割 第一组 username 第二组 password
  • 组合 up sa es rs nw ao mr ed
  • 连接 upsaesrsnwaomred

曲路密码

算法:

  • 双方约定填充行列数、曲路路径(密钥)
  • 根据路径解密

例子: 明文 congratulationtoyougetthekey —> yentaogekuirgtoehyanolotttuc

  • c o n g r a t
    u l a t i o n
    t o y o u g e
    t t h e k e y
  • 规定从右下角方向向上为起点,左上角方向向上为终点。

  • 加密后的数据 yentaogekuirgtoehyanolotttuc

列位移

算法:

  • 双方约定填充行列数、字符串密钥。
  • 根据字符在字母表中的顺序取加密后的数据。

例子: 明文

  • 1 2 3 4 5 6 7
    c o n g r a t
    u l a t i o n
    t o y o u g e
    t t h e k e y
  • 规定密钥为 how are u ,分别对应顺序为 3471526

  • 第一个数字为3则到第3列取数据nayh

  • 以此类推 gtoe tney cutt riuk olot aoge

  • 最终加密得到密文 nayhgtoetneycuttriukolotaoge

替换加密

凯撒密码

算法: 明文中的所有字母都在字母表上向左(向右)按照一个 固定数字(正数为右移) 偏移(自身不计算次数)。

例子: welcome —> 偏移量1 —> xfmdpnf

  • 将每个字母都左移1个位置,即可得到密文 xfmdpnf

ROT5/ROT13/ROT18/ROT47

ROT5: 对数字进行编码。偏移量为5。0->5

ROT13: 对字母进行编码。偏移量为13。A->N

ROT18: ROT5、ROT13组合

ROT47: 对ASCII码中的字符进行编码。偏移量为47。A->p

维吉尼亚密码

简述: 根据密钥和密表进行加密解密。只能对字母进行加密。密文中同样的E可能对应不同的密钥,解决了字频统计破解密文。

维吉尼亚密表:第一列为明文字母,第一行为密钥字母

例子: 明文 flag:jiflag{I_Hn0w_n0thfng} –> 密钥 snbmos –> xybs:xaxybs{W_Zf0j_o0fvxft}

  • 从维吉尼亚密码表中查找 (f行,s列)为x,依次列推,行列相交取密文。
  • 忽视标点符号和数字

培根密码

简述: 使用AB、ab进行替代。本质上为二进制数。

算法:

  • 第一种方式
A aaaaa B aaaab C aaaba D aaabb E aabaa F aabab G aabba H aabbb I abaaa J abaab
K ababa L ababb M abbaa N abbab O abbba P abbbb Q baaaa R baaab S baaba T baabb
U babaa V babab W babba X babbb Y bbaaa Z bbaab
  • 第二种方式
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 z BABBB

例子: ABABAAABAABBAAA –> 培根密码 –> KEY

摩斯密码

简述: 通过不同的排列顺序和间隔停顿表达不同的字母、数字、符号。

对照表

3、JS混淆

简述:通过对JS变量名称和过程名称进行编码,通常使用eval()、function()进行混淆处理,保护代码段不透明。

常见混淆算法: JSFuck、Jother、aaencode

特点:

JSFcuk: 只存在 ()+[]! 这六个字符。

Jother: 使用少量字符进行编码。少量字符 !+()[]{}

aaencode: 将js代码编码为颜文字。[゚ε゚]+(゚ー゚)

4、非对称加密

简述: 使用两个不同的密钥进行加解密—-公开密钥和私有密钥。

典型非对称加密算法:RSA、ECC、ElGamal

5、对称加密

简述: 使用相同密钥进行加解密。

典型对称加密算法: DES、3DES、IDEA、AES

DES 特征: 64位密钥。因为其加密结果转换为Base64所以很容易误以为是Base64加密。除了ECB模式以外,都需要IV(偏移量),经常偏移量即密钥。

AES 特征: 分为AES-128 AES-192 AES-256 分别对应密钥长度为16B 24B 32B。因为其加密结果转换为Base64所以很容易误以为是Base64加密。除了ECB模式以外,都需要IV(偏移量),经常偏移量即密钥。

AES/DES加解密

6、摘要算法

简述: 对所有数据提取指纹信息加密,具有不可逆性。

典型摘要算法: MD5、SHA

MD5 特征: 长度分为16位和32位。最大值为 F 。由 数字和字母 组成

本文标题:Crypto

文章作者:Tanker

发布时间:2019年10月16日 - 12:30

最后更新:2019年10月26日 - 18:38

原始链接:https://www5059109.github.io/2019/10/16/Crypto/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%