仿射密码C语言,仿射密码怎么解密
我是刚刚的同学,刚入网的小白。()
(疯狂的暗示喜欢!注意了!前进!喜欢!注意了!前进!)
*你的支持是同学前进的最大动力!(欢迎来到山东政法学院网络空间安全学院!仿射密码加密解密原理(C语言实现)你最好先学习欧几里德算法和欧几里德的扩展算法!以下链接是欧几里德算法和欧几里德扩展算法的代码讲解!欧几里德算法和欧几里德扩展算法的代码解释
仿射密码加密和解密的原理:
效果图:(k1必须取模26为1,否则重新输入)
详细代码:(加密和解密不分开,一起输出。有需要的同学可以自己改!)#包含stdio.h
#包含字符串. h
#包含数学. h
#定义N 200
使用命名空间std
Integcd (intr0,intr1,intrn,ints,intt){//欧几里德扩展算法
int R0=r0,R1=R1;
if(r0==0r1==0){
printf(错误:两个输入数字中有一个是零。\ n’);
返回0;
}
int q=0,r2=0,s0=1,s1=0,s2=0,t0=0,t1=1,T2=0;
而(r1!=0){
q=r0/R1;
r2=r0 % r1
S2=s0-S1 * q;//计算新的s
T2=t0-t1 * q;//计算新的t
//更新r0,r1,s0,s1,t0,t1
r0=r1r1=r2
s0=s1s1=s2
t0=t1t1=t2//保存S2和T2的值供下次使用。
}
rn=r0
if(r0==1){
s0=(R1(s0 % R1))% R1;
t0=(R0(t0 % R0))% R0;
Printf(与 k1: %d.\n ,s0相反);
s=s0
t=t0
返回s0;
}else if(r0!=1){
Printf(错误:k1和26的最大公因数不是1,请重新输入!\ n’);
返回0;
}
}
int affinicipher(int k1,int k2,int p){
int r,s,t;
char消息[N 1];
s=EGCD(p,k1,r,s,t);
while(r!=1){
Printf(请重新输入合法的k1!\ n’);
scanf(%d ,k1);
printf( \ n输入键为:k1=%d,k2=%d,p=%d \n ,k1,k2,p);
EGCD(p,k1,r,s,t);
getchar();
}
printf(输入要处理的消息:);
//以回车(换行符)作为字符串读取的结束。默认情况下,它以空格、回车和tab键结束。
scanf(%[^\n],message);
printf( \ n消息/明文是:%s\n ,消息);
int length=strlen(message);
char密码[长度],解密[长度];
//这是加密代码
Printf(加密输入文本:\ n );
printf(---\ n );
for(int I=0;I长度;i ){
if(消息[i]=a 消息[i]=z )
cipher[i]=(k1*(消息[I]- a )k2)% p a);
其他
if(消息[i]=A 消息[i]=Z )
cipher[i]=(k1*(消息[I]- A )k2)% p A);
其他
密码[I]=消息[I];
}
Printf(消息加密前后对比如下:\ n );
printf(输入文本为:%s.\n ,message);
printf(输出文本为:%s.\n ,cipher);
//这是解密代码
int reverse//k1的倒数
printf( \ n解密输入文本:\ n );
printf(---\ n );
reverse=EGCD(k1,p,r,s,t);//求k1的倒数
for(int I=0;I长度;i ){
if(cipher[I]= a cipher[I]= z )//已经修复,不会出现个别字母错误。
message[i]=((reverse*(密码[I]-k2- a )% p)p)& a ;
其他
if(cipher[i]=A cipher[i]=Z )
message[i]=((reverse*(密码[I]-k2- A )% p)p)& A ;//现已修复,不会出现单个字母错误。
其他
消息[I]=密码[I];
}
Printf(消息解密前后对比如下:\ n );//我爱你中国很棒
printf(输入文本为:%s.\n ,cipher);//5,3,26
printf(输出文本为:%s.\n ,message);
}
int main(){
int p,k1,k2;//仿射密钥c=k1*m k2 mod p经典密码p=26
Printf (\ n请输入三个仿射密码参数:k1,k2,p,用逗号分隔:);
//读取数值时,默认用空格分隔。如果需要逗号,请在%d: scanf(%d,%d ,k1,k2)后指定格式。
scanf(%d,%d,%d ,k1,k2,p);
printf( \ n输入键为:k1=%d,k2=%d,p=%d \n ,k1,k2,p);
//getchar()可以在scanf()之后吸收回车,以便输入下一个字符/字符串。尤其是以后需要输入带空格的字符串的时候。
getchar();
affinicipher(k1,k2,p);
}我是刚刚进网安的同学,小白。()
(疯狂的暗示喜欢!注意了!前进!喜欢!注意了!前进!)
*你的支持是同学前进的最大动力!
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。