软件安全实验报告
一、实验目的
生成随机数是安全软件中非常常见的任务。许多开发人员从他们以前的经验中知道如何生成随机数(例如用于蒙特卡洛模拟),因此出于安全目的,他们使用类似的方法生成随机数。不幸的是,随机数序列对于蒙特卡洛模拟可能是好的,但对于加密密钥则可能是不好的。开发人员需要知道如何生成安全的随机数,否则会出错。在一些著名的产品(包括Netscape和Kerberos)中也犯了类似的错误。
在本实验中,学生将学习为什么典型的随机数生成方法不适用于生成秘密(例如加密密钥)。他们将进一步学习生成用于安全目的的伪随机数的标准方法。
二、实验步骤与结果
1、Task1:Generate Encryption Key in a Wrong Way
在此任务中编译运行如下程序:
1 |
|
观察运行结果:
发现每一次运行结果都不一样,因为传入的随机数种子每一次都不一样。
之后注释掉上述代码第十行,运行结果:
每一次key都是一样的,尽管每一次运行结果程序内部数据很随机。
那么srand()函数的作用就是:将传入的参数作为随机数生成的种子,如果没有参数传入,那么种子就是一个固定值。
time()函数在此程序的作用就是:返回一个随机数作为种子,这个随机数每一次调用都不可能相等,因为时间一直向前走。
2、Task2:Guessing the Key
猜测密钥:
首先确定随机数生成种子的取值范围:
因为打算使用python来破解密钥,所以需要先将密钥输入到一个文件里面,代码为:
1 |
|
得到txt文件:
之后使用python的crypto库实现破解密钥,代码为:
1 | from Crypto.Cipher import AES |
运行结果为:
破解成功。
3、Task3:Measure the Entropy of Kernel
测量kernel的熵。运行命令如下:
1 | watch -n .1 cat /proc/sys/kernel/random/entropy_avail |
因为该值记录在/proc/sys/kernel/random/entropy_avail文件中,需要定时打印文件中的内容。
测试发现,如果什么操作都没有,那这个值不会变化,但是一旦有移动鼠标,点击鼠标,或者敲击键盘等行为,该值就会不断增大。
4、Task4:Get Pseudo Random Numbers from /dev/random
从/dev/random中获取伪随机数。
运行如下命令,观察现象:
1 | cat /dev/random | hexdump |
即打印该文件中的值
发现如果没有什么操作的话,数据是不会生成的,只有有操作才会打印数据,并且操作越频繁,打印数据越快。
问题:如果一直不断的向服务器发送请求,那么导致系统可用熵用尽,从而随机数生成器不能正常使用,导致拒绝服务产生。
5、Task5:Get Random Numbers from /dev/urandom
使用和上一问同样的命令:
1 | cat /dev/urandom | hexdump |
发现数据一直不停的生成,不管用户有无操作。
之后测量随机数的质量:
先生成1MB的二进制随机数文件,之后,在该文件上运行ent,命令如下:
1 | head -c 1M /dev/urandom > output.bin |
由上图可以看出:
熵值为7.999819比特每字节
最好的压缩之后,该文件损失率为0%等等
说明该随机序列随机性很好。
根据下面的代码:
1 |
|
写出生成256bits的密钥生成代码,并将结果打在公屏上,代码如下:
1 |
|
- 本文作者: 李小混
- 本文链接: https://lixiaohun.github.io/post/2.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!