古典密码----仿射密码加解密

news/2024/11/8 2:40:21/

理论部分

  • 仿射密码是移位密码的一个推广,其加密过程不仅包含移位操作,而且使用了乘法运算。与移位密码相同,仿射密码的明文空间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
    在这里插入图片描述

http://www.ppmy.cn/news/839564.html

相关文章

密码加解密java语言实现

目录 前言 1.密码加密的主要方式 2.代码的实现过程 3.整体代码 前言 随着技术的发展&#xff0c;密码加密技术已经越来越普遍越来越多样化&#xff0c;在我们生活中常见的加密算法包括了DES加密算法,AES加密算法,RSA加密算法,MD5加密算法等等。密码加密在我们国家社会生活中…

数据库密码加解密

为符合数据安全&#xff0c;针对数据库密码进行加密以防止数据库密码明文展示而引发的安全隐患。 一、数据库密码加密&#xff1a; 加密Jar包&#xff1a; 数据库密码加密Jar包-Java文档类资源-CSDN下载 使用详解&#xff08;环境为JDK1.7&#xff09;&#xff1a; 1.通过…

密码学解密网站汇总

密码学解密网站汇总 0x00.综合 网站中包含大多编码的解码。http://web2hack.org/xssee/https://www.sojson.com/http://web.chacuo.net/ 0x01.文字倒序排列 http://www.qqxiuzi.cn/zh/daoxu/ 0x02.cmd5解密 http://www.cmd5.com/http://pmd5.com/http://tool.chinaz.com/Tools/…

密码的解密

题目描述 某网站为了安全起见&#xff0c;将用户的密码采用加密的形式存储。但是一旦用户忘记密码&#xff0c;需要解密程序还原用户的密码。&#xff08;1&#xff09;密码由8个英文字母组成。&#xff08;2&#xff09;解密规则为&#xff1a;①第1、4、7个字符的ASCII码1&a…

AES加解密之C++实现

一、AES介绍 AES&#xff0c;高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥&#xff0c;具体的加密流程如下图&#xff1a; 下面简单介绍下各个部分的作用与意义…

大字符串替换

在业务中&#xff0c;字符串格式化处理比较常见&#xff0c;替换也是个很常见的操作。 最近遇到个问题&#xff0c;在处理字符串替换过程中&#xff0c;遇到了out of memory错误。 string text; Dictionary<string, string> dic; foreach (var key in dic.Kesy) {text …

公司监控显示无网络连接服务器,监控显示无网络视频什么原因

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 监控显示无网络视频的原因有&#xff1a;接口接触不良&#xff1b;监视器出现故障&#xff1b;产品不合格&#xff1b;由于电压不稳摄像头被烧坏&#xff1b;设备连接错误&#xff…

安防视频流媒体服务器EasyNVR接入摄像头配置通道显示空白怎么处理?

大家知道我们的流媒体平台EasyNVR能够接入RTSP摄像头&#xff0c;进行网页无插件的视频监控&#xff0c;支持PC/安卓/iOS等主流终端&#xff0c;配置过程也易上手&#xff0c;操作简单。 我们的平台兼容多种浏览器&#xff0c;一般在浏览器内进行配置不会出现不兼容的情况&…