漏洞分析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]);
   }
   
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值