# CRYPTO-PART1

参考文章:https://ctf-wiki.org/en/crypto/introduction/

# 简介

密码学一般可分为古典密码学和现代密码学

  • 古典密码学:主要包含以下几个方面:
    • 单表替换加密(Monoalphabetic Cipher)
    • 多表替换加密(Polyalphabetic Cipher)
    • and so on......
  • 现代密码学:主要包含:
    • 对称加密(Symmetric Cryptography),以DES,AES,RC4为代表
    • 非对称加密(Asymmetric Cryptography),以RSA,EIGamal,椭圆曲线加密为代表
    • 哈希函数(Hash Function),以MD5,SHA-Q,SHA-512为代表
    • 数字签名(Digital Signature),以RSA签名,EIGamal签名,DSA签名为代表
      其中,对称加密体制主要分为两种方式:**分组加密(Block Cipher)**又称为块密码,**序列密码(Stream Cipher)**又称为流密码
      一般来说,密码设计者的根本目标是保障信息及信息系统的:
机密性(Confidentiality)
完整性(Integrity)
可用性(Availability)
认证性(Authentication)
不可否认性(Non-repudiation)

其中前三者称为信息安全的CIA三要素
一般来说我们都会假设攻击者已知待破解的密码体制,而攻击类型通常分为以下四种:

攻击类型 说明
唯密文攻击 只拥有密文
已知明文攻击 拥有密文与对应的明文
选择明文攻击 拥有加密权限,能够对明文加密后获得相应密文
选择密文攻击 拥有解密权限,能够对密文解密后获得相应明文

# 基础数学知识

# 群

群在离散数学中所提及的概念
给定一个非空集合GG,以及其上的二元代数运算∗*,如果他们满足以下性质:

  • 封闭性:∀u,v∈G,u∗v∈G\forall u,v \in G,\quad u*v \in G
  • 结合律:∀v,u,w∈G,(v∗u)∗w=v∗(u∗w)\forall v,u,w \in G,\quad (v*u)*w=v*(u*w)
  • 单位元:∃e∈G,∀v∈G,e∗v=v\exists e \in G,\forall v \in G,\quad e*v=v
  • 逆元:∀v∈G,∃v−1∈G,v−1∗v=e\forall v \in G,\exists v^{-1} \in G, \quad v^{-1}*v=e
    则称集合G对该代数运算作成一个群,记作(G,∗)(G,*),一个很常见的例子是整数加法群(Z,+)(Z,+),不难验证其不仅对加法封闭,满足结合律,且存在0作为单位元,并对于每个整数m都有其相反数-m作为逆元,类似可以验证(Q+,∗)(Q_+,*),即正有理数集对乘法,单位元为1,对于每个元素的逆元为该元素的倒数

# 半群和幺半群

半群:如果对于一个非空集合GG,以及其上的二元运算∗*,仅满足结合律,也就是∀v,u,w∈G,(v∗u)∗w=v∗(u∗w)\forall v,u,w \in G,\quad (v*u)*w=v*(u*w),那么可称该集合对该代数运算作成半群
幺半群:如果集合对于代数运算除封闭外还满足结合律,且具有单位元,则称其对该运算作成幺半群
由此我们可以认为幺半群是含有单位元的半群

# 交换群

给定一个群(G,∗)(G,*),如果其满足交换律∀v,u∈G,v∗u=u∗v\forall v,u \in G,\quad v*u=u*v,则称这个群是交换群或者Abel(阿贝尔)群

# 环和域

给定一个非空集合RR以及其上两个二元代数运算++和∗*,如果他们满足以下性质:

  1. (R,+)(R,+)作成交换群
  2. RR对运算∗*满足结合律:∀v,u,w∈R,(v∗w)∗u=v∗(w∗u)\forall v,u,w \in R,\quad (v*w)*u=v*(w*u)
  3. 分配率:∀v,u,w∈R,w∗(v+u)=w∗v+w∗u\forall v,u,w \in R,\quad w*(v+u)=w*v+w*u与(v+u)∗w=v∗w+u∗w(v+u)*w=v*w+u*w成立
    则称集合RR对此二代数运算作成一个环,记作(R,+,∗)(R,+,*)
  • 如果环RR上的乘法存在单位元,∃e∈G,∀v∈G,e∗v=v\exists e \in G,\forall v \in G,\quad e*v=v成立,则称环RR为幺环
  • 如果环RR上的乘法满足交换律,则称其为交换环
  • 如果环RR中对除加法单位元以外任意元素a≠0a \neq 0皆存在乘法逆元a−1a^{-1},则称RR为除环
  • 如果RR既是交换环又是除环,那么环RR是一个域

