古典密码之代换密码
继上一篇博客讲了古典密码的置换密码之后,这一篇博客我们接着来写古典密码之置换密码。
代换密码(代替密码)就是明文中每一个字符被替换成密文中的另外一个字符,代替后的各字母保持原来位置。对密文进行逆替换就可恢复出明文。有四种类型的代替密码:
(1)单表代替密码:就是明文的一个字符用相应的一个密文字符代替。加密过程中是从明文字母表到密文字母表的一一映射。
(2)同音代替密码:它与简单代替密码系统相似,唯一的不同是单个明文字符可以映射成密文的几个字符之一,列入A可能对应于5、13、25或56,B可能对应于7、19、31或42,所以,同音代替的密文并不唯一。
(3)多字母组代替密码:字符块被成组加密,例如”ABA”可能对应于“RTQ”,”ABB“可能对应于“SLL”等。
(4)多表代替密码:由多个简单的代替密码构成,例如,可能有5个被使用的不同的简单代替密码,单独的一个字符用来改变明文的每个字符的位置。
就四种代替密码举例如下:
1、单表代替密码:凯撒密码就是一种简单的单表代替,字母表中每一个字母用它向后移动三位后所对应的字母代换得到密码表。
明码表 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
密码表 D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
明文 v e n i, v i d i , v i c i
密文 Y H Q L. Y L G L. Y L F L
2、同音代替密码:
在同音代替中,一个明文字母表的字母a,可以变换为若干个密文字母
,称为同音字母,因此,从明文到密文的映射
的形式是
,其中A,C分别为明文和密文的字母表。
例:假定一个同音代替密码的密钥是一段短文,该文及其中各个单词的编号,如下所示:
(1)Canada’S large land mass and
(6)Scattered population make efficient communication
(11)a necessity.Extensive railway,road
(16)and other transportation systems,as
(21)well as telephone,telegraph,and
(26)cablenetworks,have helped to
(31)link communities and have played
(36)a vital part in the
(41)country’s development for future
在上表中,每一个单词的首字母都和一个数字对应,例如字母C与数字1,10,26,32,4l对应;字母M和数字4,8对应等,加密时可以用与字母对应的任何一个数字代替字母,例如,如果明文为I Love her forever的密文可能是:
39 2 17 37 9 28 9 14 43 17 14 13 37 13 14
3、多字母组代替密码:
明文中的字符块成组被加密,这里介绍一种第一次世界大战使用过的二字母组代替密码(Play fair密码)、它的密钥是由25个英文字母(J被除去)组成的五阶方阵。
每一对明文字母m1和m2,都根据以下5条规则进行加密:
(1)若m1和m2在密钥方阵中的同一行,则密文字母C1和C2分别是m1和m2右边字母(第一行看作在第五行的下边)。
(2)若m1和m2在同一列,则C1和C2分别是m1和m2右边的字母(第一行看作为第五行的下边)。
(3)若m1和m2在密钥方阵中的不同行和列,密文字母C1和C2分别是以m1和m2为顶点组成的长方形中的另两个顶点,其中m1和C1、m2和C2分别在同一行。
(4)若m1=m2,则在m1和m2之间插进一个无效字母,例如X。
(5)若明文信息共有奇数个字母,则在明文末尾附加一个无效字母。
每一对明文字母m1和m2,都根据以下5条规则进行加密:
(1)若m1和m2在密钥方阵中的同一行,则密文字母C1和C2分别是m1和m2右边字母(第一行看作在第五行的下边)。
(2)若m1和m2在同一列,则C1和C2分别是m1和m2右边的字母(第一行看作为第五行的下边)。
(3)若m1和m2在密钥方阵中的不同行和列,密文字母C1和C2分别是以m1和m2为顶点组成的长方形中的另两个顶点,其中m1和C1、m2和C2分别在同一行。
(4)若m1=m2,则在m1和m2之间插进一个无效字母,例如X。
(5)若明文信息共有奇数个字母,则在明文末尾附加一个无效字母。
密码表:

例如:
明文:YHWSDLAM
密文:VPZABKHN
4、多表代替密码:
大多数多表代替密码是周期代替密码,当周期为1时,就是单表代替密码。多表代替密码的种类很多,这里只介绍其中的Vigenere密码和游动钥密码。
在Vigenere密码中,用户钥是一个有限序列k=(k1,k2,k3…kd),我们可以通过周期性(周期为d)将k扩展为无限序列ki,其中Ki=K(i mod d),1≤i≤∞,从而得到工作钥K=(K1,K2,K3…)。
如果用Φ和θ分别表示密文和明文字母,则Vigenere密码的变换公式为:
Φ≡(θ+ ki)(mod n)
该密码体制有一个参数n。在加解密时,同样把英文字母映射为0~25的数字再进行运算,并按凡个字母一组进行变换。明文空间、密文空间及密钥空间都是长度为n的英文字母串的集合。
在Vigenere密码中,用户钥是一个有限序列k=(k1,k2,k3…kd),我们可以通过周期性(周期为d)将k扩展为无限序列ki,其中Ki=K(i mod d),1≤i≤∞,从而得到工作钥K=(K1,K2,K3…)。
如果用Φ和θ分别表示密文和明文字母,则Vigenere密码的变换公式为:
Φ≡(θ+ ki)(mod n)
该密码体制有一个参数n。在加解密时,同样把英文字母映射为0~25的数字再进行运算,并按凡个字母一组进行变换。明文空间、密文空间及密钥空间都是长度为n的英文字母串的集合。
Vigenere密码表:

例如:
明文:WXHWYB
密钥:BYGBYG
密文:XVNXWH
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!