古典密码
单表代换加密
明密文一一对应,
-
在密钥空间较小的情况下,采用暴力破解方式
-
在密文长度足够长的时候,使用词频分析,quipqiup - cryptoquip and cryptogram solver
当密钥空间足够大,而密文长度足够短的情况下,破解较为困难。
凯撒密码
基本破解:1)遍历26个偏移量2)利用词频分析(不一定得到正确的明文)
工具:1)JPK,可解带密钥与不带密钥2)Online calculator: Caesar cipher 3)ROT5、ROT13、ROT18、ROT47位移编码
移位密码
和凯撒密码的区别是在其不仅会处理字母,还会处理数字和特殊字符,常见的ascII码表进行移位
基本破解:遍历所有可能性进破解
Atbash Cipher
它使用字母表中的最后一个字母代表第一个字母,倒数第二个字母代表第二个字母
简单替换密码
将每个明文字母替换为与之唯一对应且不同的字母。它与恺撒密码之间的区别是其密码字母表的字母不是简单的移位,而是完全是混乱的,解密时,我们一般是知道了每一个字母的对应规则,才可以正常解密。一般采用词频分析。
工具:quipqiup - cryptoquip and cryptogram solver
仿射密码
加密函数是 E(x)=(ax+b)(mod m)
解密函数是 D(x)=a^(-1)(x−b)(mod m)
1)x 表示明文按照某种编码得到的数字2)a和 m互质3)m 是编码系统中字母的数目。
当a=1 时,仿射加密是凯撒加密
多表代换加密
playfair
基本算法,选取一串英文字母,除去重复出现的字母,将剩下的字母逐个逐个加入 5 × 5 的矩阵内,剩下的空间由未加入的英文字母依 a-z 的顺序加入。注意,将 q 去除,或将 i 和 j 视作同一字。将要加密的明文分成两个一组。若组内的字母相同,将 X(或 Q)加到该组的第一个字母后,重新分组。若剩下一个字,也加入 X 。在每组中,找出两个字母在矩阵中的地方,1)若两个字母不同行也不同列,在矩阵中找出另外两个字母(第一个字母对应行优先),使这四个字母成为一个长方形的四个角。2)若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。3)若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。
工具;CAP4
polubius
棋盘密码,一般是将给定的明文加密为两两组合的数字,常用密码表5×5,26个字母依次填入,i/j代表同一个,行和列的序号都是1~5。明文加密之后一个字母被加密成他的行列号。还有一种打乱的密码表
工具:CrypTool
维吉尼亚
使用一系列凯撒密码组成密码字母表的加密算法,26×26,第一行偏移量为0,从A开始,第二行偏移为1,从B开始,偏移量依次加一,最后从Z开始。加密方式是先将密钥填充和明文一个长度,然后明文(行)和对应的密钥字母(列)在密码表中相交叉的位置的字母
已知密钥
1)Python 的 pycipher 库2)在线解密 Vigenère cipher3)CAP4
未知密钥1)Vigenère Cipher Codebreaker2)Vigenere Solver
nihilist
关键词密码,利用密钥(关键词)构造棋盘矩阵5×5,将关键词不重复的依次填入矩阵,剩下字母按照字母顺序填入 ij等价。明文字母所在的行列号就是加密后的结果
hill
希尔密码,使用每个字母在字母表中的顺序作为其对应的数字,然后将明文转化为 n 维向量,跟一个 n × n 的矩阵相乘,再将得出的结果模 26。注意用作加密的矩阵(即密匙)在 Zn26 必须是可逆的,否则就不可能解码。只有矩阵的行列式和 26 互质,才是可逆的。
工具 1)Practical Cryptography 2) CAP4 3) Cryptool
autokeyipher
自动密钥密码也是多表替换密码,与维吉尼亚密码密码类似,但是是用不同方式产生密钥。分为关键词自动密钥密码和原文自动密钥密码。加密方式和维吉尼亚加密方式一样
工具
已知关键词:Python 的 pycipher 库
未知关键词:Practical Cryptography
其他类型加密
培根密码:http://rumkin.com/tools/cipher/baconian.php
栅栏密码:栅栏密码在线加密解密 - 千千秀字
曲路密码:
列移位相加:Practical Cryptography
01248密码:云影密码(只有 0,1,2,4,8)
JSfuck:JSFuck 在线加密网站
BrainFuck:Brainfuck/Ook! Obfuscation/Encoding [splitbrain.org]
猪圈密码:The Black Chamber - Pigpen Cipher
舞动的小人密码:
键盘密码
流密码
流密码的密钥长度会与明文的长度相同,流密码的密钥派生自一个较短的密钥,派生算法通常为一个伪随机数生成算法。目前来说流加密都是对称加密。关键在于设计好的伪随机数生成器,流密码加解密非常简单,在已知明文的情况下,可以非常容易地获取密钥流。
伪随机数生成器(PRNG)
是用来生成接近于绝对随机数序列的数序列的算法。PRNG会依赖一个初始值(种子),来生成伪随机数序列(种子确定,所生成的随机数序列就是确定的)
密码安全伪随机数生成器(CSPRNG),特殊的伪随机数生成器,生成的伪随机数应该满足更高的要求,比如当生成器的部分初始状态或者运行时的状态被攻击者获知时,攻击者仍然不能够获取泄漏状态之前的生成的随机数。
线性同余生成器(LCG)
n级反馈移位寄存器,首先会有n个初态元素(a0,a1,,,,,an-1),F是反馈函数和反馈逻辑,根据函数类型,可以分为线性反馈移位寄存器(LFSR)和非线性。
所以ai+n=F(ai,ai+1,,,,,,ai+n-1)
反馈移位寄存器都会定义在某个有限域上,可以将其视为同一个空间中的变换,对于一个序列来说,我们一般定义其生成函数为其序列对应的幂级数的和。
反馈移位寄存器
特殊流密码
RC4
块加密
非对称加密
非对称加密中加密者和解密者所使用的密钥不一样,典型的密码有RSA,背包加密,椭圆曲线加密
RSA
基本原理
-
随机选择两个不同大质数 p 和 q,计算 N=p×q
-
根据欧拉函数,求得 φ(N)=φ(p)φ(q)=(p−1)(q−1)
-
选择一个小于 φ(N)的整数 e,使 e 和 φ(N)互质。并求得 e关于 φ(N) 的模反元素,命名为 d,有 ed≡1(modφ(N))≡1(mod(N))
-
将 p 和 q 的记录销毁
此时,(N,e)是公钥,(N,d)是私钥。
工具
RSAtool
安装 git clone https://github.com/ius/rsatool.git cd rsatool python rsatool.py -h 生成私钥 python rsatool.py -f PEM -o private.pem -p 1234567 -q 7654321
RSA Converter
根据给定密钥对,生成pem文件。根据n,e,d得出p,q
openssl
查看公钥文件 openssl rsa -pubin -in pubkey.pem -text -modulus 解密 rsautl -decrypt -inkey private.pem -in flag.enc -out flag