古典加密算法(1)

  开学回来后,已经是大三后半年,同学们都忙着考证,一直复习都是操作系统和计算机组成原理。上网络安全时候老师布置了三道古典加密算法。我也希望和大家一起分享,有什么不对之处望指出。
  (1)凯撒加密算法
   I.对于字母表str[ ]a,b,c.....z(本例只考虑小写,你也可以改大小写的)换算成0,1,2...25个数组A[ ](简单的数组映射关系),即:str[i]=A[j],i=j;

(2)选取秘钥,输入key(0-25)
(3)则明文M转换成密文C公式就是
          C=E(m);
          C=(m+key)%26
  我的代码实现:其中我没有用映射,映射关系比较直观并且清晰,乘法和仿射会用到
#include<stdio.h>
#define M 20
static int flag=1;
void swapCh(char *str,const int key ,int sum);
void jie(char *str,const int key,int sum);
void main()
{
	char str[M],ch='1';
	int i=0,sum=0,key;
	printf("输入明码的字母数字*结束或者最大为20\n");
	while((i<20)&&ch!='*')//此处不考虑换行,也可加上,自己试试就知道了,你也能加if判断来剔除'\n'
	{
		scanf("%c",&ch);
		str[i]=ch;
		i++;
	}
    sum=i-1;
	//明文输出检查
	for(i=0;i<sum;i++)
		printf("%c",str[i]);
	printf("\n");
	printf("enter the key(0-26)");
	scanf("%d",&key);
	swapCh(&str[0],key,sum);
	for(i=0;i<sum;i++)
		printf("%c",str[i]);
	printf("\n");
	if(flag)
	{
		jie(str,key,sum);
		for(i=0;i<sum;i++)
			printf("%c",str[i]);
		printf("\n");
	}
	
}
void swapCh(char *str,const int key ,int sum)
{
	int k;
	if(key<=26&&key>0)
	{
		printf("correct it is working\n");
        for(k=0;k<sum;k++){
		if((str[k]+key)%'z'==0)
			str[k]='z';
		else if((str[k]+key)%'z'<'a')
			str[k]=(str[k]+key)%'z'+'a'-1;
		else
                str[k]=(str[k]+key)%'z';

	}
	}
	else{
		printf("it is wrong\n");
		flag=0;
	}
}
void jie(char *str,const int key,int sum)
{
	int k=0;
	printf("correct it is working\n");
	for(k;k<sum;k++){
	     if((str[k]-key)>='a')
			 str[k]=str[k]-key;
		 else
			 str[k]='z'-'a'+str[k]-key+1;
	}	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值