一,RSA数学基础预习
预习内容如下(因为是手写,上传图片):
二,古典密码的特征与习题
1.猪圈密码
猪圈密码(Pigpen cipher),是一种外形古怪的密码。它是以格子为基础的简单替代式密码。用起来非常简单。
将字母表中的每个字母分配给特定形状的方括号或“猪圈”。写秘密信息时,不用写字母,而是画出每个字母所在的方括号。
猪圈密码的加密原理很简单,它需要一个特定的密表,然后用密表中指定的符号替换明文中的字母,最后得到的结果即为密文。
如何制作密码
绘制猪圈密码本身就很有趣。
首先,绘制26种不同的“猪圈”,并且每个都配有一个字母。要确保每个猪圈看上去和其他的都不同,这是基本的猪圈密码示例:
比如我们要传输一条信息“ANT”,就要找到每个字母,并注意“猪圈”的形状:
这样我们可以把ANT写成:
从上面的例子,我们可以清晰的看出猪圈密码的替换规律,例如,如果你要加密的是明文是A,那么密文就书写成,密表中A所在的区域,一个向左开的直角图案,如果想表达其他字母,也是一样的方法。
因为猪圈密码,本质上是一个很简单的替代密码,所以,它的解密方法和加密方法刚好相反,只要我们知道加密时所用的密表,即可通过对比密表,将密文替换为明文。
值得特别注意的是,猪圈密码有许多变体,例如以下这几种:
1、使用#网格、X网格、#网格、X网格的布局来重新排列字母
2、把字母交替放置在#和点中,把字母拆分
3、改变某个字母的符号
4、使用三个#网格,取消X网格
【1】工具:CTF在线工具-在线猪圈密码加密|在线猪圈密码解密|猪圈密码算法|Pigpen Cipher在线猪圈密码加密、在线猪圈密码解密、猪圈密码原理、猪圈密码算法、Pigpen Cipher。
http://www.hiencode.com/pigpen.html
【2】例题 [SWPUCTF 2021 新生赛]pigpig
根据下载的图片,得出需要使用猪圈密码解密完成这道题,登录现有的网站进行解密即可
第一题解出
2. UUencode编码
(这个在网上找了找相关资料,但还是有点不明白,找了一下实现的代码但有点看不懂)
uuencode是将二进制文件转换为文本文件的过程,转换后的文件可以通过纯文本e-mail进行传输,在接收方对该文件进行uudecode,即将其转换为初始的二进制文件。
uu 编码
uuencode 编码方式用于将任意的二进制文件转换为文本文件,比如email.转换后的文件中仅包含可打印字符.
uuencode 运算法则将连续的 3字节编码转换成 4字节(8-bit 到 6-bit)的可打印字符. 该编码的效率高于Hex 格式.
从二进制文件中读取 3字节的数据, 表示如下(a7 表示 a字节的第 7位):
a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0
转换它们到4字节里为如下所示:
0 0 a7a6a5a4a3a2 0 0 a1a0b7b6b5b4 0 0 b3b2b1b0c7c6 0 0 c5c4c3c2c1c0
然后, 每个字节再加 0x20转换为可打印的字符.
注意: 如果是一个 0字节那它应该被转换为0x60而不是0x20, 因为(前引用'`')优于 0x20(空格' ').
例如: 从文件中读取的 3字节如下:
14 0F A8
00010100 00001111 10101000
转换为 6-bit:
000101 000000 111110 101000
每字节高两位补 0后为:
00000101 00000000 00111110 00101000
最后每字节再加 0x20,则 4字节输出应该为:
25 60 5E 48
注意: 00字节被转换为 0x60而不是 0x20.
因此, 在一个 uuencoded文件中仅包含字符 0x21 '!'到 0x60 '`',它们都是可打印和可被 email传送的.
这个转换过程也意味着 uuencoded 文件要比原文件大 33%的.
流程如下:
其转换源码如下:
//header
#pragma once
#define ENCODE_BYTE(b) (((b) == 0) ? 0x60 : ((b) + 0x20))
#define DECODE_BYTE(b) ((b == 0x60) ? 0 : b - 0x20)
void Byte3ToAsc4(unsigned char inbyte[3],unsigned char outAsc[4]);
void Asc4ToByte3(unsigned char inAsc[4],unsigned char outByte[3]);
//body
#include "StdAfx.h"
#include "UUencode.h"
//encode
void Byte3ToAsc4(unsigned char inbyte[3],unsigned char outAsc[4])
{
outAsc [0] = ENCODE_BYTE ((inbyte [0] & 0xFC) >> 2);
outAsc [1] = ENCODE_BYTE (((inbyte [0] & 0x03) << 4) + ((inbyte [1] & 0xF0) >> 4));
outAsc [2] = ENCODE_BYTE (((inbyte [1] & 0x0F) << 2) + ((inbyte [2] & 0xC0) >> 6));
outAsc [3] = ENCODE_BYTE (inbyte [2] & 0x3F);
}
//decode
void Asc4ToByte3(unsigned char inAsc[4],unsigned char outByte[3])
{
outByte [0] = DECODE_BYTE (inAsc [0]);
outByte [1] = DECODE_BYTE (inAsc [1]);
outByte [0] <<= 2;
outByte [0] |= (outByte [1] >> 4) & 0x03;
outByte [1] <<= 4;
outByte [2] = DECODE_BYTE (inAsc [2]);
outByte [1] |= (outByte [2] >> 2) & 0x0F;
outByte [2] <<= 6;
outByte [2] |= DECODE_BYTE (inAsc [3]) & 0x3F;
}
特征:UUencode的加密方式和base64很相似。但他的编码表有很多是特殊字符:”!”#¥%&‘()*+=’” 等等
【1】工具: UUencode加密/解密 - Bugku CTF
https://ctf.bugku.com/tool/uuencode
【2】例题 [SWPUCTF 2021 新生赛]crypto8
观察下载好的附件,利用工具进行解密
第二题做出
3.凯撒密码(最简单的对称加密)
凯撒密码是罗马扩张时期朱利斯• 凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。例如如果向右移动 2 位,则 字母 A 将变为 C,字母 B 将变为 D,…,字母 X 变成 Z,字母 Y 则变为 A,字母 Z 变为 B。
因此,假如有个明文字符串“Hello”用这种方法加密的话,将变为密文: “Jgnnq” 。而如果要解密,则只要将字母向相反方向移动同样位数即可。如密文“Jgnnq”每个字母左移两位 变为“Hello” 。这里,移动的位数“2”是加密和解密所用的密钥。
该程序既可用于加密又可用于解密。只要传入明文和偏移量即可加密,解密需要传入密文和负的偏移量就可以解密。
凯撒密码由于加解密比较简单,密钥总共只有 26 个,攻击者得到密文后即使不知道密钥,也可一个一个地试过去,最多试 26 次就可以得到明文。
特征:只对字母进行加密
【1】工具凯撒(Caesar)加密/解密 - Bugku CTF
https://ctf.bugku.com/tool/caesar
【2】例题[NSSCTF 2022 Spring Recruit]classic
根据文件判断用凯撒密码进行解密
根据后文的base提示,进行base编码解密,我是挨个试的,试出base32是合适的
4.维吉尼亚密码
可以说是凯撒密码的加强版,引入了密钥
维吉尼亚密码,它将凯撒密码的所有26种排列放到一个表中,形成26行26列的加密字母表。此外,维吉尼亚密码必须有一个由字母组成的密钥,至少有一个字母,最多与明文字母有相同数量的字母。
在凯撒密码中,每个字母都会进行一定偏移值转换,例如,当偏移值是3时,则B被转换为E,C转换成F…。在维吉尼亚密码加密中,则是由具有不同偏移的凯撒密码构成的。
要生成密码,需要使用表格方法,此表(如图所示)包含26行字母表,每一行从上一行到左行被一位偏移。加密时使用哪一行字母表是基于密钥的,在加密过程中密钥会不断变化。
例如,假设明文为:
BTTACKATDAFG
选择一个关键字并重复它以获得密钥,例如,当关键字是LIMN时,键是:
LIMNLIMNLIMN
在明文中的第一个字母B,对应于密钥中的第一个字母L,使用加密字母表中的L行字母进行加密,得到第一个字母的密文M。同样,第二个明文字母是T,它用表中的I行加密,得到第二个密文B。通过类比,我们可以得到:
明文:BTTACKATDAFG 键:LIMNLIMNLIMN 密文:MBFNNSMGOIRT
解密的过程是加密的逆过程。例如,密钥的第一个字母对应的L行字母表,发现密文的第一个字母M位于B列,因此明文的第一个字母是B。密钥的第二个字母对应于I行字母表,而密文的第二个字母B位于该行的T列中,因此明文的第二个字母是T。等等,你可以得到明文。
原文链接:https://blog.csdn.net/weixin_45728976/article/details/109219997
【1】工具:
GitHub - atomcated/Vigenere: 维吉尼亚密码加密解密程序,包含自动猜测密钥功能维吉尼亚密码加密解密程序,包含自动猜测密钥功能. Contribute to atomcated/Vigenere development by creating an account on GitHub.
https://github.com/atomcated/Vigenere
【2】例题 [AFCTF 2018]Vigenère
打开以后得到一篇文章,利用工具进行解密:
寻找关键字flag即可
5. 栅栏密码
栅栏密码是按一定规则将明文内容互相调换了位置
栅栏密码(Rail fence Cipher)基础型加密方式,是一种简单的移动字符位置的加密方法,首先把加密的明文分成N个一组,然后把每组的第1、第2、第M个字符连起来,形成无规律的密文字符串。
例如字符串“123456789abc”,首先将字符串分成3组,如下排列:
1234
5678
9abc
依次取每一组字符,组成加密后密文:“15926a37b48c”。
栅栏密码W型加密算法:
栅栏密码(Rail fence Cipher),扩展变种W型,采用先把明文类似"W"形状进行排列,然后再按栏目顺序1-N,取每一栏的所有字符值,组成加密后密文。
比如字符串“123456789”,采用栏目数为3的时,明文将采用如下排列:
1—5---9
-2-4-6-8-
–3----7–
取每一栏所有字符串,组成加密后密文:“159246837”。
【1】工具:栅栏加密/解密 - Bugku CTF
https://ctf.bugku.com/tool/railfence
【2】例题[WUSTCTF 2020]佛说:只能四天
这个题涉及的密码比较多,我直接上截图
根据提示,只说四天,栏数为4