部分书籍中默认环还含有乘法单位元,并称不含有乘法单位元的环为伪环

# 阶

指数:仿照数的指数,我们定义群中的元素的指数,对于v∈Gv \in G,m为正整数,则有:

  • v0=ev^0=e
  • vm=v∗v∗v∗...∗vv^m = v*v*v*...*v,其中一共有m个vv参与代数运算
  • v−m=(v−1)mv^{-m}=(v^{-1})^m
    元素的阶:对于任意给定的元素v∈Gv \in G,如果正整数mm满足vm=ev^m=e,那么称元素vv的阶数为mm,如果这样的正整数不存在,则称该元素的阶为无限

# 同态

代数系统间的同态指的是在不同代数系统之间能够保持代数运算的映射,对于群(G,∗)(G,*)和(H,∗)(H,*)而言,如果一个映射ψ:G→H\psi : G\to H满足∀v,u∈G\forall v,u \in G,ψ(v∗u)=ψ(v)∗ψ(u)\psi(v*u)=\psi(v)*\psi(u),那么映射ψ\psi则可以被称为GG到HH的一个群同态

# 古典密码简介

# 单表代换加密

在单表替换加密中,所有的加密方式几乎都有一个共性:明密文一一对应,所以一般有以下两种破解方式:

  1. 在密钥空间较小的情况下采用暴力破解方式
  2. 在密文长度足够长的情况下使用词频分析,http://quipqiup.com/
    当密钥空间足够大而密文长度足够短的情况下破解较为困难

# 凯撒密码

凯撒密码(Caesar)加密时会将明文中的每个字母都按照其在字母表中的顺序向后(或向前)移动固定数目(循环移动)作为密文,例如当偏移量是左移3的时候,解密时的密钥就是3:

明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC

在使用的时候,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母,需要解密的人则根据事先已知的密钥反过来操作得到原来的密文:

明文:ZLARYY
密文:CODUBB

根据偏移量的不同还存在若干特定的凯撒密码名称:

  • 偏移量为10:Avocat(A→KA \to K)
  • 偏移量为13:ROT13(A→NA \to N)
  • 偏移量为-5:Cassis(K→FK \to F)(K 6是用于帮助记忆名称的谐音写法,在法语中K读作ka,6读作six,连续接近Cassis)
  • 偏移量为-6:Cassette(K→EK \to E)(K 7,与K 6同理,7读作sept,连续近似Casstte)
    偏移量为负值就表示向前移动了几位,为正值就表示向后移动了几位,除此之外还有一种基于密钥的凯撒密码:
    Keyed Caesar:其基本原理为利用一个密钥,将密钥的每一位转换为数字(一般转化为字母表对应顺序的数字),分别以这一数字为密钥加密明文的每一位字母,例如:
密文:RFSLQS
密钥:susu
偏移:18,20,18,20
明文:ZLARYY

这里面的密钥中每一个字母对应一个偏移量,按照密钥顺序对密文中的字母依次进行偏移

密钥字母 字母位置 偏移量
s 第19个 18
u 第21个 20

如果说密文里面存在数字的话,数字保持不变,只有字母参与偏移,并且数字不占用密钥位置,也就是说明文为ZLA1RYY实际上对应的密文是RFS1LQS
对于不带密钥的凯撒密码来说,其基本的破解方法有两种方式:

  1. 遍历26个偏移量,适用于普遍情况
  2. 利用词频分析,适用于密文较长的情况
    其中第一种方式肯定可以得到明文,而第二种方式不一定可以得到正确的明文
    而对于基于密钥的凯撒密码来说,一般来说必须知道对应的密钥

# 工具

有如下的工具,其中JPK比较常用:

JPK,可解带密钥和不带密钥
http://planetcalc.com/1434
http://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php

# 移位密码

与凯撒密码类似,区别在于移位密码不仅会处理字母,还会处理数字和特殊字符,常用ASCII码表进行移位,其破解方法也是遍历所有的可能性来得到可能的结果

