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

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

2 3 1 4
e n c r
y p t i
o n a l
g o r i
t h m s

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

对于这个示例,如果读取顺序为递增顺序,则明文就是:“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<stdio.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. #include<time.h>
  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<length;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<l; i++)
  44. {
  45. key[i]=rand()%26;
  46. }
  47. printf("\n随机产生的密钥串为:");
  48. for(i=0; i<l; 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<l; i++) //把字母换成从1开始的数字
  63. {
  64. m=0;
  65. while(done_key[m]==1)
  66. m++;
  67. small=m;
  68. for(j=0; j<l; j++)
  69. {
  70. if(done_key[j]==0)//没转换则继续
  71. if(key[j]<key[small])
  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<l; i++)
  80. {
  81. printf("%d ", num_key[i]);
  82. }
  83. printf("\n");
  84. for(i=0; i<length; 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<length/l; i++) //行
  99. for(j=0; j<l; j++) //列
  100. {
  101. a[i][j]=plain[k++];
  102. }
  103. k=0;
  104. for(i=0;i<l;i++)//列
  105. {
  106. for(j=0;j<l;j++)
  107. if(num_key[j]==i+1)
  108. num[i]=j;
  109. }
  110. k=0;
  111. for(m=0;m<l;m++)//列
  112. for(j=0;j<length/l;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<l;i++)//num[i]作为列
  121. for(j=0;j<length/l;j++)//行
  122. b[j][num[i]]=cipher[k++];
  123. k=0;
  124. for(i=0;i<length/l;i++)//行
  125. for(j=0;j<l;j++)//列
  126. out[k++]=b[i][j];
  127. }

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

转载于:https://blog.51cto.com/4802380/1194399

经典密码学——行置换加密法相关推荐

  1. 经典密码学与现代密码学

    一.密码学概论 1.密码学是构建功能更强大.更有效的新的加密-解密方法的科学. 2.密码分析学是发现已有加密法的弱点,以便不用密钥就能还原成明文的科学.. 3.编码法就是用字.短语或数字来替代明文.生 ...

  2. 网络经典命令行(好東西不敢獨享)[ITAA网络实验室]

    网络经典命令行 Windows 2k/2003 Server 1.最基本,最常用的,测试物理网络的 ping 192.168.10.88 -t ,参数-t是等待用户去中断测试 2.查看DNS.IP.M ...

  3. 《现代密码学》第一章——经典密码学介绍

    第一章经典密码学介绍 1.1密码学和现代密码学 a.现代密码学与古典密码学的区别: 1.2对称密钥加密的基本设置 a. b.加密的语法 密钥产生算法Gen:一种概率算法 加密算法Enc:输入密钥k,明 ...

  4. 密码学:流加密法与块加密法

    文章目录 参考 基础 流加密法 算法描述 破解 块加密法 算法描述 模式 填充问题 例子 DES 简介 Feistel结构 子密钥产生算法 轮函数 3DES 简介 AES 简介 Rijndael结构 ...

  5. 网络经典命令行【网络高手必备】

     12.在DOS行下设置静态IP      A.设置静态IP      CMD      netsh      netsh>int      interface>ip      inter ...

  6. python实现经典密码学中列移位算法

    ⭐本专栏主要用python实现密码学中的常用经典算法,例如Vigenere.3DES.RSA.ElGamal.Diffie-Hellman.RSA签名.ElGamal签名.HMAC.哈希算法.列移位. ...

  7. 【经典密码学】Rot5/Rot13/Rot18/Rot47----python

    ROT-13 加密,英文字母表的13位移位 两次加密结果相同,即密文用相同方法二次加密可得明文,类凯撒加密. 以下是初次尝试用代码编写,后来在找有没有能自己生成lookup-tuple的方法,手动写真 ...

  8. 斯坦福密码学-3-分组密码block_cipher

    一.What is a block cipher? 1. PRPs 和 PRFs 伪随机函数和伪随机置换 2. PRP和PRF安全定义 安全PRF 安全PRF的定义如下: 伪随机函数SFS_FSF​与 ...

  9. python密码学编程pdf-Python密码学编程PDF电子书免费下载

    本书主要介绍了加密算法,同时从Python编程的角度来引导读者将加密算法更好地实现.书中不仅讲述了详细的算法理论,还附以详细的代码示例帮助读者更好地学习算法,并最终实现加密算法.除此之外,书中还提供了 ...

最新文章

  1. linux下apache和jboss集群和负载均衡
  2. Xamarin提示Build-tools版本过老
  3. linux下载文件一直超时,Linux下connect超时处理(总结)
  4. 2016年-2020年 考研 国家线汇总
  5. SimpleDateFormat非线程安全
  6. android xml中设置水平虚线及竖直虚线
  7. linux客户端无法绑定端口号,为什么Linux客户端的情况下不支持端口共用?
  8. MFC中树形控件的应用——电话簿
  9. ajax php 返回数组并父子给变量,将字符串变量从PHP发送回数组变量的ajax ...?
  10. iOS TableView多级列表
  11. 综合前置接口报文规范_浅谈用HttpRunner进行接口自动化测试
  12. php pdo sql注入,「原创」PHP实战-PDO优化及 SQL注入
  13. Apache Rewrite实现URL的跳转和域名跳转
  14. 计算机管理储存u盘无法使用,Win7系统退出U盘后重新插入电脑无法使用怎么办
  15. 潭州课堂25班:Ph201805201 第十二课 new方法,定制属性访问,描述符与装饰器 (课堂笔记)...
  16. 极速pdf编辑器的水印如何去掉_如何去掉PDF右下角的全能扫描王水印
  17. 大数据 TXT文本去重 TXT文本排序 TXT文本提取 TXT文本对比分离 TXT文件求并集 TXT文件求交集 TXT文件求补集 软件 工具
  18. [TJOI2019]唱、跳、rap和篮球_生成函数_容斥原理_ntt
  19. 计算机网络复习-第六章应用层
  20. python绘制五角星

热门文章

  1. java方法里执行两条sql_Java如何在数据库上执行多个SQL命令?
  2. 最小二乘法预测c语言,用最小二乘法推导本吧会员增长方程,以预测人数增长情况...
  3. 【每日一题】比较版本号
  4. 存款利息python题_python入门教程NO.8 用python写个存款利息计算器 已
  5. matlab7.0怎么用,matlab7.0中simulink使用
  6. [k8s] 第七章 Service详解
  7. Spring Security原理之springSecurityFilterChain
  8. Xcode7.1环境下上架iOS App到AppStore 流程 (1)
  9. Python的零基础超详细讲解(第十三天)-Python的类与对象
  10. 计算机专业美国最好的学校排名,美国计算机专业大学排名