理论部分

  • 仿射密码是移位密码的一个推广,其加密过程不仅包含移位操作,而且使用了乘法运算。与移位密码相同,仿射密码的明文空间M和密文空间C均为Z26,因此,在使用仿射密码体制对英文消息进行加密之前,需要在26个英文字母与Z26中的元素之间建立一一对应关系,然后才能应用仿射密码体制进行相应的加密计算和解密计算。

代码部分

C语言实现

#include <stdio.h>
#include <math.h>
#include<string.h>
#define N 200 using namespace std;void Affine(char *Input, char *Output, int length,int k1, int k2,int p){int km=k1,ka=k2;for(int i=0; i<length; i++){if(Input[i]>='a'&&Input[i]<='z')Output[i]=(km*(Input[i]-'a')+ka)%p+'a';elseif(Input[i]>='A'&&Input[i]<='Z')Output[i]=(km*(Input[i]-'A')+ka)%p+'A';elseOutput[i]=Input[i];}Output[length]='\0';//字符串时及时添加结束标志以防额外增加数组长度。 printf("The Input  Text is: %s.\n",Input);
//  fflush(stdin);printf("The Output Text is: %s.\n",Output);
//  fflush(stdin);
} int EEA(int r0, int r1, int &r0_inverse, int &r1_inverse) {int R0=r0,R1=r1;if(r0==0 || r1==0){printf("ERROR: One of the two input numbers is zero.\n");return 0;}int q=0,r2=0,s0=1,s1=0,s2=0,t0=0,t1=1,t2=0;while(r1!=0){q=r0/r1;r2=r0%r1;s2=s0-s1*q;t2=t0-t1*q;//更新r0、r1、s0、s1、t0、t1 r0=r1;r1=r2;s0=s1;s1=s2;t0=t1;t1=t2;}//printf("THE GCD of R0 AND R1 IS: %d .\n", r0);//printf("Original s0 and t0: %d , %d.\n",s0,t0);if(r0==1){s0=(R1+(s0%R1))%R1;t0=(R0+(t0%R0))%R0;//printf("Afterwards [P+( x mod P)]mod P: s0 = %d ,t0= %d.\n",s0,t0);r0_inverse= s0;r1_inverse= t0;//printf("The inverse of %d mod %d is: %d\n",R1,R0,r1_inverse) ;}else{ printf("THE GCD is: %d  UNEQUAL TO 1, NO INVERSE EXITS.\n",r0) ;return 1;} return 0;
}int main(){int p =  26, k1, k2;//仿射密钥 c=k1*m+k2 mod p 古典密码p=26int p_, k_1, flag; char message[N + 1];do {flag = 0;printf("\nPlease input the three affine cipher parameters:k1,k2,p,以逗号分隔:"); //读取数值时,默认以空格分隔,如需逗号则在%d后面指定格式:scanf("%d,%d",&k1,&k2);scanf("%d,%d,%d",&k1, &k2, &p);printf("\nThe input keys are: k1=%d , k2= %d, p= %d \n",k1,k2,p); //getchar()在scanf()后,可以吸收回车符,以便输入下一个字符/串。特别是在后续需输入含空格的字符串时 getchar();flag = EEA(p, k1, p_, k_1);if (flag == 1)printf("输入的密钥无效,请重新输入!\n");} while(flag == 1);printf("Input the message to process:");//以回车(换行)作为字符串读取的结束,默认遇空格、回车、跳格键结束。 scanf("%[^\n]", message);printf("\nThe message/plaintext is:%s", message);int length = strlen(message);char cipher[length], decipher[length];printf("对输入的文本进行加密处理:\n");printf("消息加密前后对比如下:\n");Affine(message, cipher, length, k1, k2, p);//补充解密部分printf("消息解密前后对比如下:\n");Affine(cipher, decipher, length, k_1, ((p - k2) * k_1) % 26, p);return 0;
}

运行结果截图

  • gcd为1
  • gcd不为1

古典密码----仿射密码加解密相关推荐

  1. 密码学基础(二)单表---置换密码 凯撒密码 棋盘密码 乘法密码 仿射密码 多表---vigenere方阵

    1古典密码 (1)置换密码 明文字母重新排列,字母本身不变,但是位置发生变化(倒序或者按照按照数组排列后以行或列重新组合) (2)代替密码 分为单表代替密码和多表代替密码 单表代替密码中代表性的 凯撒 ...

  2. 实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...

    题目: 使用古典密码 一喵星人要想喵星发送一段不知道干什么用的密码"BLOCKCIPHERDESIGNPRINCIPLE", 但是它忘记了密钥是什么, 手头(爪头)只有它自己加密过 ...

  3. Bouncy Castle 密码包实现加解密

    Bouncy Castle 介绍 Bouncy Castle API目前包括以下内容: 适用于Java和C#的轻量级加密API. Java加密扩展(JCE)和Java加密体系结构(JCA)的提供程序. ...

  4. python中凯撒密码_python实现凯撒密码、凯撒加解密算法

    凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果 注意:密文是大写字母,在变换加密之前把明文字母都替换为大写字母 def casar(message): # *************begin* ...

  5. 凯撒加密的python语言程序_python实现凯撒密码、凯撒加解密算法

    凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果 注意:密文是大写字母,在变换加密之前把明文字母都替换为大写字母 def casar(message): # *************begin* ...

  6. python实现凯撒密码、凯撒加解密算法

    python实现凯撒密码.凯撒加解密算法 更多python视频教程请到菜鸟教程https://www.piaodoo.com/ 凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果 注意:密文是大写字 ...

  7. 密码加密解密(三)——仿射密码设计

    代换密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文.例如,明文字母a.b.c.d,用D.E.F.G做对应替换后形成密文. 代换密码包括多种类型,如单表代换密码.多表代换 ...

  8. 古典密码——代替密码

    代替密码 什么是代替密码? 首先构造一个或多个密文字母表,然后用密文字母表中的字母或字母组来代替明文字母或字母组,各字母或字母组的相对位置不变,但其自身发生改变. 代替密码又分为单表代替密码.多表代替 ...

  9. [转]CTF密码学——常见编解码及加解密总结

    做了一些CTF密码学的题目,阅读了很多大神的博客,现在做个总结,不全面的之后补充. 目录 编码 进制表示 ASCII码对照表 unicode编码 URL编码 Escape/Unescape Base6 ...

最新文章

  1. 4.10日一直报错application未注入的问题解决
  2. python气象数据可视化_python grib气象数据可视化
  3. Linux系统下安装phpmyadmin方法
  4. ContentProvider再探——Document Provider
  5. 解决问题的经验-javaweb-第一次-已掌握技术栈大致总结(部分),和相关理解,总结,以及对未来学习方向的规划
  6. HSRP双机热备工作原理与配置
  7. SAP plant and location
  8. 这种动作片还需要汽车特效?
  9. 使用Apache Mahout创建在线推荐系统
  10. 华尔街顶级大师胡立阳名言
  11. python画柱状图-Python:Matplotlib 画曲线和柱状图(Code)
  12. jq js json 转字符串_JSON字符串转换成JSON对象的JS代码
  13. 天天生鲜项目页面——商品列表页
  14. 8.docker run --rm
  15. win10+Ubuntu双系统下如何完美卸载Ubuntu系统
  16. 从苏宁电器到卡巴斯基第29篇:难忘的三年硕士时光 V
  17. rop检查_他山之石丨详解抗VEGF治疗在ROP诊疗中的应用
  18. 程序化交易的基本特点分析
  19. “创享杯”第一届电子数据取证线上大比武答案(自做)
  20. 有哪些有意思的,很 cool 的开源 C++ 项目 ?

热门文章

  1. 吴恩达OpenAI基于ChatGPT的Prompt开发教程
  2. LTSPICE使用教程:导入第三方库模型进行仿真
  3. 拉格朗日插值法 【python】
  4. App Store 审核被拒的各种原因
  5. PNETlab最新版介绍与下载
  6. 测绘-编写数字高程模型(DEM)内插程序
  7. Rect电影项目 及 豆瓣Api最新接口
  8. 蓝牙突然消失,ubuntu连接音箱没有声音问题
  9. *.axf: Error: L6218E: Undefined symbol xxx(xxx.o)问题解决与inline函数的声明
  10. C语言:离散数学8.1.5 笛卡尔积