# Atbash Cipher

埃特巴什码(Atbash Cipher)其实可视为下面要介绍的简单替换密码的特例,它使用字母表中的最后一个字母代表第一个字母,倒数第二个字母代表第二个字母,在罗马字母表中以以下形式出现:

明文:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文:ZYXWVUTSRQPONMLKJIHGFEDCBA

不难看出密文就是明文的逆序

明文:ZLARYY
密文:AOZIBB

可以看出当其密钥空间足够短同时密文足够长时,仍然可以采用词频分析的方法解决
工具:- http://www.practicalcryptography.com/ciphers/classical-era/atbash-cipher/

# 简单替换密码

简单替换密码(Simple Substitution Cipher)加密时,将每个明文字母替换为与之唯一对应且不同的字母,它与凯撒密码之间的区别就在于其密码字母表的字母不是简单的移位,而是完全混乱的,这也使得其破解难度要高于凯撒密码,比如:

明文字母 : abcdefghijklmnopqrstuvwxyz
密钥字母 : phqgiumeaylnofdxjkrcvstzwb

a对应p,b对应h,以此类推

明文:ZLARYY
密文:BNPKWW

而解密时,我们一般是知道了每一个字母的对应规则才可以正常解密
由于这种加密方式导致所有的密钥个数为26!26!,所以几乎上不可能使用暴力破解的方式,一般采用词频分析
工具:- http://quipqiup.com/

# 仿射密码

仿射密码的加密函数是E(x)=(ax+b)(modm)E(x) = (ax+b) \quad (mod \quad m),其中:

  • xx表示明文按照某种编码得到的数字
  • aa与mm互质
  • mm是编码系统中的字母的数目
    对应的解密函数是D(x)=a−1(x−b)(modm)D(x)=a^{-1}(x-b)\quad (mod \quad m),其中a−1a^{-1}是aa在ZmZ_m群的乘法逆元
    这里英文字母与数字对应关系为:
A B C D E F G H I
0 1 2 3 4 5 6 7 8
J K L M N O P Q R
9 10 11 12 13 14 15 16 17
S T U V W X Y Z
18 19 20 21 22 23 24 25

即xx为字母在字母表中的序号减一,mm表示字母表的大小,通常使用26个英文字母,因此m=26m = 26
aa表示乘法密钥,bb为加法密钥
假设a=5,b=8a = 5,b = 8,我们尝试加密字符串ZLARYY

# 明文
ZLARYY
# x
25 11 0 17 24 24
# (ax+b) (mod m) 或称 E(x)
3 11 8 15 24 24
# 密文
DLIPYY

解密函数事实上就是对y≡ax+b(modm)y \equiv ax+b \quad (mod \quad m)进行移项变换得到x≡a−1(y−b)(modm)x \equiv a^{-1}(y-b) \quad (mod \quad m),而要求a,ma,m互质本质上就是因为gcd(a,m)=1gcd(a,m) = 1时,aa才存在模mm下的乘法逆元,无法保证唯一解密
例如当a=6,b=0a = 6,b = 0时,E(0)=0,E(13)=78(mod26)=0E(0) = 0,E(13) = 78 (mod \quad 26)=0,即A和N都会被加密为A,导致无法根据密文唯一判断原文,因此在26个英文字母的情况下,乘法密钥aa只能是:

1,3,5,7,9,11,15,17,19,21,23,25

