C语言实现凯撒密码加解密

凯撒密码

  • 加密即把a-z或A-Z的字母向后移动n个字符实现加密,若n=3的话,a对应d,z对应c,如此循环;
  • 解密刚好和加密相反,加密向后移动的话解密就向前移动。
    加密的C代码如下:
#include <stdio.h>
void encode(char str[],int n)
{
	//使用两个数组分别存放大小写字符
	char min[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
	char max[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
	int i,k,m; 
	for(i=0;str[i]!='\0';i++)//判空条件也可以使用strlen(str)来获取str长度实现 
	{
		if('a'<=str[i] && str[i]<='z')
		{
			k=str[i]-'a';//使用k来获得当前字符对于字符a的偏离程度。若当前字符为a,则k=0,刚好符合字符数组min的下标
			m=(26+k+n)%26;//使用m来保存移动后的字符,对26取余数保证m始终位于0至25之间。若n为复数的话k+n可能小于0,因此在前面加上26保证其为正数。
			str[i]=min[m];
		}	
		else if('A'<=str[i] && str[i]<='Z')
		{
			k=str[i]-'A';
			m=(26+k+n)%26;
			str[i]=max[m];
		}		
	}		
}

int main()
{
	char a[10],ch;
	int n;
	printf("输入n值:");
	scanf("%d",&n);
	ch=getchar();
	printf("\n输入原始字符串:");
	gets(a);
	encode(a,n);
	printf("\n转换后:");
	puts(a);
	return 0;
}

解密的C代码如下:

#include <stdio.h>
void decode(char str[],int n)
{
	//使用两个数组分别存放大小写字符
	char min[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
	char max[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
	int i,k,m; 
	for(i=0;str[i]!='\0';i++)//判空条件也可以使用strlen(str)来获取str长度实现 
	{
		if('a'<=str[i] && str[i]<='z')
		{
			k=str[i]-'a';//使用k来获得当前字符对于字符a的偏离程度。若当前字符为a,则k=0,刚好符合字符数组min的下标
			m=(26+k-n)%26;//使用m来保存移动后的字符,由于k-n可能为负数因此在前面加上26保证其为正数。
			str[i]=min[m];
		}	
		else if('A'<=str[i] && str[i]<='Z')
		{
			k=str[i]-'A';
			m=(26+k-n)%26;
			str[i]=max[m];
		}		
	}		
}
int main()
{
	char a[10],ch;
	int n;
	printf("输入n值:");
	scanf("%d",&n);
	ch=getchar();
	printf("\n输入原始字符串:");
	gets(a);
	decode(a,n);
	printf("\n转换后:");
	puts(a);
	return 0;
}
  • 45
    点赞
  • 268
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
凯撒密码是一种简单的加密方式,它将明文中的每个字符按照一定规律进行移位,从而得到密文。解密时,将密文中的每个字符按照相反的规律进行移位,就可以得到原文。 以下是C语言实现凯撒密码加密解密的示例代码: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 100 // 加密函数 void encrypt(char *str, int key) { int len = strlen(str); for (int i = 0; i < len; i++) { if (str[i] >= 'a' && str[i] <= 'z') { str[i] = 'a' + ((str[i] - 'a' + key) % 26); } else if (str[i] >= 'A' && str[i] <= 'Z') { str[i] = 'A' + ((str[i] - 'A' + key) % 26); } } } // 解密函数 void decrypt(char *str, int key) { int len = strlen(str); for (int i = 0; i < len; i++) { if (str[i] >= 'a' && str[i] <= 'z') { str[i] = 'a' + ((str[i] - 'a' - key + 26) % 26); } else if (str[i] >= 'A' && str[i] <= 'Z') { str[i] = 'A' + ((str[i] - 'A' - key + 26) % 26); } } } int main() { char str[MAX_LEN]; int key; // 获取用户输入 printf("请输入要加密的字符串:"); fgets(str, MAX_LEN, stdin); printf("请输入加密密钥:"); scanf("%d", &key); // 加密 encrypt(str, key); printf("加密后的字符串为:%s", str); // 解密 decrypt(str, key); printf("解密后的字符串为:%s", str); return 0; } ``` 在上面的代码中,我们定义了两个函数encrypt和decrypt,分别用于加密和解密操作。加密和解密的过程都是通过遍历明文或密文中的每个字符,并按照一定规律进行移位来实现的。在这里,我们规定只对英文字符进行加密和解密,忽略其他字符(如空格、数字等)。同时,我们假设输入的密钥是一个整数。在实际应用中,可能需要对输入的密钥进行一些限制,例如限制密钥的范围或长度等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值