仿射密码加解密代码

#include <stdio.h> 
#include <ctype.h>
#include <string.h> 
//本程序特点:1.密钥的输入及检验、加密过程、解密过程都各自编写了独立的函数,使主函数更加明了,清晰!

int key1(int k1)	//对函数key1的定义,key1用于密钥k1的输入和检验
{
	do
	{
		printf("请输入密钥k1\n要求:k1为0~25之间的整数(包括0和25),并且k1不能为偶数,也不能等于13.\n");
		printf("k1 = ");
		scanf("%d",&k1);
		if(k1<0||k1>25||k1%2==0||k1==13)
			printf("k1输入有误,请重新输入\n");
	}
	while(k1<0||k1>25||k1%2==0||k1==13);
	return(k1);
}
int key2(int k2)	//对函数key2的定义,key2用于密钥k2的输入和检验
{
	do
	{
		printf("请输入密钥k2\n要求:k2为0~25之间的整数(包括0和25)\n");
		printf("k2 = ");
		scanf("%d",&k2);
		if(k2<0||k2>25)
			printf("k2输入有误,请重新输入!");
	}
	while(k2<0||k2>25);
	return(k2);
}

void encryption(int k1,int k2)	//对函数encryption的定义,encryption用于对明文的加密,并生成密文。
{
	char p[100];
	int length,i;
	printf("请输入明文(请省略两个单词之间的空格):\n");

	scanf("%s",&p);            //输入明文
	

	length = strlen(p);
	for(i=0; i<length; i++) 
    { 
        if(islower(p[i]))	   //检查当前字符是否为小写字母,是,返回1;不是,返回0
			p[i] = (k1*(p[i]-97)+k2)%26+65; 
        else if(isupper(p[i])) //检查当前字符是否为大写字母,是,返回1;不是,返回0
			p[i] = (k1*(p[i]-65)+k2)%26+65; 
    } 
    printf("加密之后的密文为%s\n:",p);
}

void decryption(int k1,int k2) //对函数decruption的定义,decryption用于对密文的解密,并生成明文。
{
    char p[100];
	int r=1,x=1;
    int i,length;
	printf("请输入密文:\n");
	scanf("%s",&p);
	while(r)
	{
		if((k1*x-1)%26==0)
			r=0;
		else
			x++;
	}
	length = strlen(p);
        for(i=0;i<length;i++)
	{
		if(p[i]-97-k2<0)
		{
		if(islower(p[i]))
			p[i]=(x*((p[i])-71-k2))%26+97;
		if(isupper(p[i]))
			p[i]=(x*((p[i])-39-k2))%26+65;
		}
		else
		{if(islower(p[i]))
			p[i]=(x*((p[i])-97-k2))%26+97;
		if(isupper(p[i]))
			p[i]=(x*((p[i])-65-k2))%26+65;
		}
	}
	printf("解密之后的明文为%s\n:",p);
	
}

void main()
{
	int k1,k2,eway,circulate=1;	//定义密钥k1,k2,eway,circulate;eway用于对进入方式的选择,当circulate=1时,该程序会循环执行,当circulate=0时,退出该程序。
	printf("欢迎使用此软件!\n");
	do
	{
		printf("请输入1~3,选择进入方式:\n1:加密	2:解密	3:退出\n");
		scanf("%d",&eway);
		switch(eway)
		{
		case 1:{
			k1=key1(k1);
			k2=key2(k2);
			encryption(k1,k2);
			break;
			   }
		case 2:{
			k1=key1(k1);
			k2=key2(k2);
			decryption(k1,k2);
			break;
			   }
		case 3:{
			printf("谢谢您的使用!\n");
			circulate=0;
			break;
			   }
		}
	}
	while(circulate);
}






  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值