那么在解密过程中,我们需要知道乘法密钥和加法密钥
事实上,凯撒加密就是仿射加密当乘法密钥a=1a=1的情况,即凯撒加密:E(x)=(x+b)(modm)E(x) = (x+b) \quad (mod \quad m)
仿射密码对于任意两个不同的字母其最后得到的密文必然不一样,所以其也具有最通用的特点,当密文长度足够长时,我们可以使用频率分析的方法来解决
一般来说我们利用仿射密码时,其字符集都用的是字母表,一般只有26个字母,而不大于26的与26互素的个数一共有:ϕ(36)=ϕ(2)∗ϕ(13)=12\phi(36)=\phi(2)*\phi(13)=12,算上bb的偏移可能,一共有可能的密钥空间大小也就是12∗36=31212 * 36 = 312,一般来说对于该种密码我们至少得是在已知部分明文的情况下才可以攻击:

  • 枚举另一个参数:这种密码由两种参数来控制,如果我们知道其中任意一个参数,便可以很容易地快速采用枚举来得到答案
  • 已知两个加密字母及对应明文:假设我们已经知道采用的字母集,这里假设为26个字母,我们还有另外一种解密方式,只需要知道两个加密后的字母y1,y2y_1,y_2即可进行解密:
    y1=(ax1+b)(mod26)y_1=(ax_1+b) \quad (mod \quad 26)
    y2=(ax2+b)(mod26)y_2=(ax_2+b) \quad (mod \quad 26)
    两式相减可以得到:
    (y1−y2)=a(x1−x2)(modm)(y_1-y_2)=a(x_1-x_2) \quad (mod \quad m)
    这里y1,y2y_1,y_2已知,如果我们知道密文对应的两个不一样的字符x1,x2x_1,x_2,那么我们就很容易得到aa,进而可以得到bb了

# 多表代换加密

对于多表替换加密来说,加密后的字母几乎不再 保持原来的频率,所以我们一般只能通过寻找算法实现对应的弱点进行破解

# Playfair

Playfair密码(Playfair cipher or Playfair square普莱费尔密码)是一种经典的对称加密算法,属于古典密码学中的多字母替换密码,基本算法如下:

  1. 选取一串英文字母,除去重复出现的字母,将剩下的字母逐个加入5 × 5的矩阵内,剩下的空间由未加入的英文字母按照a-z的顺序加入(将q取出,或将i和j视作同一字)
  2. 将要加密的明文分成两个一组,若组内的字母相同,将X(或Q)加到该组的第一个字母之后重新分组,若剩下一个字也加入X
  3. Playfair密码将明文分成两个字母一组,每组按照以下三种规则进行加密:
    • 如果两个字母在矩阵中不同行也不同列,在矩阵中找出另外两个字母(第一个字母对应行优先),使这四个字母成为一个长方形的四个角
    • 如果两个字母同行,取这两个字母右边的字母(如果字母在最右方则取最左方的字母)
    • 如果两个字母同列,取这两个字母下方的字母(如果字母在最下方则取最上方的字母)
      新找到的两个字母就是原本两个字母加密的结果
      它和我们之前所提到的凯撒密码、仿射密码最大的区别在于它是一次加密两个字母,通过一个5 × 5的矩阵进行替换
      以MONARCHR为例,去掉重复字母,将i、j合并为一个字母,按顺序补充未出现字母,得到如下矩阵:

(MONARCHYBDEFGI/JKLPQSTUVWXZ)\begin{pmatrix} M & O & N & A & R\\ C & H & Y & B & D\\ E & F & G & I/J & K\\ L & P & Q & S & T\\ U & V & W & X & Z \end{pmatrix}

我们尝试加密字符串ZLARYYANDSU
首先对明文进行两个字母分组:

ZL AR YX YA ND SU

由于Playfair加密算法中通常不允许两个相同的字母出现在同一组,所以按照规则补充X

该图示由ChatGPT生成
由该图片可以很直观地看出ZL经过加密规则得到的密文是UT,同一行的明文字母AR经过加密为RM,如果是同一列的明文字母ML那么根据规则实际上得到的密文为CU

明文:ZLARYYANDSU
密钥:MONARCHY
密文:UTRMBWBNRYLX

工具:CAP4

# Polybius

Polybius密码又被称为棋盘密码,一般是将给定的明文加密为两两组合的数字(先行后列),其常用密码表:

1 2 3 4 5
1 A B C D E
2 F G H I/J K
3 L M N O P
4 Q R S T U
5 V W X Y Z

这种密码表的情况下,明文ZLARYY对应的密文为55 31 11 42 54 54
另一种密码表:

A D F G X
A b t a l p
D d h o z k
F q f v s n
G g j c u x
X m r e w y

ADFGX是结合了Polybius密码和置换密码的双重加密方案
明文ZLARYY使用这个表格加密就是DG AG AF XD XX XX,可以看出该密文的特点就是全部由ADFGX五个字母组成
工具:CrypTool

# Vigenere维吉尼亚密码

维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式

其中最上方一行对应明文字母,最左边一列对应密钥字母,举个例子:

明文:ZLARYY
密钥:SU

首先我们需要对密钥进行填充使其长度与明文长度一样:

