RFID标签的安全机制——LCAP协议的C++代码实现

RFID标签的安全机制——LCAP协议的C++代码实现,第1张

目录

实验要求

方案步骤与改进

代码分析

 结果展示


实验要求

从散列锁Hash-lock协议、随机Hash锁协议、供应链RFID协议、LCAP协议中选取一种方案,实现RFID的安全机制。

上课时老师提了一嘴要求哈希函数查找、存储与防冲突,我分析了四种实现方案,发现LCAP协议是最有可能实现防冲突的,所以我选取了LCAP协议。同时,我也对此协议进行了一定的改进。

方案步骤与改进

前提:模拟数据库的存储与标签。

数据库中以哈希表存储电子标签id与其哈希值,哈希值初始为-1,如果是其他值则代表其对应了电子标签id。电子标签id的哈希值计算方法为id mod 20。Eg:24568 mod 20=8,故H[8]=24568。

需要注意的是,默认初始id的哈希值是不冲突的。

模拟四个标签,从tagID[1]至tagID[4]里面存放的是四个标签的id。

          步骤:

  1. 阅读器生成随机数R,并传递给电子标签。
  2. 电子标签计算并传给阅读器H(ID)、 Hl(ID||R);阅读器将H(ID)和Hl(id||r)与R传递给数据库。
  3. 数据库计首先检索H(ID),若标签存在,则验证通过,算得Hr(ID||R)后端数据库进行更新,测试经过ID=ID^R和ID mod 20后该地址是否已存在数据,若存在,则重新产生一个随机数S,重复上述过程直至更新后所需地址不冲突,若不存在,则令S=R。更新数据库ID=ID^S与哈希表。将S与Hr(id||r)->阅读器->电子标签。
  4. 电子标签首先验证Hr(ID||R)是否正确,若验证通过,则更新ID=ID^S
代码分析

下面我按照步骤里的顺序一步步的分析代码。

1.生成随机数R

这一步就很easy了,我取得随机数范围为[10,100),当然也可以根据不同情况取其他值。

int Query(){
	srand((int)time(0));
	int R = rand()%(90)+10;
	cout << "1.阅读器生成随机数R:" << R << endl;
	return R;
}

2.电子标签计算并传给阅读器H(ID)、 Hl(ID||R)。

这里需要,写hash函数,我使用的hash也比较简单,直接用的是取模hhhhh,大佬们可以替换更加复杂的hash函数。

Hl(ID||R)取ID||R的哈希值的左半部分,因此做了一些处理,例如12345取得应为123,相应的右半部分为45;1234取得应为12,应的右半部分为34。

int hash_mod(int id){
	return (id % 20);
}
int hash_l(int id,int r){
	string a = to_string(id);
	string b = to_string(r);
	a = a+b;
	int idr = stoi(a);
	idr = idr % 12345;
	a = to_string(idr);
	int len = a.size();
	string c;
	for(int i=0;i<(len+1)/2;i++){
		c[i] = a[i];
	}
	int hidr = stoi(c);
	return hidr;
}

3.

(1)数据库计首先检索H(ID),若标签存在,则验证通过,算得Hr(ID||R)

H(ID)调用上述函数;Hr(ID||R)与Hl类似,只需要在for循环稍作改进,for(int i=(len+1)/2;i=len;i++)

(2)数据库的id更新。

这一点就是比较头疼的了,首先我们不能使用常规的放冲突方法,比如线性探测法、平方探测法等,如果用上述方法仅仅是使id在数据库中修改,给他在哈希表中找了一个位置而已,下次标签的id计算hash值的时候他又不知道你这些方法加的什么值(好气哦)!!!!因此我自作主张加了一个s变量。(虽然现实生活中可能不行,毕竟人家协议既然有,就说明有更好的解决办法,但是我没有更好的解决办法了..............)废话不多说,先上防冲突代码:

int find(int h[],int temp,int r){
	int num,s;
	h[temp] = h[temp]^r;
	num = h[temp]%20;
	while(num!=temp && h[num]!=-1){
		h[temp] = h[temp]^r;
		srand((int)time(0));
		s = rand()%(90)+10;
		h[temp] = h[temp]^s;
		num = h[temp]%20;
		r = s;
	};
	if(num == temp){
		return r;
	}else{
		h[num] = h[temp];	
		h[temp] = -1;
	}
	return r;
}

 主要想法是,如果这个坑被占了,我们就换一个,让每个坑怎么换只有一个值对应。

R不行我们就换个random number,这个不行我们再换一个,一直到他行为止。(好强盗hhh)

最后把确定换的值输出,即为S。

4.电子标签首先验证Hr(ID||R)是否正确,若验证通过,则更新ID=ID^S

这没啥说的了

最后附一个main函数:

 结果展示

在我完成本实验后,发现了一个问题,就是若电子标签验证不通过,阅读器哈希表存的id如何退回。如果不退回,则会造成标签的误改,给系统留下巨大的安全隐患,希望各位能给给意见。

 债见!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/796063.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存