文章导航
大三下网络与信息安全选修课实验报告
女巫攻击论文
实验一 使用SybilGuard算法实现社交网络中Sybil节点的检测
一、实验目的
学会使用Python平台搭建基本的社交网络模型。
能够利用已有的社交网络数据集生成具有类似拓扑的新网络。
可以生成一个随机的Sybil攻击,把Sybil节点添加进网络中。
能够编写正确的Sybil Guard算法,检测出添加的Sybil节点。
二、实验设备与平台
笔记本电脑一台;Python3.7环境;必需的Python函数包;Spyder IDE;来自http://networkrepository.com的社交网络数据集。
三、实验内容与要求
利用Python导入网上找到的社交网络数据集,将其转化为邻接矩阵。
按照该社交网络模型生成节点数、网络拓扑相类似的另一个网络(避免偶然性,防止程序仅对特定网络有效)。
在现有网络的基础上生成一个随机的Sybil攻击,即:Sybil节点数随机、攻击位置随机、攻击边数随机(小于最大限度)。
编写实现Sybil Guard算法,检测出网络中的Sybil节点,返回检测准确性的矩阵,用于衡量算法是否有用。
四、实验步骤
1. 利用Python导入网上找到的社交网络数据集,将其转化为邻接矩阵。
(1)导入数据集
此处我使用的是Network Repository网站上面的开源网络数据集,选择了其中网络节点数比较少的网络:Caltech36,它是一个基于Facebook真实数据产生的769个节点,16.7K条边的社交网络图。下载下来是mtx格式,所以我使用scipy.io中的mmread函数将其导入,并且使用todense方法将稀疏矩阵转化为邻接矩阵形式。
其中遇到一点点小问题,导入时报错:文件不是以MatrixMarket matrix格式存储的,导入失败,后来我用UltraEdit软件打开才发现,本来MatrixMarket matrix格式第一行应该有两个“%”才能被识别,但是数据集只有一个“%”,将其更改完毕即可成功导入。下面几行就是网络规模、边数和邻接关系。
将数据集导入后打开矩阵F可以看到邻接矩阵的形式:
数据集Caltech36的网络拓扑结构如下:
(2)绘制各个度数节点数量的统计图:
这一步是比较重要的,它描述了网络的大致拓扑结构,为接下来检验重构网络是否与原网络结构相似提供了依据。
其中包含一些子函数的定义:
friends (A):返回每个人的朋友列表组成的矩阵,前k项为朋友序号,k为节点度数,其余值为-1.
degre (A,i):返回社交图节点的度数:它仅包含计算每个人的朋友数
degremoyen(A):网络的平均节点度数
tablederoutage (A,B):计算每个节点列表的排列
tableroutage2 (A,B,C, node):将每个节点与其排列相关联
search(B,row,friend):搜索朋友
next2(B, RT, friend):在具体步骤中通过这些排列获得的每个节点的图像
statistique (A):返回向量v,第i项为第i个节点的度数
这一步比较费时间,定义了一个print功能可以实时显示进度:
使用以下代码即可画出网络各个度数节点数量的统计折线图:
最终画出的统计图如下:
可以看出,度数小的节点数量比较多,度数大的相对较少。
2. 按照该社交网络模型生成节点数、网络拓扑相类似的另一个网络。
(1)生成新网络
somme (f,n):节点度数累加起来,后一项是前面的求和
f(i):估计出的原始图形节点度数分布函数
构建v矩阵:
prob(v):根据与函数f相关的概率分布,计算随机节点的度数
matricerandom2(A,v):
构建类似于原矩阵的邻接矩阵(相同大小,相似的“给定度数的节点数”轮廓)
生成对应矩阵C并且画出新网络的节点分布:
它与原网络分布形状类似,可以应用于实际操作。
原网络节点分布图:
3. 在现有网络的基础上生成一个随机的Sybil攻击。
k(v):指数概率分布的生成d服从均匀分布,s为指数分布,v为指数分布的参数
generation( n,f):随机确定哪些节点将链接这两个网络:
ajoute(A):使用刚刚定义的攻击边缘将两个社交网络连接起来。
生成攻击过后的网络D:
4. 编写实现Sybil Guard算法,检测出网络中的Sybil节点,返回检测准确性的矩阵
(1)网络Caltech36
witness(A,B,RT,node,w):生成随机路线
comp (A,B,RT,V,S,W):两条随机路线的比较-研究他们的交点
listpour (A,v,s,m):返回两个节点的路线之间交叉点数目不同的列表
estimation (A,v,s,m):使用listpour并返回经验期望:
检测Sybil节点,返回检测准确度矩阵J:
J00,诚实检测为诚实;J01,诚实检测为sybil;
J10,sybil检测为诚实;J11,sybil检测为sybil
最后运行几次,更改初始诚实节点的值,比较检测效果。
经过实验,阈值x选在140左右检测效果最好。
检测结果:
1.诚实节点标号s=300,阈值x=140,随机生成14个:
2.诚实节点标号s=150,阈值x=140,随机生成14个:
3.诚实节点标号s=200,阈值x=140,随机生成3个:
4.诚实节点标号s=200,阈值x=140,随机生成4个:
5.诚实节点标号s=350,阈值x=140,随机生成12个:
(2)新网络Reed98
仅用一个数据集不足以证明检测算法的鲁棒性,我在同一个网站上下载了另一个规模相近的网络数据集Reed98进行测试,其网络拓扑图如下,其中节点数为962,边数为18.8k,规模比上一个网络大了一些,计算时间也相应长了一些。
检测结果:
1.诚实节点标号s=600,阈值x=140,随机生成6个:
2.诚实节点标号s=921,阈值x=140,随机生成5个:
3.诚实节点标号s=66,阈值x=140,随机生成3个:
4.诚实节点标号s=168,阈值x=140,随机生成12个:
五、实验结论与体会
自己利用Python平台复现了论文中检测Sybil攻击的Sybil Guard算法,在检测结果上取得了不错的成绩,针对第一个网络,仅仅在Sybil节点数为14的时候发生了误判,将诚实节点检测为了Sybil节点。而总体上来说,当Sybil节点相较于网络规模来说不多时,Sybil节点的检测精确度还是很高的。而对于本次实验来说,费时间的不是生成Sybil节点,也不是检测算法,而是进行节点统计的函数,迫不得已只能使用print来显示进度。
这次实验给我最大的收获就是编程能力的提高,还有就是分析解决问题的能力,在网上寻找相关代码时只有一个不完整的工程,其中的代码是用Python2编写的,许多语句不匹配,而且缺乏相关数据集,在搜索大量网页以后终于找到了一个可用的开源数据集,这样让我明白,我们信息类专业,数据对我们来说是至关重要的,正所谓“工欲善其事必先利其器”,只有拥有了专业靠谱的数据,我们的工作才能继续开展。而获得的数据必须进行一定的处理才能为我们所用,就像我刚开头提到的“%”的问题,可能是因为调用的接口不同,导致了原数据与我们的需要不匹配,这就需要我们进行进一步的处理。
PS:下面这个是当时做区块链报告时为了解比特币挖矿机制而进行的一个简单的小测试,放到后边做一个附注吧。
实验二 基于MATLAB模拟比特币挖矿的实验
一、 实验目的
通过实验了解区块链的基本原理和基本结构,体会“挖矿”的概念
二、 实验设备与平台
笔记本电脑一台、MATLAB r2018b、网上下载的SHA256计算代码DataHash.m
三、 实验内容与要求
利用软件模拟挖矿、记录交易的过程,体会区块链的基本思想
四、 实验步骤
1.定义区块的数据结构
2.定义区块链的数据结构
3.定义挖矿的函数
4.执行挖矿的过程
执行的结果:(只展示初始化和第三个block挖完的结果)
初始化:
第三个块:
可以看出执行到第1377次遍历时才得到前三位都为0的哈希值。
5.修改挖矿难度再次实验
难度为1(第一位为0)
难度为2(前两位为0)
难度为3(前三位为0)
难度为4(前四位为0)
挖矿时间随难度的变化
五、实验结论与体会
利用MATLAB进行了简单的挖矿模拟实验,可以看出,随着挖矿难度的增加,挖矿时间呈现指数增长,而寻找合适的随机数使得哈希值满足要求就只能使用遍历。在挖矿设备越来越多时,要保证恒定的打包率,就只能增大难度,而每增加一位难度,挖矿时间都将以指数形式增长。比特币带来的到底是巨大的金融利益,还是电能的巨大耗费,这一点值得我们思考。