SkillAgentSearch skills...

ClassicalCryptography

部分古典密码

Install / Use

/learn @Lazuplis-Mei/ClassicalCryptography
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

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

三角形排列密码

  • 无密钥
  • 补足长度到下一个平方数
  1. 文字按行排列成(等腰直角)三角形
  2. 按列读出文字
  • 演示输入

| 文本 | 结果 | | :-------: | :-------: | | 123456789 | 526137489 |

  • 演示图示

| | | 1 | | | | - | - | - | - | - | | | 2 | 3 | 4 | | | 5 | 6 | 7 | 8 | 9 |

  • 演示代码
TriangleCipher.Cipher.Encrypt("123456789");
//> 526137489

JosephusCipher

约瑟夫环^1密码

  • 密钥$m$
  • 密钥不可逆
  • 加密过程
  1. 想象所有人围成一个环,开始报数
  2. 当报到第$m$个人,那个人就出列
  3. 接着以下一人为起点开始重新报数
  4. 重复步骤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$)
  • 加密过程
  1. 将文字按行排列成$n$列
  2. 按列依次读出文字
  • 演示输入

| 文本 | 密钥 | 结果 | | :-----------------: | :--: | :-----------------: | | 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$)
  • 加密过程
  1. 明文沿对角线向下写在假想围栏的连续“轨道”上
  2. 到达底部时向上移动
  3. 到达顶部时再次向下移动
  4. 重复步骤3和4直到写完所有字符
  5. 按行读出文本
  • 演示输入

| 文本 | 密钥 | 结果 | | :-------------: | :--: | :-------------: | | 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

周期置换密码

  • 密钥(多组排列对)
  • 补足长度到宽度为排列对中最大值的矩形
  • 加密过程
  1. 将文字排列成一个矩形
  2. 宽度为排列对中最大值
  3. 根据排列对交换文字的列
  4. 依据排列数的顺序依次读出文字
  • 演示输入

| 文本 | 密钥 | 结果 | | :------------: | :----------: | :--------------: | | Sitdownplease! | (1,2,4)(3,5) | dSoitlwenp!a`se |

  • 演示图示和过程
  1. 文字排列成5列

| S | i | t | d | o | | - | - | - | - | :-: | | w | n | p | l | e | | a | s | e | ! | ` |

  1. 第1列移动至第2列,第2列移动至第4列,第4列移动至第1列

| d | S | t | i | o | | - | - | - | - | :-: | | l | w | p | n | e | | ! | a | e | s | ` |

  1. 第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)

  • 密钥(一组合法的排列)
  • 补足长度到宽度为排列长度的矩形
  • 加密过程
  1. 将文字按行排列成一个矩形
  2. 矩形宽度为排列长度
  3. 依据排列数的顺序按列读出文字
  • 演示输入

| 文本 | 密钥 | 结果 | | :---------------: | :-----------: | :-----------------------: | | eg1ML9mymEqtKzeN0 | 7,4,3,5,6,2,1 | mz`9K`1E0gmNMq`Lt`eye |

  • 演示图示和过程
  1. 文字排列成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 | ` | ` | ` | ` |

  1. 将列表按照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

旋转栅格密码

  • 密钥(栅格位置)
  • 补足长度到边长为偶数的正方形
  • 加密过程
  1. 准备一个$4n^2$的矩形
  2. 在指定的位置挖出洞
  3. 在栅格对应的位置填入文字
  4. 旋转栅格(默认顺时针旋转)
  5. 重复步骤填入4次
  6. 按行读出结果
  • 如下所示即是一个合法的栅格
  • 每一个栅格都有4个可能的位置
  • 所以栅格由QuaterArray类型表示
  • 它的值为2,3,1,0
  • 字符串形式为4:tA==

| | | █ | | | :-: | :-: | :-: | :-: | | | █ | | | | █ | | | | | | | | █ |

  • 演示输入

| 文本 | 密钥 | 结果 | | :--------------: | :------: | :--------------: | | meetmeattwelvepm | 4:tA== | tmmveeewepeatlmt |

  • 演示图示和过程
  • 初始情况为

| | | █ | | | :-: | :-: | :-: | :-: | | | █ | | | | █ | | | | | | | | █ |

  1. 将meet填入栅格位置,并旋转栅格

| | █ | m | | | :-: | :-: | :-: | :-: | | | e | █ | | | e | | | █ | | █ | | | t |

  1. 填入meat并旋转栅格

| █ | m | m | | | :-: | :-: | :-: | :-: | | | e | e | █ | | e | | █ | a | | t | █ | | t |

  1. 填入twel并旋转栅格

| t | m | m | █ | | :-: | :-: | :-: | :-: | | █ | e | e | w | | e | █ | e | a | | t | l | █ | t |

  1. 填入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

幻方顺序密码

  • 无密钥
  • 补足长度到正方形
  • 加密过程
  1. 用特定的方法构造n阶幻方(幻方可以有很多种顺序,但这里只采用以下方法产生的顺序)

    • 奇数阶幻方使用Louberel(Siamese)法[^3]
    • 双偶阶幻方使用对称交换法[^4]
    • 单偶阶幻方使用Strachey法[^5]
  2. 根据幻方的顺序,按行读出文字

  • 3阶幻方的图示

| 8 | 1 | 6 | | - | - | - | | 3 | 5 | 7 | | 4 | 9 | 2

View on GitHub
GitHub Stars25
CategoryDevelopment
Updated10d ago
Forks1

Languages

C#

Security Score

85/100

Audited on Mar 29, 2026

No findings