2021-05-25

本文档展示了作者作为大二学生实现Feistel加密算法的过程,分别对字母和数字进行了加密。在字母加密中,通过轮密钥进行模26运算,而在数字加密时,采用了比较大小的方法来确定密钥。作者遇到的主要挑战在于解密时密钥的不确定性,最终解决了这一问题。代码示例包括字母和数字的加密过程。
摘要由CSDN通过智能技术生成

C语言实现简单的feisel算法:

本人大二学生学艺不精水平仅供实验报告作为参考

本次实验主要对feistel加密进行了测试,完成代码编写花费了很大力气。

首先我想完成对数字和字母的无差别编写,我想不借助互联网以我自己掌握的知识来编写,发现对字母进行加密时我用轮密钥的方法进行模26运算(F),加密时没有什么问题。但是

再处理解密时我遇到了很大的问题,就是在已知密文的情况下不可能知道该密文使用密钥加密时是直接余下来的还是过26余的,也就是说密钥加密会出现两种情况,而且每一轮都是如此,如果有6轮就会有2^6种不同的解密方式,这显然是在编程实现时非常痛苦的事。

后来我选择对数字进行加密,我试着解决我之前在轮密钥这出现的问题,我想过所有方法,加减,乘,整除,模,都会产生多种情况,只有一种最适宜:比大小!!!

如果轮密钥比该位上的数大直接赋值就行。

后续的问题便迎刃而解了。

刚开始尝试对字母加密

设置了10位

//feistel算法字母加密 
#include<stdio.h>
int main()
{
	char code[6][10],key[10]={'b','g','t','h','e','a','l','z','y','m'};
	printf("输入10位明文;\n");
	
	int i=0,j=0;
	for(i=0;i<10;i++)
	scanf("%c",&code[0][i]);
	int a,b,c,d,e;
	for(i=0;i<6;i++)
	{
		for(j=0;j<5;j++)
		
		{
			code[i+1][j]=code[i][5+j];
			a=key[i+j]-'a';
			b=code[i][5+j]-'a';
			c=(a+b)%26;
			d=code[i][j]-'a';
			e=c^d;
			e=e%26;
			code[i+1][5+j]=e+'a';
			
		}
		
	}
	
	for(i=0;i<10;i++)
	printf("%c",code[5][i]);
	return 0;

}

对数字进行加密:

//feistel数字串加密
#include<stdio.h>
int main()
{
	int ss[4][6];
	int key[5]={8,7,5,2,4};
	int ckey[5]={8,7,5,2,4};
	int i,k,m;
	printf("输入六位明文每位以空格间隔开:\n");
	for(i=0;i<6;i++)
	scanf("%d",&ss[0][i]);
	for(i=0;i<3;i++)
   {
   	 for(k=0;k<3;k++)
   	{      
   	 	ss[i+1][k]=ss[i][k+3];
   	 	if(key[k+i]>ss[i][k+3])
   		{    
   		     ss[i][k+3]=key[k+i];   			 
   			
		   }
   		ss[i+1][k+3]=ss[i][k]^ss[i][k+3];
   		
   		
	   }
   	
   	
   }
	
	
	for(i=0;i<6;i++)
	{  if(ss[3][i]>9)
	{   switch(ss[3][i])
	{
	
		case 10:printf("a ");break;
		case 11:printf("b ");break;
		case 12:printf("c ");break;
		case 13:printf("d ");break;
		case 14:printf("e ");break;
		case 15:printf("f ");break;}
	}
	else printf("%d ",ss[3][i]);
	
}
int tt[4][6];
printf("\n");
printf("输入密文 abcdef 以两位数字进行输入 谢谢!:\n");

for(i=0;i<6;i++)
	scanf("%d",&tt[0][i]);
	
	
for(i=0;i<3;i++)
   {
   	 for(k=0;k<3;k++)
   	{      
   	 	tt[i+1][k+3]=tt[i][k];
   	 	if(ckey[2+k-i]>tt[i][k])
   		{
   		     tt[i][k]=ckey[2+k-i];   			 
   			
		   }
   		tt[i+1][k]=tt[i][k]^tt[i][k+3];
	   }
   	
   	
   }

for(i=0;i<6;i++)
	{  if(tt[3][i]>9)
	{   switch(tt[3][i])
	{
	
		case 10:printf("a ");break;
		case 11:printf("b ");break;
		case 12:printf("c ");break;
		case 13:printf("d ");break;
		case 14:printf("e ");break;
		case 15:printf("f ");break;}
	}
	else printf("%d ",tt[3][i]);
	
}

	return 0;
	
 }

 

 

 

 

 

使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值