ClassicalCryptography
部分古典密码
Install / Use
/learn @Lazuplis-Mei/ClassicalCryptographyREADME
ClassicalCryptography
这是一个包含了众多古典密码实现的程序库,它是100%由C#编写的类库,框架版本为.Net7。
它主要实现了以下几个类型的古典密码
Transposition
这一类型的密码为一维置换密码,仅改变内容字符的排列顺序,不改变内容,排列顺序的决定方式是一个基于一维坐标的公式$f(L,x)$,其中$L$为文本长度,$x$为从0开始的坐标索引。
这一类型的密码包括以下几个
ReverseCipher
倒序密码
- 无密钥
- 加密过程为文字从右向左读出
- 演示代码
ReverseCipher.Cipher.Encrypt("012345");
//> 543210
TakeTranslateCipher
取后平移密码
- 密钥$(n,k)$
- 密钥不可逆
- 密钥的字符串形式为两个
VChar64字符(这意味着n与k不会超过63) - 加密过程流程图
graph TB
A(开始)-->B{字符数>n}
B--True-->C[取出n个字符]
B--False-->D
C-->E{剩余字符>k}
E--True-->F[剩余字符向左平移k个单位]
F-->C
E--False-->D[取出剩余字符]
D-->G(结束)
- 演示输入
| 文本 | 密钥 | 结果 | | :------: | :----: | :------: | | 12345678 | (2, 3) | 12675834 |
- 演示过程
| 结果 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | | -------- | - | - | :-: | :-: | :-: | :-: | :-: | :-: | | 12 | | | [3] | [4] | [5] | 6 | 7 | 8 | | 12 | | | 6 | 7 | 8 | 3 | 4 | 5 | | 1267 | | | | | [8] | [3] | [4] | 5 | | 1267 | | | | | 5 | 8 | 3 | 4 | | 126758 | | | | | | | 3 | 4 | | 12675834 | | | | | | | | |
- 演示代码
var key = TakeTranslateCipher.Key.FromString("23");
TakeTranslateCipher.Cipher.Encrypt("12345678", key);
//> 12675834
TriangleCipher
三角形排列密码
- 无密钥
- 补足长度到下一个平方数
- 文字按行排列成(等腰直角)三角形
- 按列读出文字
- 演示输入
| 文本 | 结果 | | :-------: | :-------: | | 123456789 | 526137489 |
- 演示图示
| | | 1 | | | | - | - | - | - | - | | | 2 | 3 | 4 | | | 5 | 6 | 7 | 8 | 9 |
- 演示代码
TriangleCipher.Cipher.Encrypt("123456789");
//> 526137489
JosephusCipher
约瑟夫环^1密码
- 密钥$m$
- 密钥不可逆
- 加密过程
- 想象所有人围成一个环,开始报数
- 当报到第$m$个人,那个人就出列
- 接着以下一人为起点开始重新报数
- 重复步骤2和3,直到所有人都出列
- 演示输入
| 文本 | 密钥 | 结果 | | :----: | :--: | :----: | | 123456 | 3 | 364251 |
- 演示过程
| 结果 | 1 | 2 | 3 | 4 | 5 | 6 | | ------ | :-: | :-: | :-: | :-: | :-: | :-: | | 3 | 1 | 2 | [1] | 4 | 5 | 6 | | 36 | 1 | 2 | [1] | 4 | 5 | [2] | | 364 | 1 | 2 | [1] | [3] | 5 | [2] | | 3642 | 1 | [4] | [1] | [3] | 5 | [2] | | 36425 | 1 | [4] | [1] | [3] | [5] | [2] | | 364251 | [6] | [4] | [1] | [3] | [5] | [2] |
- 演示代码
var key = JosephusCipher.Key.FromString("3");
JosephusCipher.Cipher.Encrypt("123456", key);
//> 364251
RailFenceCipher
栅栏密码
严格来说,这不是真正的栅栏密码,它的名字应该是镰刀密码(ScytaleCipher^25),原始栅栏密码才是真正的栅栏密码,但这个错误的流传程度十分广泛,对此不必强求。
- 密钥(每组字数$n$)
- 加密过程
- 将文字按行排列成$n$列
- 按列依次读出文字
- 演示输入
| 文本 | 密钥 | 结果 | | :-----------------: | :--: | :-----------------: | | RailFenceCipherTest | 3 | RlnChTtaFcieeieeprs |
- 演示图示
| R | a | i | | :-: | :-: | :-: | | l | F | e | | n | c | e | | C | i | p | | h | e | r | | T | e | s | | t | | |
- 演示代码
var key = RailFenceCipher.Key.FromString("3");
RailFenceCipher.Cipher.Encrypt("RailFenceCipherTest", key);
//> RlnChTtaFcieeieeprs
OriginalRailFenceCipher^2
原始栅栏密码
- 密钥(栅栏/轨道数$m$)
- 加密过程
- 明文沿对角线向下写在假想围栏的连续“轨道”上
- 到达底部时向上移动
- 到达顶部时再次向下移动
- 重复步骤3和4直到写完所有字符
- 按行读出文本
- 演示输入
| 文本 | 密钥 | 结果 | | :-------------: | :--: | :-------------: | | WEAREDISCOVERED | 6 | WVEOEACRRSEEIDD |
- 演示图示
| W | | | | | | | | | | V | | | | | | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | | | E | | | | | | | | O | | E | | | | | | | A | | | | | | C | | | | R | | | | | | | R | | | | S | | | | | | E | | | | | | | E | | I | | | | | | | | D | | | | | | | D | | | | | | | | | |
- 演示代码
//使用和普遍版本相同的密钥类型
var key = RailFenceCipher.Key.FromString("6");
OriginalRailFenceCipher.Cipher.Encrypt("WEAREDISCOVERED", key);
//> WVEOEACRRSEEIDD
Transposition2D
这一类型的密码为二维置换密码,仅改变内容字符的排列顺序,不改变内容,排列顺序的决定方式是一个基于二维坐标的公式$f(L,x,y)$,其中$L$为文本长度,$x$为从0开始的横坐标索引,$y$为从0开始的纵坐标索引。
这一类型的密码包括以下几个
你也可以指定TranspositionCipher2D<T>.ByColumn属性来控制文本的组合方向
CycleTranspose
周期置换密码
- 密钥(多组排列对)
- 补足长度到宽度为排列对中最大值的矩形
- 加密过程
- 将文字排列成一个矩形
- 宽度为排列对中最大值
- 根据排列对交换文字的列
- 依据排列数的顺序依次读出文字
- 演示输入
| 文本 | 密钥 | 结果 | | :------------: | :----------: | :--------------: | | Sitdownplease! | (1,2,4)(3,5) | dSoitlwenp!a`se |
- 演示图示和过程
- 文字排列成5列
| S | i | t | d | o | | - | - | - | - | :-: | | w | n | p | l | e | | a | s | e | ! | ` |
- 第1列移动至第2列,第2列移动至第4列,第4列移动至第1列
| d | S | t | i | o | | - | - | - | - | :-: | | l | w | p | n | e | | ! | a | e | s | ` |
- 第3列移动至第5列,第5列移动至第3列
| d | S | o | i | t | | - | - | :-: | - | - | | l | w | e | n | p | | ! | a | ` | s | e |
- 演示代码
var key = CycleTranspose.Key.FromString("(1,2,4)(3,5)");
CycleTranspose.Cipher.Encrypt("Sitdownplease!", key);
//> dSoitlwenp!a`se
AdvancedRailFenceCipher
扩展栅栏密码
有种说法的确把它称作扩展栅栏密码,但它应该叫做列置换(ColumnarTransposition^26)
- 密钥(一组合法的排列)
- 补足长度到宽度为排列长度的矩形
- 加密过程
- 将文字按行排列成一个矩形
- 矩形宽度为排列长度
- 依据排列数的顺序按列读出文字
- 演示输入
| 文本 | 密钥 | 结果 | | :---------------: | :-----------: | :-----------------------: | | eg1ML9mymEqtKzeN0 | 7,4,3,5,6,2,1 | mz`9K`1E0gmNMq`Lt`eye |
- 演示图示和过程
- 文字排列成7列
| [7] | [4] | [3] | [5] | [6] | [2] | [1] | | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | e | g | 1 | M | L | 9 | m | | y | m | E | q | t | K | z | | e | N | 0 | ` | ` | ` | ` |
- 将列表按照7,4,3,5,6,2,1列的顺序填入
| [1] | [2] | [3] | [4] | [5] | [6] | [7] | | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | m | 9 | 1 | g | M | L | e | | z | K | E | m | q | t | y | | ` | ` | 0 | N | ` | ` | e |
- 演示代码
var key = AdvancedRailFenceCipher.Key.FromString("7,4,3,5,6,2,1");
AdvancedRailFenceCipher.Cipher.Encrypt("eg1ML9mymEqtKzeN0", key);
//> mz`9K`1E0gmNMq`Lt`eye
- 也可以通过单词创建排列(按字符编码顺序)
var permut = PermutHelper.WordToPermutation("KEYWORD");
//> 3,2,7,6,4,5,1
var key = AdvancedRailFenceCipher.Key.FromString(permut);
AdvancedRailFenceCipher.Cipher.Encrypt("eg1ML9mymEqtKzeN0", key);
//> mz`gmNeyeLt`9K`Mq`1E0
RotatingGrillesCipher^27
旋转栅格密码
- 密钥(栅格位置)
- 补足长度到边长为偶数的正方形
- 加密过程
- 准备一个$4n^2$的矩形
- 在指定的位置挖出洞
- 在栅格对应的位置填入文字
- 旋转栅格(默认顺时针旋转)
- 重复步骤填入4次
- 按行读出结果
- 如下所示即是一个合法的栅格
- 每一个栅格都有4个可能的位置
- 所以栅格由
QuaterArray类型表示 - 它的值为
2,3,1,0 - 字符串形式为
4:tA==
| | | █ | | | :-: | :-: | :-: | :-: | | | █ | | | | █ | | | | | | | | █ |
- 演示输入
| 文本 | 密钥 | 结果 |
| :--------------: | :------: | :--------------: |
| meetmeattwelvepm | 4:tA== | tmmveeewepeatlmt |
- 演示图示和过程
- 初始情况为
| | | █ | | | :-: | :-: | :-: | :-: | | | █ | | | | █ | | | | | | | | █ |
- 将meet填入栅格位置,并旋转栅格
| | █ | m | | | :-: | :-: | :-: | :-: | | | e | █ | | | e | | | █ | | █ | | | t |
- 填入meat并旋转栅格
| █ | m | m | | | :-: | :-: | :-: | :-: | | | e | e | █ | | e | | █ | a | | t | █ | | t |
- 填入twel并旋转栅格
| t | m | m | █ | | :-: | :-: | :-: | :-: | | █ | e | e | w | | e | █ | e | a | | t | l | █ | t |
- 填入vepm并旋转栅格
| t | m | m | v | | :-: | :-: | :-: | :-: | | e | e | e | w | | e | p | e | a | | t | l | m | t |
- 演示代码
var array = new QuaterArray(4);
array[0] = 2;
array[1] = 3;
array[2] = 1;
array[3] = 0;
var key = new RotatingGrillesCipher.Key(array);
//var key = RotatingGrillesCipher.Key.FromString("4:tA==");
RotatingGrillesCipher.Cipher.Encrypt("meetmeattwelvepm", key);
//> tmmveeewepeatlmt
- 也可以设置
AntiClockwise属性来让栅格逆时针旋转
MagicSquareCipher
幻方顺序密码
- 无密钥
- 补足长度到正方形
- 加密过程
-
用特定的方法构造n阶幻方(幻方可以有很多种顺序,但这里只采用以下方法产生的顺序)
- 奇数阶幻方使用Louberel(Siamese)法[^3]
- 双偶阶幻方使用对称交换法[^4]
- 单偶阶幻方使用Strachey法[^5]
-
根据幻方的顺序,按行读出文字
- 3阶幻方的图示
| 8 | 1 | 6 | | - | - | - | | 3 | 5 | 7 | | 4 | 9 | 2
