目录
实验要求
从散列锁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。
步骤:
- 阅读器生成随机数R,并传递给电子标签。
- 电子标签计算并传给阅读器H(ID)、 Hl(ID||R);阅读器将H(ID)和Hl(id||r)与R传递给数据库。
- 数据库计首先检索H(ID),若标签存在,则验证通过,算得Hr(ID||R)。后端数据库进行更新,测试经过ID=ID^R和ID mod 20后该地址是否已存在数据,若存在,则重新产生一个随机数S,重复上述过程直至更新后所需地址不冲突,若不存在,则令S=R。更新数据库ID=ID^S与哈希表。将S与Hr(id||r)->阅读器->电子标签。
- 电子标签首先验证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如何退回。如果不退回,则会造成标签的误改,给系统留下巨大的安全隐患,希望各位能给给意见。
债见!