千家信息网

经典密码学——行置换加密法

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,很多教材上对于行置换密码、列置换密码的定义都不是完全相同,甚至核心思想根本不一样。笔者就自己学习的经历,简单介绍一种一些教材上所谓的"行置换密码"的算法,大家一起交流、探讨。利用这种加密方法,明文按行
千家信息网最后更新 2025年12月01日经典密码学——行置换加密法

很多教材上对于行置换密码、列置换密码的定义都不是完全相同,甚至核心思想根本不一样。笔者就自己学习的经历,简单介绍一种一些教材上所谓的"行置换密码"的算法,大家一起交流、探讨。

利用这种加密方法,明文按行填写在一个矩阵中,而明文则是以预定的顺序按列读取生成的。例如如果矩阵是4列5行,那么明文"encryption algorithm"(省去空格后)可以如下写入该矩阵:

2314
encr
ypti
onal
gori
thms

按一定的顺序读取列以生成密文。

对于这个示例,如果读取顺序为递增顺序,则明文就是:"ctarm eyogt npnoh rilis"(添加空格只是为了便于观察)。这种加密法的密钥是列数和读取列的顺序。如果列数很多,记起来可能会比较困难,因此它可以表示成一个关键词,该关键词的长度等于列数,而其字母顺序决定读取列的顺序。

例如,关键词"general"有7个字母,意味着矩阵有7列。由于"a"是"general"中字母顺序最低的,因此数字1放在第6列;从左往右,第一个"e"为其次,所以数字2放在第2列;第二个"e"则是使数字3放在第4列。最后的顺序如下:

g e n e r a l

4 2 6 3 7 1 5

_______________________________________________________________________________________

This scheme is to write the message in a rectangle, row by row, and read the message off, column by column, but permute the order of the columns.The order of the columns then becomes the key to the algorithm.For example,

Key: 4 3 1 2 5 6 7

Plaintext: a t t a c k p

o s t p o n e

d u n t i l t

w o a m x y z

Ciphertext: ttna aptm tsuo aodw coix knly petz (再次强调,空格只是为了便于观察)

Thus, in this example, the key is 4312567.To encrypt, start with the column that is labeled 1, in this case column 3. Write down all the letters in that column.

**************************************************************************************

上述的是一次加密,也可把上述密文当做新一轮加密的明文,再次进行行置换加密。

参考资料:

《Cryptography and Network Security Principles and Practice, Fifth Edition》

----William Stallings

《Classical And Contemporary Cryptology》 ----Richard Spillman

  1. //Z26上的行置换密码
  2. #include
  3. #include
  4. #include
  5. #include
  6. int length;//明文长度
  7. char plain[100000];
  8. char cipher[100000];
  9. char out[100000];
  10. int l;//密钥长度
  11. int key[100];//密钥
  12. int done_key[100]= {0}; //标记是否已经被转换为数字
  13. int num_key[100]= {0};//把密钥换成数字
  14. int num[100];//临时矩阵,存放使顺序递增的下标序号
  15. void gen();//密钥生成算法
  16. void encryption();
  17. void decryption();
  18. int length_str(int a[]);
  19. int main()
  20. {
  21. int i;
  22. FILE *fp;
  23. fp=fopen("plain.txt", "r");
  24. fscanf(fp, "%s", plain);//从文件读入明文
  25. fclose(fp);
  26. length=strlen(plain);
  27. gen();
  28. encryption();
  29. printf("以上正确");
  30. decryption();
  31. for(i=0;i
  32. {
  33. printf("%c", out[i]);
  34. }
  35. return 0;
  36. }
  37. void gen()//密钥生成算法
  38. {
  39. int i;
  40. printf("请输入想生成的随机密钥的长度:");
  41. scanf("%d", &l);
  42. srand(time(0));
  43. for(i=0; i
  44. {
  45. key[i]=rand()%26;
  46. }
  47. printf("\n随机产生的密钥串为:");
  48. for(i=0; i
  49. {
  50. printf("%c ", key[i]+97);
  51. }
  52. printf("\n\n");
  53. }
  54. char a[50000][100];//临时矩阵,为了更方便的把密文转换出来
  55. //这个数组必须设置为全局的,在函数中声明的话申请内存会出错!!!
  56. void encryption()
  57. {
  58. ///转换:把密钥字符串排序,变成数字
  59. int k=1;
  60. int i, j, m;
  61. int small;//每轮循环给"最小"的字母编号(未编号的、靠前的、序号小的字母为最小)
  62. for(i=0; i //把字母换成从1开始的数字
  63. {
  64. m=0;
  65. while(done_key[m]==1)
  66. m++;
  67. small=m;
  68. for(j=0; j
  69. {
  70. if(done_key[j]==0)//没转换则继续
  71. if(key[j]
  72. small=j;
  73. }
  74. num_key[small]=k;
  75. done_key[small]=1;
  76. k++;
  77. }//
  78. printf("The order of the key is :\n");
  79. for(i=0; i
  80. {
  81. printf("%d ", num_key[i]);
  82. }
  83. printf("\n");
  84. for(i=0; i //忽略非字母字符,把大写转换为小写
  85. {
  86. if(plain[i]>=65&&plain[i]<=90)
  87. {
  88. plain[i]+=32;
  89. }
  90. }
  91. while(length%l)
  92. {
  93. strcat(plain,"p");//不能整除时补上无效字符p
  94. length++;
  95. }
  96. //生成密文矩阵
  97. k=0;
  98. for(i=0; i //行
  99. for(j=0; j //列
  100. {
  101. a[i][j]=plain[k++];
  102. }
  103. k=0;
  104. for(i=0;i//列
  105. {
  106. for(j=0;j
  107. if(num_key[j]==i+1)
  108. num[i]=j;
  109. }
  110. k=0;
  111. for(m=0;m//列
  112. for(j=0;j//行
  113. cipher[k++]=a[j][num[m]];
  114. }
  115. char b[50000][100];
  116. void decryption()//解密函数
  117. {
  118. int i, j, k;
  119. k=0;
  120. for(i=0;i//num[i]作为列
  121. for(j=0;j//行
  122. b[j][num[i]]=cipher[k++];
  123. k=0;
  124. for(i=0;i//行
  125. for(j=0;j//列
  126. out[k++]=b[i][j];
  127. }

//同文件夹下需要有"plain.txt"文件,里面必须全部是英文字母,可大小写混杂,但是不能出现其他字符,如空格、回车换行、数字等。

顺序 密钥 字母 数字 明文 矩阵 生成 加密 置换 密码 字符 密文 空格 长度 关键 关键词 文件 算法 最小 再次 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库的格式文件 北京智能软件开发质量保障 数据库系统概论考研题目 网络安全警察的考试 浙江省西湖论剑网络安全大会 表格中数据库的初始化失败 全国网络安全知识竞赛答题 数据库 spark 贵阳社区团购软件开发公司 美国网络安全 签证好过吗 软件开发发在淘宝哪个类目 石家庄软件开发实习工资 公安网络安全总结 在苏州去哪里学软件开发 潼南天气预报软件开发 网络安全演讲稿500字高中 韦伯中文科技期刊数据库 连不上服务器数据库的原因 学习网络安全技术后的不足 江苏电商软件开发定制 数据库技术和数据库应用 深圳菁诚网络科技中国互联网行业 为什么服务器都是pvp的 程序软件开发在线咨询 卫计局网络安全风险评估报告 电话代理服务器地址怎么填 鹊启网络技术 火车站网络安全等级保护二级方案 单表和数据库的区别 电脑关机数据库未退出
0