明文:ZLARYY
密钥:SUSUSU


如图为对Z加密的结果,同理可得:

明文:ZLARYY
密文:RFSLQS

对包括维吉尼亚密码在内的所有多表密码的破译都是以字母频率为基础的,但直接的频率分析却并不适用,这是因为在维吉尼亚密码中,一个字母可以被加密成不同的密文,因而简单的频率分析在这里并没有用
破解维吉尼亚密码的关键在于它的密钥是循环重复的,如果我们知道了密钥的长度,那么密文就可以看做是交织在一起的凯撒密码,而其中每一个都可以单独破解,关于密码的长度我们可以使用卡西斯基试验和弗里德曼试验来获取
卡西斯基试验:针对维吉尼亚密码的密码分析方法,主要作用是在不知道密钥的情况下通过分析密文中重复出现的字符串推测密钥的长度,其关键在于密钥会周期性重复,如果明文中某一段字符串重复出现,并且两次出现时对应的密钥位置也相同,那么他们往往会被加密成相同的密文字符串,卡西斯基试验就是利用这个规律
事实上,维吉尼亚密码的加密公式为Ci=(Pi+KimodL)(mod26)C_i = (P_i+K_{i \quad mod \quad L}) \quad (mod 26),其中:

  • PiP_i:第ii个明文字母的数字
  • KiK_i:对应密钥字母的数字
  • LL:密钥长度
  • CiC_i:加密后的字母数字
    例如:
明文:FLAG IS ZLARYY{FLAG_IS_HERE}
密钥:KEYK EY KEYKEY KEYK EY KEYK
密文:PPYQ MQ JPYBCW{PPYQ_MQ_RIPO}

此时卡西斯基试验就能产生效果,对于更长的段落此方法更为有效,因为通常密文中重复的片段会更多,如通过下面的密文就能破译出密钥的长度:

密文:DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD

其中两个DYDUXRMH的出现间隔了18个字母,因此可以假定密钥的长度是18的约数,即长度为18、9、6、3或2,而两个NQD则相聚20个字母,意味着密钥长度应为20、10、5、4或2,取两者的交集则可以基本确定密钥长度为2
假设有三组重复出现的字符串,他们的间距分别为12、18、24,那么密钥长度可推测为gcd(12,18,24)=6gcd(12,18,24)=6,当然也可以推测为3、2
关于更加详细的破解原理可以参考:http://www.practicalcryptography.com/cryptanalysis/stochastic-searching/cryptanalysis-vigenere-cipher/
工具:

# Nihilist

Nihilist密码(虚无主义者密码)又称关键字密码:明文+关键字=密文,先使用Polybius方阵将字母转换成数字,再利用密钥对应的数字进行加法运算
Nihilist密码需要两个密钥,通常需要方阵密钥和加密密钥,前者用于构造5 × 5字母矩阵,后者用于生成周期性重复的数字序列,其加密公式通常为Ci=Pi+KiC_i=P_i+K_i,其中:

  • PiP_i:明文字母对应的Polybius数字
  • KiK_i:密钥字母对应的Polybius数字
  • CiC_i:加密后的数字
    假设方阵密钥为MONARCHY,加密密钥为SU,构造Polybius方阵:
1 2 3 4 5
1 M O N A R
2 C H Y B D
3 E F G I/J K
4 L P Q S T
5 U V W X Z

假设我们需要加密ZLARYY:

# 将明文转换成数字
Z  L  A  R  Y  Y
55 41 14 15 23 23

# 将密钥循环补齐并转为Polybius坐标
S  U  S  U  S  U
44 51 44 51 44 51

# 两组数字逐位相加得到最终密文
99 92 58 66 67 74

参考文章中并没有给到加密密钥,本质上是带关键字的Polybius,得到的PiP_i就是密文

# Hill

希尔密码(Hill)使用每个字母在字母表中的顺序作为其对应的数字,即A=0,B=1等,然后将明文转化为n维向量,跟一个n × n的矩阵相乘,再将得出的结果模26,注意用做加密的矩阵(即密匙)在Z26n\mathbb{Z}_{26}^n必须是可逆的,否则就不可能解码,只有矩阵的行列式和26互质才是可逆的,即:C=KP(mod26)C=KP \quad (mod 26),其中:

  • CC:密文向量
  • KK:密钥矩阵
  • PP:明文向量
  • 2626:英文字母总数
    假设加密明文SU,将其转化为矩阵:

