对编码和加密的学习——编码篇(1)

前言

在学习的时候发现很多地方都涉及到编码,特别是在学xss绕过的时候,一大堆编码,于是想学习一下编码方面的知识,并python和php写出编码的转换方式。最重要的是要了解生成编码的过程。

进制转换

在编码中很多都是用一个符号添加一个十六进制或者是十进制

int('0xf',16);#十六进制转十进制,结果为15
int('17',8);#八进制转十进制,结果为15
int('10100111110',2);#二进制转十进制,结果为1342
-------------------------------------------------------------------------------
hex(1033);#十进制转十六进制,结果为0x409
hex(int('101010',2));#二进制转十六进制,结果为0x2a
hex(int('17',8));#八进制转十六进制,结果为0xf
-------------------------------------------------------------------------------
bin(10);#十进制转二进制,结果为0b1010
bin(int('ff',16));#十六进制转二进制,结果为0b11111111
bin(int('17',8));#八进制转二进制,结果为0b1111
-------------------------------------------------------------------------------
bin(10);#十进制转二进制,结果为0b1010
bin(int('ff',16));#十六进制转二进制,结果为0b11111111
bin(int('17',8));#八进制转二进制,结果为0b1111
-------------------------------------------------------------------------------
oct(0b1010);#二进制转八进制,结果为012
oct(11);#十进制转八进制,结果为013
oct(0xf) ;#十六进制转八进制,结果为017

ASCII

ASCII编码大致可以分作三部分组成:

  • 第一部分是:ASCII非打印控制字符(参详ASCII码表中0-31);
  • 第二部分是:ASCII打印字符,也就是CTF中常用到的转换;
  • 第三部分是:扩展ASCII打印字符(第一第三部分详见 ASCII表 解释)。
    在这里插入图片描述

Base编码

Base编码分为很多类,主要的是Base64、Base32、Base16

Base64

Base64只要学习过网安的都听过,是现在最常见的传输8bit字节代码的编码方式之一。
在网络刚出现的时候传输信息都是使用的都是英文,但随着用户的增多,使用如:中文、日文、阿拉丁文之类的用户也有需求,这时Base64就登场了。通过转换来让浏览器识别各种文字。Base64是由[A-Z]+[a-z]+[0-9]+[+ /]共64位字符组成的,一般结尾会加上==这样的符号。

转换过程

例子:字符串Man

  1. 第一步将每三个字节作为一组,每个字节占8bit,总共是24个二进制位。如果不够三字节,有几位算几位。

  2. 第二步,将这24个二进制位分为四组,每个组有6个二进制位。

  3. 第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节。

  4. 第四步,根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。

0 A  17 R   34 i   51 z

  1 B  18 S   35 j   52 0

  2 C  19 T   36 k   53 1

  3 D  20 U   37 l   54 2

  4 E  21 V   38 m   55 3

  5 F  22 W   39 n   56 4

  6 G  23 X   40 o   57 5

  7 H  24 Y   41 p   58 6

  8 I   25 Z   42 q   59 7

  9 J  26 a   43 r   60 8

  10 K  27 b   44 s   61 9

  11 L  28 c   45 t   62 +

  12 M  29 d   46 u   63 /

  13 N  30 e   47 v

  14 O  31 f   48 w   

  15 P  32 g   49 x

  16 Q  33 h   50 y

在这里插入图片描述

简单阐述

  1. 先将字符分成三个一组,不够三个的就自己组合,如abcdeabc为一组,de为一组。

  2. 然后对应ASCII表获取十进制

  3. 将十进制转化为二进制

  4. 将二进制拆分开,以6bit为格式分成了四组,这里要看第一步,如果不够三个的在后面补上0补齐6的倍数。
    在这里插入图片描述

  5. 将这四组前面都加上006bit变成8bit

  6. 8bit转为十进制

  7. 将十进制对应Base64表找到对应的字符

代码

python

python3python2不一样,由于python3采用了unicode编码,而b64encode函数参数为byte类型,所以需要转换才可以使用。

import base64
a = 'Man';
b = base64.b64encode(a.encode('utf-8'))
c = base64.b64decode(b)
print(b);
print(str(c,'utf-8'));

------------------------------------
b'TWFu'
Man

PHP

<?php

$a = 'Man';
$b = base64_encode($a);
echo $b.'<br>';
echo base64_decode($b);
?>

-----------------------------
TWFu
Man

Base32、16

可以使用Python代码将64改成32或16进行使用,其他的只是在Base64进行修改。

shellcode编码

这个编码常见于拿shell使用,所以叫shellcode
\x+十六进制组合合成,在xss系统漏洞中比较常用。

XXencode编码

Base64非常像,差别就是UUencode多一个“-” 字符,少一个”/” 字符。

UUencode编码

这个好像很少用,先不学习。

URL编码

url编码又叫做百分号编码,是统一资源定位(URL)编码方式。
%+十六进制组合合成
可以发现很多都是对十六进制的修改

Unicode编码

这个编码在xss中最常见,用来绕过WAF用的
源文本: The

&#x [Hex]:					 &#x0054;&#x0068;&#x0065;(十六进制)
&# [Decimal]: 			     &#00084;&#00104;&#00101;(十进制)
\U [Hex]:					 \U0054\U0068\U0065(十六进制)
\U+ [Hex]:                  \U+0054\U+0068\U+0065(十六进制)

敲击码

敲击码(Tap code)是一种以非常简单的方式对文本信息进行编码的方法。因该编码对信息通过使用一系列的点击声音来编码而命名,敲击码是基于5×5方格波利比奥斯方阵来实现的,不同点是是用K字母被整合到C中。
敲击码表

  3  4  5
 A  B C/K D  E
 F  G  H  I  J 
 L  M  N  O  P
 Q  R  S  T  U
 V  W  X  Y  Z

在这里插入图片描述

莫尔斯电码

摩尔斯电码(Morse Code)是由美国人萨缪尔·摩尔斯在1836年发明的一种时通时断的且通过不同的排列顺序来表达不同英文字母、数字和标点符号的信号代码,摩尔斯电码主要由以下5种它的代码组成:

  1. 点(.)
  2. 划(-)
  3. 每个字符间短的停顿(通常用空格表示停顿)
  4. 每个词之间中等的停顿(通常用 / 划分)
  5. 以及句子之间长的停顿
    摩尔斯电码字母和数字对应表:
A  .-    N  -.    .  .-.-.-  +  .-.-.    1  .----
B  -...  O  ---   ,  --..--  _  ..--.-   2  ..---
C  -.-.  P  .--.  :  ---...  $  ...-..-  3  ...--
D  -..   Q  --.-  "  .-..-.  &  .-...    4  ....-
E  .     R  .-.   '  .----.  /  -..-.    5  .....
F  ..-.  S  ...   !  -.-.--              6  -....
G  --.   T  -     ?  ..--..              7  --...
H  ....  U  ..-   @  .--.-.              8  ---..
I  ..    V  ...-  -  -....-              9  ----.
J  .---  W  .--   ;  -.-.-.              0  -----
K  -.-   X  -..-  (  -.--.           
L  .-..  Y  -.--  )  -.--.-          
M  --    Z  --..  =  -...-             
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值