Pseudo Random Number Generation Lab
1 Overview
生成随机数是安全软件中相当常见的任务。在很多情况下,加密密钥不是由用户提供的,而是在软件内部生成的。它们的随机性非常重要;否则,攻击者可以预测加密密钥,从而达到加密的目的。许多开发人员知道如何生成随机数(例如蒙特卡洛模拟),根据以前的经验,所以他们使用类似的方法来生成随机数,以达到安全的目的。不幸的是,随机数序列对于蒙特卡洛模拟可能是好的,但也可能不适合加密密钥。开发人员需要知道如何生成安全的随机数,否则他们就会犯错误。类似的错误也出现在一些著名的产品中,包括Netscape和Kerberos。
在这个实验室里,学生们将了解为什么典型的随机数生成方法是不合适的用于生成秘密,例如加密密钥。他们将进一步学习生成pseudo的标准方法用于安全目的的随机数。本实验所涵盖的主题如下:
生成伪随机数;
随机数生成错误;
生成加密密钥;
/dev/random和/dev/urandom设备文件。
1.1 Lab Environment
这个实验室已经在我们预构建的Ubuntu 16.04 VM上进行了测试,可以下载来自种子网站。
2 Lab Tasks
在实验开始之前,先将时间设置为纽约时间,因为设计实验的杜老师所在地区为纽约
2.1 Task 1: Generate Encryption Key in a Wrong Way
用错误方法生成加密密钥。为了生成好的伪随机数,我们需要从随机开始;否则,结果是可以预见的。下面的程序使用当前时间作为pseudo的种子随机数生成器。
库函数time()返回时间,作为纪元(1970-01-01 00:00:00+ 0000 (UTC))以来的秒数。运行所给的代码并描述您的观察结果。然后,注释掉行srand (time(NULL));
,再次运行这个程序,描述你的观察。利用两种情况下的观察结果解释代码中srand()和time()函数的用途。
编写代码如下
//task1.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define KEYSIZE 16
void main()
{
int i;
char key[KEYSIZE];
printf("%lld\n", (long long) time(NULL));
// srand (time(NULL));
for (i = 0; i< KEYSIZE; i++){
key[i] = rand()%256;
printf("%.2x", (unsigned char)key[i]);
}