(1820)\begin{pmatrix} 18\\ 20 \end{pmatrix}

假设密钥为2 × 2矩阵:

(3325)\begin{pmatrix} 3 & 3\\ 2 & 5 \end{pmatrix}

接下来进行矩阵乘法:

C=KP(mod26)=(3325)(1820)(mod26)=(114136)(mod26)=(106)C=KP(mod \quad 26)=\begin{pmatrix} 3 & 3 \\ 2 & 5\end{pmatrix}\begin{pmatrix}18\\20\end{pmatrix}(mod \quad 26)=\begin{pmatrix}114\\136\end{pmatrix}(mod \quad 26)=\begin{pmatrix}10\\6\end{pmatrix}

10对应K,6对应G,最终得到SU的密文为KG
对于Hill密码的解密,也就是需要求出密钥矩阵KK的模拟矩阵K−1K^{-1},P=K−1C(mod26)P=K^{-1}C (mod \quad 26),对于2 × 2矩阵K=(abcd)K=\begin{pmatrix}a&b\\c&d\end{pmatrix},它的逆矩阵公式为K−1=(ad−bc)−1(d−b−cd)(mod26)K^{-1}=(ad-bc)^{-1}\begin{pmatrix}d&-b\\-c&d\end{pmatrix}(mod \quad 26),这里的(ad−bc)−1(ad-bc)^{-1}指的是行列式在模26意义下的乘法逆元
工具:

# AutoKeyCipher

自动密钥密码(AutoKeyCipher)也是多表替换密码,与维吉尼亚密码类似,但使用不同的方式生成密钥,通常来说它要比维吉尼亚密码更安全,自动密钥密码主要有两种:关键词自动密钥密码和明文自动密钥密码
AutoKeyCipher与维吉尼亚密码最大的区别在于前者密钥不够长时可以使用明文本身或者某些变体中的密文继续补充密钥,而维吉尼亚密码在密钥不够长时实行不断重复元密钥,这导致了AutoKeyCipher密钥不再简单地周期性重复,而是根据消息内容自动延长
假设:

明文:ZLARYY IN DAOGE
密钥:SUUS
自动密钥:SUUSZL AR YYIND

接下来的加密过程和维吉尼亚密码类似从表格中相应位置找到明文对应的密文
工具:

# 其他类型加密

# 培根密码

培根密码使用两种不同的字体,代表A和B,结合加密表进行加解密

a AAAAA g AABBA n ABBAA t BAABA
b AAAAB h AABBB o ABBAB u/v BAABB
c AAABA i/j ABAAA p ABBBA w BABAA
d AAABB k ABAAB q ABBBB x BABAB
e AABAA l ABABA r BAAAA y BABBA
f AABAB m ABABB s BAAAB z BABBB

上面是常用的24字母版本加密表,还有另外的一种加密表,可认为是将26个字母从0到25排序,以二进制表示,A代表0,B代表1
按照表中的字母加密ZLARYY可以得到密文BABBB ABABA AAAAA BAAAA BABBA BABBA,按照26个字母排序的二进制密码表可以得到密文BBAAB ABABB AAAAA BAAAB BBAAA BBAAA
所以培根密码的核心是用五个二元符号编码一个字母
工具:http://rumkin.com/tools/cipher/baconian.php

# 栅栏密码

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

# 明文
ZLARYY AND SU IN DAOGE
# 去掉空格
ZLARYYANDSUINDAOGE
# 分成两栏两个一组
ZL AR YY AN DS UI ND AO GE
# 先取出第一个字母再取第二个字母
ZAYADUNAG
LRYNSIDOE
# 组合得到密文
ZAYADUNAGLRYNSIDOE

如果字母不够均分的话通常不需要补充字母,例如HELLO密文可以是HLOEL
工具:- https://www.qqxiuzi.cn/bianma/zhalanmima.php

# 曲路密码

曲路密码(Curve Cipher)是一种换位密码,需要事先双方约定密钥(也就是曲路路径)
假设明文为ZLARYY AND SU IN DAOGE,填入三行六列表(按照事先约定填充的行列数,通常按照从左到右、从上到下的顺序填入)

