古典密码学:
1.凯撒密码/位移密码:
例如:abcd->bcde / syx->yxa
特点:算法和key都是确定的
解决方法:使用穷举攻击,找到有意义的字符串
随便找的解密网站:https://www.qqxiuzi.cn/bianma/kaisamima.php

2.仿射加密
每个字母对应一个数字(0~25),key:(a,b)
特点:密钥对(a,b)的两个有效值都小于26
解决方法:进行枚举(a,b)

拓展欧几里得算法:求ax + by = gcd(a,b)的一组x,y
求逆元:a ainv (mod p) = 1
密钥中p常为26,即a
ainv + 26y = 1 = gcd(a,p)

原式: 61*d mod 105 = 1,求d;用辗转相除法可转换为下列式子:

(1) 61d - 105k = 1;

(2) 61d - 44k = 1;

(3) 17d - 44k = 1;

(4) 17d - 10k = 1;

(5) 7d - 10k = 1;

(6) 7d - 3k = 1;

(7) 1d - 3k = 1;

此时d的系数已经化为1;

令k=0,带入(7)式中,得d=1;

令d=1,带入(6)式中,得k=2;

令k=2,带入(5)式中,得d=3;

令d=3,带入(4)式中,得k=5;

令k=5,带入(3)式中,得d=13;

令d=13,带入(2)式中,得k=18;

令k=18,带入(1)式中,得d=31;

解得:d=31

RSA在线计算器网站:http://www.blogso.cn/rsa/

3.单字母替换密码
例如
明文: my lazy dog is living comfortably in SZU
密文: ow npbw gdm ar nasafm qdoudkcpgnw af rbv
明文加密成密文都是在一张简单的映射表的基础上一一替换进行的

特点:需要字母替换的表
解决方法:词频分析

4.关键词加密(nihilist)
有一种加密技术是这样实现的,假如关键词为“magicnet”,则字母表的描述形式如下:
a b c d e f g h i j k l m n o p q r s t u v w x y z

m a g i c n e t b d f h j k l o p q r s u v w x y z
则如果有一明文为:help 则密文为:tcho 。
在线ctf关键字解密可用,不过需要对照原文对应的大小写

5.维吉尼亚密码
TO BE OR NOT TO BE THAT IS THE QUESTION

当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:

密钥:RE LA TI ONS RE LA TION SR ELA TIONSREL

明文:TO BE OR NOT TO BE THAT IS THE QUESTION

密文:KS ME HZ BBL KS ME MPOG AJ XSE JCSFLZSY


破解方法:
一、kasiski测试法:
两个相同的明文段加密成相同的密文段,这两个明文之间的间距很大概率是密钥长度的整数倍
二、重合指数法:
…貌似是跟词频有关,没仔细研究


替换:
1.摩斯电码 ...-..-...-.或112121221211121(仅有两种元素组成密码)
2.福尔摩斯跳舞小人
3.敲击码3,4或… ….
4.培根密码A->AAAAA,B->AAAAB,C->AAABA,D->AAABB


编码:
1.ASCII码

2.URL编码 特点:”%”+”字节的ASCII编码对应的16进制字符”
如:%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8

3.Unicode 最常见:UTF-8 为每种语言每个字符设定了统一且唯一的二进制编码
编码集:ASCII(0~127) GBK(GB2312)(中文常用) UTF-8(兼容ASCII,能包含世界上几乎所有语言的字符)
乱码问题:编码集之间映射不正确的问题
UTF-8: 110XXXX 10XXXXXX(两个)
1110XXXX 10XXXXXX 10XXXXXX(三个)
(前面有几个1,这个字节流就有几个有效的,后面的x为有效信息)

4.BASE家族 最常见:BASE64(看见Zmxh就知道是Base64)
BASE64编码原理:要求把3个8位字节转化为4个6位的字节,之后在六位的前面补两个0,形成8位一个字节的形式
A-Z,a-z,0-9,+,/这64个编码字符,=号不属于编码字符,属于填充字符
BASE64特点:结尾可能有等号,除数字字母外符号仅为”+”、”/“、”=”
例如:
源文本:T H E
对应ASCII码:84 104 101
8位binary: 01010100 01101000 01100101
6位binary: 010101 000110 100001 100101
高位补0: 00010101 00000110 00100001 00100101
对应十进制:21 6 33 37
查表:V G H l

BASE32编码原理:使用32个可打印字符(字母B-Z(a,i,l,o去掉)和数字0-9)对任意字节数据进行编码的方案,编码后的字符串不用区分大小写
BASE32特点:末尾最多有6个=
THE->KRUGK===

BASE16编码原理:
使用数字0-9和字母A-F共计16个ASCII可打印字符对任意字节数据进行编码
BASE16特点:不会出现=
THE->546865

BASE36编码原理:包含0-9的数字,加上所有26个字母,不区分大小写,不包含任何标点,所有的字母要不全大写,要不全小写
BASE36特点:密文由36个字符(0-9,a-z或者0-9,A-Z)组成,加密仅支持整数数字,解密仅支持字符串,不支持中文
7758521->4maih

5.aaencode:可以将JS代码转换成常用的网络表情,也就是我们说的颜文字JS加密

6.Jsfuck:只出现[] ()!+这六种字符

7.Brainfuck:只出现><+-·,[]这八种字符(如果出现大量符号,则大概率满足以上两者之一)

8.Ook! :反复出现Ook与! ? ·的结合、或者只出现! ? ·

9.Malboge:不懂,代码如下
(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)”Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:’8dc
在线编译器:https://www.w3cschool.cn/tryrun/runcode?lang=malbolge

10.Cow:只出现moO,MoO,mOo,mOO,Moo 等moo的变体

11.Whitespace:利用不同长度的空格进行编程,解释器会自动忽略非空白字符


若出现pem和enc文件:
第一步:在kali中使用命令:
openssl rsa -pubin -text -modulus -in warmup -in pub.pem
得到E和N
E=65537(Exponent)
N=439AEAB34EAEE973E968EBDD11D6D3EF7302072C4BFD4F7FE2B0CF9889277F6D(十六进制)

第二步:把N转换成10进制
N(十进制):87924348264132512606026244266860026602226062424884468222066668822204828484286

第三步:分解N得出P和Q以便求出私钥D
http://factordb.com/

第四步:求出D
在kali中使用python生成私钥


flag的二进制:
1100110 1101100 1100001 1100111

01100110 01101100 01100001 01100111


UUencode/XXencode
UUencode的加密方式和base64很相似。但他的编码表有很多是特殊字符:”!”#¥%&‘()+=’” 等等。 XXencode的加密方式也和base64相似。跟base64打印字符相比,就是UUencode多一个“-” 字符,少一个”/” 字符。
举个例子
UUencode(1234567)= (,3(S-#4V-PH`
特征:看着特别奇怪
XXencode(1234567)= 6AH6nB1IqBkc+
特征:与base64相似

uuencode编码:
形如G0TE30TY[,C,X.$%&,C@Y,T5".#5%0C%"-#,Y04)&1C8Q-S,Q.49]
解码得到
CISCN{2388AF2893EB85EB1B439ABFF617319F}