本文, 带着大家自己实现一个简单但也很实用的加密方法,
让大家了解实际项目开发中数据加密的流程。
关于加密的算法很多,实际实现过程千差万别,
下图是一个常见的网络通信加密的应用场景。
密码机的一些说明:
下面以客户端如果要发送一段加密的密文给服务器,C/S需要交互的流程。
因为服务器和客户端此时都使用了相同的keygen,和同步码,所以双方申请的密钥序列一定是一样的。
下面是一口君实现的加密算法的一些函数原型以及功能说明,这些函数基本实现了第一节的功能。
int request_key(int sync,int key_num,char key[])
功能:
向密码机申请一定数量的用于加密数据的密钥,如果不设置新的keygen,那么生成的密码会顺序产生下去,每次申请密钥都会记录上次生成的密钥的偏移,下次在申请的时候,都会从上一位置继续分配密钥
参数:
sync:同步码,密码机依据此同步产生随机序列的密钥
key_num:申请的密钥个数
key:申请的密钥存储的缓存
返回值:
实际返回密钥个数
void set_keygen(int key)
功能:
向密码机设置keygen,设置后会影响产生的随机密钥序列
参数:
key:密钥
返回值:
无
int born_seed(int sync,int key)
功能:
根据同步码和keygen生成随机密钥种子
参数:
sync:同步码
key:密钥
返回值:
种子
void reset_keygen()
功能:
重置keygen,会影响生成的随机数序列
最终文件如下:
key.c key.h main.c
int main(int argc, char *argv[])
{
int i;
unsigned int len;
int j, r, key_num;
unsigned int sync = 0;
unsigned char key[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("密钥0-9:",key,len);
memset(key,0,sizeof(key));
len = request_key(sync,key_num,key);
print_array("密钥10-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("密钥0-9:",key,len);
memset(key,0,sizeof(key));
len = request_key(sync,key_num,key);
print_array("密钥10-19:",key,len);
}
执行结果:
--------------采用默认keygen 同步码=0 产生密文----------------
密钥0-9: ----[10]
a5 52 c8 14 5d f7 46 5b 89 42
密钥10-19: ----[10]
38 69 6f a6 08 d2 69 39 cd 29
--------------采用keygen=1234 同步码=0 产生密文----------------
密钥0-9: ----[10]
0e 83 0b 73 ec f5 4b 4a 74 35
密钥10-19: ----[10]
e7 f1 06 41 c8 6b aa df 0c 3d
可以看到采用不同的keygen产生的随机序列是不一样的。
如果设置不同的同步码,仍然序列还会不一样。
char data0[10]={
0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10,
};
int main(int argc, char *argv[])
{
int i;
unsigned int len;
int j, r, key_num;
unsigned int sync = 0;
unsigned char key[MAX_KEY_REQUEST];
char buf[120]={0};
key_num = 10;
printf("\n--------------采用默认keygen开始加密----------------\n");
reset_keygen();
print_array("\n明文:",data0,key_num);
memset(key,0,sizeof(key));
len = request_key(sync,key_num,key);
print_array("密钥:",key,len);
for(i=0;i<len;i++)
{
buf[i] = data0[i]^key[i];
}
print_array("\n密文:",buf,len);
printf("\n--------------------开始解密--------------------\n");
reset_keygen();
memset(key,0,sizeof(key));
len = request_key(sync,key_num,key);
for(i=0;i<len;i++)
{
buf[i] = buf[i]^key[i];
}
print_array("\n明文:",buf,len);
}
测试结果
--------------采用默认keygen开始加密----------------
明文: ----[10]
01 02 03 04 05 06 07 08 09 10
密钥: ----[10]
a5 52 c8 14 5d f7 46 5b 89 42
密文: ----[10]
a4 50 cb 10 58 f1 41 53 80 52
--------------------开始解密--------------------
明文: ----[10]
01 02 03 04 05 06 07 08 09 10
int main(int argc, char *argv[])
{
int i;
unsigned int len;
int j, r, key_num;
unsigned int sync = 0;
unsigned char key[MAX_KEY_REQUEST];
char buf[120]={0};
unsigned int mykeygen;
if (argc != 4) {
fprintf(stderr, "Usage: %s <seed> <key num> <keygen>\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("\n明文:",data0,key_num);
memset(key,0,sizeof(key));
len = request_key(sync,key_num,key);
print_array("密钥:",key,len);
for(i=0;i<len;i++)
{
buf[i] = data0[i]^key[i];
}
print_array("\n密文:",buf,len);
printf("\n--------------------开始解密--------------------\n");
set_keygen(mykeygen);
memset(key,0,sizeof(key));
len = request_key(sync,key_num,key);
for(i=0;i<len;i++)
{
buf[i] = buf[i]^key[i];
}
print_array("\n明文:",buf,len);
exit(EXIT_SUCCESS);
}
执行结果如下:
--------------采用自定义的keygen、同步码开始加密----------------
明文: ----[10]
01 02 03 04 05 06 07 08 09 10
密钥: ----[10]
53 00 29 cd 27 eb cc 80 1a d7
密文: ----[10]
52 02 2a c9 22 ed cb 88 13 c7
--------------------开始解密--------------------
明文: ----[10]
01 02 03 04 05 06 07 08 09 10
可见我们的确实现了数据的加密和解密。
假定我们使用上述实例代码,把对应的功能移植到C/S两端,
那么一次完整的数据加密以及数据的传输参考流程如下:
记住一点,只要双方设置相同的keygen和同步码,那么密码机吐出来的密钥就是相同序列,
客户端发送每发送一个报文,就把自己的明文同步码一起发送给服务器,
服务器根据提前发送给客户端的keygen和同步码就可以实现解密操作,
虽然你可以看到明文的同步码,
但是还需要破解密码机算法、服务器下发的keygen密文。
实现加密算法的主要问题是如何产生随机序列作为密钥。
本例是借用库函数rand() 原型如下:
#include <stdlib.h>
int rand(void);
函数rand() 虽然可以产生随机序列,但是每次产生的序列其实顺序是一样的。
#include <stdio.h>
main()
{
int i = 0;
for(i=0;i<10;i++)
{
printf("%d ",rand());
}
putchar('\n');
}
运行结果如下:
peng@peng-virtual-machine:/mnt/hgfs/peng/rand/code$ ./a.out
1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421
peng@peng-virtual-machine:/mnt/hgfs/peng/rand/code$ ./a.out
1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421
要想每次都产生不一样的随机序列应该怎么办呢?需要借助srand()函数
void srand(unsigned int seed);
只需要通过该函数设置一个种子,那么产生的序列,就会完全不一样,
通常我们用time()返回值作为种子,
在此我们随便写入几个数据,来测试下该函数
#include <stdio.h>
main()
{
int i = 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.out
1629905861 708017477 1225010071 14444113 324837614 2112273117 1166384513 1539134273 1883039818 779189906
1383711924 882432674 1555165704 1334863495 1474679554 676796645 154721979 534868285 1892754119 100411878
可见输入不同的种子就会产生不同的序列。
函数原型如下:
本例原理比较简单,没有考虑太复杂的应用(比如多路密钥的管理)和数据安全性,
只阐述加解密的流程,仅作为学习理解加解密流程用,此种加密算法属于对称加密,相对比较简单,还是比较容易破解。
目前市场上都是由专业的公司和团队实现加解密功能。
本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/vHQW_jcPcsPhvGoPrYMNzQ
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。