Z L A R Y Y
A N D S U I
N D A O G E

读取路线一般有顺时针螺旋、逆时针螺旋、蛇形读取等,假设这里的读取路线为Z→N→D→L→A→A→O→R→Y→G→E→YZ \to N \to D \to L \to A \to A \to O \to R \to Y \to G \to E \to Y,那么密文就是ZANDNLADAOSRYUGEIY,顺时针螺旋的话就得到密文ZLARYYIEGOADNANDSU

# 列移位加密

列移位加密(Column Translation Cipher)是一种比较简单易于实现的换位密码,通过一个简单的规则将明文打乱混合成密文,以明文WEB AND CRYPTO为例,密钥为ZLARYY

Z L A R Y Y
6 2 1 3 4 5
W E B A N D
C R Y P T O

根据密钥按照字母表排序,顺序按列输出得到密文BYERAPNTDOWC,一般来说最后一行不足不用补充字符,密钥中存在重复字母按从左到右顺序处理
工具:- http://www.practicalcryptography.com/ciphers/classical-era/columnar-transposition/ 行列数相等

# 01248密码

该密码又称为云影密码,使用0,1,2,4,8四个数字,其中0用来表示间隔,其他数字以加法可以表示出,如28=10,124=7,18=9,再用1→261 \to 26表示A→ZA \to Z
比如加密ZLARYY,对应的数字为26 12 1 18 25 25

  • 26:8+8+8+2
  • 12:8+4
  • 18:8+8+2
  • 25:8+8+8+1
    得到密文88820840108820888108881
    当然,也不一定只能用84这种来表示12,也可以用444或者822等,总之使用0作为分隔符,中间的非零数字相加再转换为字母

# JSFuck

JSFuck可以只用6个字符[]()!+来编写JavaScript程序,是一种JavaScript代码混淆与编码方式,其利用了JavaScript的隐式类型转换:

# false
![]

# true
!![]

# 0
+[]

# 1
+!+[]

# true
!+[]

# ""
[]+[] 

# Array
[]

简单讲解一下:

  • ![]:在JavaScript中,空数组是一个对象,对象在布尔运算中属于真值,因此![]为false,那么!![]也就表现为true了
  • +[]:一元加号会尝试将操作数转换为数字,空数组转换为原始值时得到空字符串,而空字符串转换成数字时0
  • +!+[]:由于+[]为0,那么!+[]就表示true,+!+[]则表示1,同理,(!+[])+(!+[])+(!+[])就表示3
  • (![]+[])[+[]]:表示f,![]+[]为字符串"false",然后使用数组下标提取[+[]],就可以得到第一个字母f,即"false[0]"表示f,同理可得(![]+[])[+!+[]]表示a
    加密在线网站:https://jsfuck.com/

# 猪圈密码

猪圈密码(Pigpen Cipher),也叫共济会密码(Freemason's Cipher)是一种以格子为基础的简单替代式密码,用几何图形替代英文字母

猪圈密码通常使用四组图形,分别表示26个英文字母,不同变体的字母位置可能有所不同
在加密时,只保留字母所在格子周围的线条而不是保留字母本身,比如A位于左上角,其右边和下边有线条,J和A使用相同的轮廓,但J多一个圆点
比如明文X marks the spot:

工具:

# 键盘密码

# 手机键盘加密方式

1 2(abc) 3(def)
4(ghi) 5(jkl) 6(mno)
7(pqrs) 8(tuv) 9(wxyz)

每个数字键上有3-4个字母,用两位数字来表示字母,例如ZLARYY用手机键盘表示就是945321739393

# 电脑键盘棋盘

电脑键盘棋盘加密,利用了电脑的棋盘方阵

# 电脑键盘坐标

该加密方法是利用键盘上面的字母行和数字行来进行加密,例如Q表示(1,1)(1,1),S表示(2,1)(2,1),以此类推,ZLARYY用电脑键盘XY表示就是312921141616

# 电脑键盘QWE

该加密方法就是用字母表替换键盘上的排列顺序
Q→A,W→B,E→CQ \to A,W \to B,E \to C以此类推,例如ZLARYY可以被加密为TSKDNN

# 键盘布局加密

简单说就是根据给定字符在键盘上所组成的样子来进行加密,比如4esxcft5在键盘上围成的路径为0

更新于