编码解码——(浅学)

前言

![思维导图](C:\Users\LQ\Pictures\Screenshots\屏幕截图 2024-10-27 152037.png)

在CTF密码学中,编码解码是很重要的部分。编码是将信息从一种形式转换为另一种特定形式,而解码则是编码的逆过程。

密码学的发展是从古典密码到现代密码,以下是我的了解:

  • 古典密码学——密码体系的安全性取决于算法和密钥的保密;
  • 现代密码学——密码体系的安全性取决于密钥的保密;
  • 非对称密码算法(公钥密码算法)——加密和解密的密钥不同
  • 对称密码算法——加密和解密的密钥相同

以下开启我在drops培训里所学到的编码与解码

古典密码

凯撒密码

它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成

密文。

例如,当偏移量为左移3时

明文:ABCDE

密文:DEFGH

此时密钥为3

培根密码

培根密码的本质是将字母用一串二进制数替换,但是表示的过程中,没有采取0和1的形式,而使用a和b来代替

加密的过程首先将要加密的内容根据加密表里的内容进行替换, 如a用AAAAA替换,b用AAAAB替换。 替换完之

后,我们可以把A和B当作两个不同的特征(如大写/小写,正体/斜体)带入到一个无关的句子中, 这就得到了我

们加密后的结果。

例如 任选一句话,将a当作小写,b当作大写

明文:Happy Birthday

密钥:aaabb ababb abbaa

密文:hapPY bIrTHdAY

维吉尼亚密码

是由一些偏移量不同的恺撒密码组成。

![](C:\Users\LQ\Pictures\Screenshots\屏幕截图 2024-10-27 160210.png)

加密原理

它使用一个密钥词,根据这个密钥词来循环决定每个明文字母应该按照哪种凯撒密码(单表替换密码)进行替换。例如,有一个密钥词是“KEY”,明文是“HELLO”。首先,密钥词“KEY”会重复,使其长度与明文长度相同,对于“HELLO”就变成“KEYKE”。
字母H按照以K为偏移量的凯撒密码进行加密(在英文字母表中,A是0,B是1,以此类推,K对应的数字是10,所以H加密后对应的字母是R,因为H往后数10个字母是R),E按照以E为偏移量的凯撒密码加密,第二个L按照以Y为偏移量的凯撒密码加密,以此类推。

解密过程

解密时,需要知道密钥词。计算出每个密文字母相对于对应密钥字母的偏移量,然后还原出明文。例如,如果密文是“RDLUL”,密钥是“KEY”,对于字母R,因为K对应的偏移量是10,所以往前推10个字母就可以得到H,从而解出。

栅栏密码

栅栏密码把要加密的明文分成N个一组,然后把每组的第一个字连起来,形成一段无规律的话,

例如:

  • THERE IS A CIPHER
  • 均分成两组,每组两个
  • TH ER EI SA CI PH ER
  • 先取出第一个字母,再取出第二个
  • TEESCPEHRIAIHR

base家族

base16

1.使用16个ASCII可打印字符(数字0-9和字母A-F),对任意字节数据进行编码。

2.先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来,再按照4比特一组进行切

分,将每组二进制数分别转换成十进制。

流程:给定的字符串根据Ascll标转化成二进制–>重新划分–>再转化为16进制

注:可以看到8比特数据按照4比特切分刚好是两组,所以Base16不可能用到填充符号“=”。 换句话说:

Base16使用两个ASCII字符去编码原数据中的一个字节数据。

base32

1.Base32编码是使用32个可打印字符(字母A-Z和数字2-7)对任意字节数据进行编码。

2.Base32主要用于编码二进制数据,但是Base32也能够编码诸如ASCII之类的二进制文本。

3.Base32将任意字符串按照字节进行切分,并将每个字节对应的二进制值(不足8比特高位补0)串联起来,按照5

比特一组进行切分,并将每组二进制值转换成十进制来对应32个可打印字符中的一个。

由于数据的二进制传输是按照8比特一组进行(即一个字节),因此Base32按5比特切分的二进制数据必须是40比

特的倍数(5和8的最小公倍数)。

流程:给定的字符串根据Ascll标转化成二进制–>重新划分–>再根据码表转换

重新划分:划分时最后不够5的后面先补0,总体不够40比特的倍数的补等号(一个等号就是5bit)

base64

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于,所以每6个比特为一个单元,对应某个可

打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。

由于数据的二进制传输是按照8比特一组进行(即一个字节),因此Base64按6比特切分的二进制数据必须是24比

特的倍数(8和6的最小公倍数)。

流程:给定的字符串根据Ascll标转化成二进制–>重新划分–>再根据码表转换

重新划分:划分时最后不够6的后面先补0,总体不够24比特的倍数的补等号(一个等号就是6bit)

辨析

是否有=,有为base32和base64,是否有1,有为base64,无为base32

都无=,不一定就是base16,base16只有字母A~F(特点)也可以有0