编码解码

古典密码

凯撒密码

  • 在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

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

  • 根据偏移量的不同,还存在若干特定的恺撒密码名称:偏移量为10:Avocat(A→K)偏移量为13:ROT13偏移量为-5:Cassis (K 6)偏移量为-6:Cassette (K 7)

维吉尼亚密码

  • 维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。维吉尼亚密码曾多次被发明。该方法最早记录在吉奥万·巴蒂斯塔·贝拉索( Giovan Battista Bellaso)于1553年所著的书《吉奥万·巴蒂斯塔·贝拉索先生的密码》(意大利语:La cifra del. Sig. Giovan Battista Bellaso)中。然而,后来在19世纪时被误传为是法国外交官布莱斯·德·维吉尼亚(Blaise De Vigenère)所创造,因此现在被称为“维吉尼亚密码”。维吉尼亚密码以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”(法语:le chiffre indéchiffrable)。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。 [1]

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

  • 例如,假设明文为:
    ATTACKATDAWN
    选择某一关键词并重复而得到密钥,如关键词为LEMON时,密钥为:
    LEMONLEMONLE
    对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L。类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X。以此类推,可以得到:
    明文:ATTACKATDAWN密钥:LEMONLEMONLE密文:LXFOPVEFRNHR
    解密的过程则与加密相反。例如:根据密钥第一个字母L所对应的L行字母表,发现密文第一个字母L位于A列,因而明文第一个字母为A。密钥第二个字母E对应E行字母表,而密文第二个字母X位于此行T列,因而明文第二个字母为T。以此类推便可得到明文。

培根密码

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

加密者需使用两种不同字体,分别代表A和B。准备好一篇包含相同AB字数的假信息后,按照密文格式化假信息,即依密文中每个字母是A还是B分别套用两种字体。解密时,将上述方法倒转。所有字体一转回A,字体二转回B,以后再按上表拼回字母。法兰西斯·培根另外准备了一种方法,其将大小写分别看作A与B,可用于无法使用不同字体的场合(例如只能处理纯文本时)。但这样比起字体不同更容易被看出来,而且和语言对大小写的要求也不太兼容。培根密码本质上是将二进制信息通过样式的区别,加在了正常书写之上。培根密码所包含的信息可以和用于承载其的文章完全无关。

栅栏密码

①把将要传递的信息中的字母交替排成上下两行。

②再将下面一行字母排在上面一行的后边,从而形成一段密码。

③例如:明文:THE LONGEST DAY MUST HAVE AN END加密:

1、把将要传递的信息中的字母交替排成上下两行。

T E O G S D Y U T A E N N

H L N E T A M S H V A E D

2、 密文:将下面一行字母排在上面一行的后边。

TEOGSDYUTAENN

HLNETAMSHVAED

解密:先将密文分为两行

T E O G S D Y U T A E N N

H L N E T A M S H V A E D

再按上下上下的顺序组合成一句话明文:THE LONGEST DAY MUST HAVE AN END

希尔密码

base密码

base16

  • base16编码也称为十六进制编码或Hex编码,是一种将二进制数据表示为十六进制数字和字符的方法。它使用16个字符(0-9和A-F)来表示4位二进制数的每个组合。

  • 编码原理:由于4bit就可以表示2^4 = 16个字符。所以用4bit可以表示所有的十六进制数。

    1byte=8bit 所以1byte = 俩个十六进制数据。

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

将二进制数据分割为4个一组,将每四位二进制数据映射到对应的base16字符,一一对应,若二进制数据不是4的倍数,就在后面填充0。

base32

  • Base32编码是一种将二进制数据转换为使用32个不同字符表示的文本编码方式

    由于5bit就可以表示2^5 = 32个字符。
    所以base32就是将二进制数据分割成5个一组,如果结尾不满足5的倍数,就用“=”填充,之后再根据base32索引表,进行编码。

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

base64

1)原理:
1.准备要编码的二进制数据: 将要编码的二进制数据准备好,通常是字节的形式。
2.分组: 将二进制数据分成固定大小的组,每组通常为3字节(24位)。如果最后一组不足3字节,通常需要进行填充,以便每组都有3字节。
3.将每个组的二进制数据转换为十进制: 将每个3字节的二进制数据视为一个8bit*3=24bit位的二进制整数,再转化为一个十进制整数。
4.Base64编码: 将每个十进制整数编码为Base64字符。

1)Base64字符集通常包括64个字符,通常是大写字母A到Z、小写字母a到z、数字0到9以及两个额外的字符(通常是”+”和”/“)。
2)以24位整数为例,将它分成4组,每组6位。这4组6位整数将被编码为4个Base64字符。
3)每个6位整数对应一个Base64字符,根据其在Base64字符集中的位置来选择。
4)如果原始数据不足3字节,会添加一个或两个额外的0位,以确保每个6位整数都有6位。
5)Base64编码的结果是一个文本字符串,其中包含一系列Base64字符,每4个字符分为一组,每组表示一个24位整数。
5.填充(可选): 如果原始数据的长度不是3的倍数,可以使用一个或两个填充字符“=”来补全Base64编码,以确保编码长度是4的倍数。
最终,Base64编码的结果就是表示输入二进制数据的文本字符串。在解码时,可以根据相同的算法将Base64编码的文本字符串还原为原始的二进制数据。

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