CTF---密码学(2)--编码与解码-理论与实战详解

前文链接点这里:

CTF---密码学(1)--古典密码-理论与实战详解icon-default.png?t=N7T8http://t.csdnimg.cn/oasrk

PS:这一节是古典密码与现代密码的过渡

首先要清楚的一点是,编码解码是密码学的一个重要分支,其中,编解码更注重信息的转换及表示的优化,而密码学更注重数据的保护和安全性

编解码---ASCII编码

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最早的字符编码标准,用于在计算机系统中表示英文字符。ASCII编码使用7位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。

ASCII编码表包含128个字符,因为2的7次方等于128。这128个字符中,包括32个通用控制字符(如空格、制表符、换行符等),33个大写字母,33个小写字母,10个数字,以及一些标点符号和特殊符号。

ASCII编码的一个优点是简单性。它使用固定长度的字节来表示字符,每个字符只需要一个字节(即7位二进制)。这使得处理和传输数据变得相对容易。

然而,ASCII编码的局限性在于它只能表示基本的英文字符,对于其他语言和字符集(如中文、日文、韩文等)则无法表示。为了支持这些语言和字符集,许多扩展的字符编码标准被开发出来,如ISO 8859系列、GB2312、GBK、GB18030等。

 在python中,可以使用ord()来查看对应单个字符的十进制ASCII码:

C:\Users\l1834>python
Python 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ord('a')
97

 编解码---BASE编码家族

base64、base32、base16可以分别编码转化8位字节为6位、5位、4位。16,32,64分别表示用多少个字符来编码。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME,在XML中存储复杂数据。

编码原理:Base64编码要求把3个8位字节转化为4个6位的字节,之后在6位的前面补两个0,形成8位一个字节的形式,6位2进制能表示的最大数是2的6次方是64,这也是为什么是64个字符(A-Z,a-z,0-9,+和/这64个编码字符,=号不属于编码字符,而是填充字符)的原因,这样就需要一张映射表,如下:

表中的=号表示占位符,base64中占6位,base32中占5位,base16中占4位 

BASE64原理详解:

原本的数据:
luoyifang

对应的十进制ASCII码:
108 117 111 121 105 102 97 110 103

将十进制转换为8位一组的二进制:
01101100 01110101 01101111 01111001 01101001 01100110 01100001 01101110 01100111

将8位一组变为6位一组,因为bin(63)=0b111111,只有6位:
011011 000111 010101 101111 011110 010110 100101 100110 011000 010110 111001 100111

虽然转换为6位一组,但是由于计算机是以8位一字节来进行存储的,所以还需要在前面补零:
00011011 00000111 00010101 00101111 00011110 00010110 00100101 00100110 00011000 00010110 00111001 00100111

将补零后的8位一组的二进制,转换为十进制:
27 07 21。。。。。。 

最终转换为BASE64编码:
bHVveWlmYW5n



 但是上面的例子没有用到=,这是因为luoyifang转换为二进制后有72位,是6和8的公倍数,

下面我们来试试youi

源数据:
your

二进制ASCII码(8位一字节):
01111001 01101111 01110101 01110010

转换为6位一组:
011110 010110 111101 110101 011100 10

不够6位的要在后面用0补齐:
011110 010110 111101 110101 011100 100000

现在一共有6x6=36位,我们需要再添加2个=(再base64编码中,一个=占6位),
使实际的位数为6x6+6x2=48位(48是6和8的公倍数)
011110 010110 111101 110101 011100 100000 = =

最终的BASE64编码结果为:
eW91cg==

 编解码-ShellCode编码

映射表与ASCII相同,只是shellcode需要加上\x:

源数据:I am luoyifang

编码后:\x49\x20\x61\x6d\x20\x6c\x75\x6f\x79\x69\x66\x61\x6e\x67

编解码-Quoted-printable 编码

Quoted-Printable 编码是多用途互联网邮件扩展(MIME) 一种实现方式,它是一种用于将非 ASCII 字符编码为 ASCII 字符串的规则。它主要用于电子邮件等需要将非纯文本内容编码为文本格式的情况。

Quoted-Printable 编码的原理是将非 ASCII 字符转换为 ASCII 字符,同时保留可打印的 ASCII 字符。具体来说,它使用以下规则:

  1. 将每个非 ASCII 字符转换为一个或多个 ASCII 字符的编码序列。编码序列以“=”开头,后跟两个十六进制数字。
  2. 如果出现一个或多个连续的可打印 ASCII 字符,它们被视为一个整体进行编码。例如,“=A0”表示一个空格字符,“=C2=A0”表示两个连续的空格字符。
  3. 如果编码序列的结尾处出现“=”,则在末尾添加一个额外的“=”。
  4. 如果编码序列中出现一个或多个“=”,则将它们转换为“=3D”(即“=”的十六进制编码)。

Quoted-Printable 编码的优点是能够将非 ASCII 字符转换为可打印的 ASCII 字符串,同时保持文本的可读性。它广泛应用于电子邮件和新闻稿等需要处理多种字符集的文本传输中。

编解码---URL编码

URL编码是一种将特殊字符转换为URL安全字符的方法,主要用于在URL中传输数据。URL由协议、域名、端口号、路径和查询字符串等组成,其中查询字符串以"?"字符与路径部分进行分隔,以"&"字符与不同的参数进行分隔。

URL编码的主要原则是使用安全字符去表示那些不安全的字符。安全字符指的是没有特殊用途或者特殊意义的字符,例如字母、数字和部分符号。

在URL编码中,一些具有特殊意义的字符被用来分隔不同的URL组件,例如":"用于分隔协议和主机组件,"/"用于分隔主机和路径等。

URL编码通常分为两种情况:

  • 当URL路径或者查询参数中包含中文字符或特殊字符时,需要对URL进行编码。
  • 当在HTTP请求的URL中包含有特殊字符时,也需要进行URL编码。
源数据:
My name is @Luoyifang$

只编码特殊符号:
My%20name%20is%20%40Luoyifang%24

编码所有字符:
%4d%79%20%6e%61%6d%65%20%69%73%20%40%4c%75%6f%79%69%66%61%6e%67%24

编解码---Unicode编码

Unicode编码是ASCII字符编码的一个扩展,它使用全16位字符编码,因此能表示世界上所有能用于计算机通讯的符号。

目前的许多网站都默认使用UTF-8

Unicode编码规范制定标准是:把世界上所有能出现的字符,都为其分配一个数字来表示,比如,数字U+7F57被分配给了汉字中的"罗"字。

目前Unicode编码已经规划了U+0000至U+10FFFF为Unicode编码,其中前128个字符是ASCII码表,最多可以识别65536个字符,剩下的976183个代码点还未被分配对应的字符。

Unicode编码有以下四种编码方式
源文本:The
&#x [Hex]:The
&# [Decimal]:The
\U [Hex]:\U0054\U0068\U0065
\U+ [Hex]:\U+0054\U+0068\U+0065

编解码---HTML实体编码

HTML实体编码是HTML中用于表示保留字符或无法键入的字符的方法。在HTML中,一些字符被保留下来,用于定义HTML文档的结构和格式。这些被保留的字符包括"<"、">"、"&"等。如果想要在HTML文档中使用这些保留字符,就需要使用对应的HTML实体编码来代替这些字符。

HTML实体编码的格式为"&"加上对应的字符的英文名称或者是数字。

使用HTML实体编码可以避免因为保留字符被错误地解析而导致的格式错误或显示异常。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛一方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值