当前位置: 首页 > 科技观察

教你实现一个简单的数据加密解密算法_0

时间:2023-03-16 20:01:37 科技观察

本文一口君将带领大家自己实现一个简单实用的加密方法,让你在实际项目开发中了解数据加密的过程。1.一种常见的网络通信加密过程加密算法有很多种,实际实现过程千差万别。下图是一个常见的网络通信加密应用场景。密码机的一些说明:客户端和服务器端都可以设置密码机(可以是软件也可以是硬件,可以在本地也可以在服务器上,只要能生成密钥即可)keygen和同步码会影响密码机生成的密钥序列。当密钥生成器和同步码相同时,密码机将生成相同的密钥序列。加解密双方需要记住密钥生成的顺序,根据解密后的数据申请多少密钥。如图,基于C/S架构的服务端与客户端通信模型,如下图,如果客户端要向服务端发送一个加密后的密文,需要C/S进程进行交互。1、服务器发送密钥密文。首先,服务器和客户端存储一个默认密钥。服务器随机生成密钥keygen,并使用默认密钥对keygen进行加密。客户端可以通过命令定期请求密钥密文或服务器定期发送密钥密文来生成密钥密文。客户端收到密钥密文后,也可以通过默认密钥进行解密,得到明文keygen2。客户端加密数据。客户端在发送数据前,首先生成一个同步码,将同步码和keygen设置到密码机,然后向密码机申请一定长度的密钥,通过一定的算法(通常是XOR)对明文和密钥进行加密),并生成数据密文3.客户端发送同步码和数据密文客户端将数据密文和同步码明文发送给服务端。服务器提取同步代码。4.服务器接收数据并解密。服务器设置keygen和同步码给密码机,同时申请一定数量的key。服务器根据密钥对密文进行解密,得到对应的明文。由于此时服务端和客户端使用相同的keygen和同步码,所以双方申请的keysequence必须相同。2.函数实现下面是易扣君实现的加密算法的部分函数原型和功能说明。这些函数基本实现了第一节的功能。1、申请加密密钥函数request_keyintrequest_key(intsync,intkey_num,charkey[])函数:从密码机申请一定数量的密钥加密数据,如果没有设置新的keygen,则生成的密码会依次生成,每次你申请了一个key,会记录上次生成的key的offset,下次申请的时候,会从之前的位置继续分发key。keykey_num:申请的key个数key:申请的key存储的缓存返回值:实际返回的key个数生成随机密钥序列参数:key:key返回值:None3.生成随机数born_seedintborn_seed(intsync,intkey)功能:根据同步码和keygen参数生成随机密钥种子:sync:同步码key:returnkeyValue:seed4.重置keygenreset_keygen()voidreset_keygen()功能:重置keygen,会影响生成的随机数序列3.测试代码示例最终文件如下:key.ckey.hmain.c例1检测生成的随机序列intmain(intargc,char*argv[]){inti;unsignedintlen;intj,r,key_num;unsignedintsync=0;unsignedcharkey[MAX_KEY_REQUEST];key_num=10;printf("\n------------使用默认keygen同步码=0生成密文-----------------\n");reset_keygen();memset(key,0,sizeof(key));len=request_key(sync,key_num,key);print_array("key0-9:",key,len);memset(key,0,sizeof(key));len=request_key(sync,key_num,key);print_array("Key10-19:",key,len);printf("\n-------------使用keygen=1234同步码=0生成密文------------\n");set_keygen(1234);memset(key,0,sizeof(key));len=request_key(sync,key_num,key);print_array("key0-9:",key,len);memset(key,0,sizeof(key));len=request_key(sync,key_num,key);print_array("Key10-19:",key,len);}执行结果:------------使用默认的keygen同步code=0生成密码文本---------------键0-9:----[10]a552c8145df7465b8942键10-19:----[10]38696fa608d26939cd29--------------使用keygen=1234同步码=0生成密文----------------key0-9:----[10]0e830b73ecf54b4a7435Key10-19:----[10]e7f10641c86baadf0c3d可以看到使用不同的keygen生成的随机序列是不一样的,如果设置不同的同步码,序列还是会不一样。示例2使用默认keygen加解密chardata0[10]={0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10,};intmain(intargc,char*argv[]){inti;unsignedintlen;intj,r,key_num;unsignedintsync=0;unsignedcharkey[MAX_KEY_REQUEST];charbuf[120]={0};key_num=10;printf("\n------------使用默认keygen开始加密--------------\n");reset_keygen();print_array("\nPlaintext:",data0,key_num);memset(key,0,sizeof(key));len=request_key(sync,key_num,key);print_array("key:",key,len);for(i=0;i\n",argv[0]);exit(EXIT_FAILURE);}sync=atoi(argv[1]);key_num=atoi(argv[2]);mykeygen=atoi(argv[3]);printf("\n----------------采用自定义keygen,同步代码开始加密------------\n");set_keygen(mykeygen);print_array("\nPlaintext:",data0,key_num);memset(key,0,sizeof(key));len=request_key(sync,key_num,key);print_array("key:",key,len);for(i=0;imain(){inti=0;for(i=0;i<10;i++){printf("%d",rand());}putchar('\n');}运行结果如下:peng@peng-virtual-machine:/mnt/hgfs/peng/rand/code$./a.out180428938384693088616816927771714636915195774779342423833571988538616497604925965166491189641421peng@peng-virtual-machine:/mnt/hgfs/peng/rand/code$./a.out180428938384693088616816927771714636915195774779342423833571988538616497604925965166491189641421要想每次都产生不一样的随机序列应该怎么办呢?需要借助srand()函数voidsrand(unsignedintseed);只需要通过该函数设置一个种子,那么产生的序列,就会完全不一样,通常我们Usethereturnvalueoftime()astheseed,herewewriteafewrandomdatatotestthefunction#includemain(){inti=0;srand(111);for(i=0;i<10;i++){printf("%d",rand());}putchar('\n');srand(1111);for(i=0;i<10;i++){printf("%d",rand());}putchar('\n');}执行结果如下:peng@peng-virtual-machine:/mnt/hgfs/peng/rand/code$./a.out1629905861708017477122501007114444113324837614211227311711663845131539134273188303981877918990613837119248824326741555165704133486349514746795546767966451547219795348682851892754119100411878可以看出输入不同的seed会生成不同的sequence函数原型如下:图片这个例子的原理比较简单,没有考虑太复杂的应用(比如多路key的管理)和数据安全,只做说明加解密过程,仅供学习理解加解密过程使用。这种加密算法属于对称加密,比较简单,也比较容易破解。目前市场上加解密功能都是由专业的公司和团队来实现的。本文转载自微信公众号“一口Linux”,可通过以下二维码关注。转载本文请联系易口Linux公众号。