Pseudo Random Number Generation Lab(伪随机数生成实验室)

Pseudo Random Number Generation Lab

http://www.cis.syr.edu/~wedu/seed/Labs_16.04/Crypto/Crypto_Random_Number/

Task1:

在使用当前时间初始化随机种子的情况下:
在这里插入图片描述

所产生的随机值随当前时间的变化而变化
在不使用当前时间初始化随机种子的情况下:
在这里插入图片描述

所产生的随机值不变化,始终为默认产生的随机值。

Task 2:Guessing the Key

因为必须在Linux下开始实验,且使用了aes-128-cbc进行加密的,所以我们先安装openssl,使用openssl的AES加密-CBC模式来加解密:
本题描述的背景是,在得到了一份文件,知道这份文件是用上述代码产生的秘钥通过aes 128 cbc模式加密的,并且知道文件加密的时间在2018-04-17 23:08:49左右,知道一部分明文和加密后的秘文以及cbc模式中需要的IV,需要我们求出加密的秘钥。
Plaintext: 255044462d312e350a25d0d4c5d80a34
Ciphertext: d06bf9d0dab8e8ef880660d2af65aa82
IV: 09080706050403020100A2B2C2D2E2F2
首先我们将Linux系统时间分别放到2018-04-17 21:00:00和2018-04-17 23:08:49,在这两个时间节点产生Time函数对应的值:
在这里插入图片描述
在这里插入图片描述

从1970-01-01 00:00:00到所改过时间一共经历了1524013228秒和1524020933秒。得到两个值后用for循环:
在这里插入图片描述

遍历这两个值中所有可能值对应的rand值(先用srand产生种子)使用这些rand值分别对已知明文块进行加密,结果和秘文比对,找出正确的秘钥,主要的main函数部分代码:

int main() {
    // case 1
    int i,m;
    long long j;
    uint8_t key[16];
    const uint8_t IV[16]={0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0xA2,0xB2,0xC2,0xD2,0xE2,0xF2};
    const uint8_t expectct[16]={0xd0,0x6b,0xf9,0xd0,0xda,0xb8,0xe8,0xef,0x88,0x06,0x60,0xd2,0xaf,0x65,0xaa,0x82};
    uint8_t pt[16]={0x25,0x50,0x44,0x46,0x2d,0x31,0x2e,0x35,0x0a,0x25,0xd0,0xd4,0xc5,0xd8,0x0a,0x34};
    uint8_t ct[16] = {0};     // 外部申请输出数据内存,用于加密后的数据
    uint8_t plain[16] = {0};  // 外部申请输出数据内存,用于解密后的数据
    for(i=0;i<16;i++)
    {
        pt[i]=pt[i]^IV[i];
    }
    for (j=1524013228;j<1524020933;j++)
        {
            m=0;
            srand (j);
    for (i = 0; i< 16; i++)
        {
            key[i] = rand()%256;
            printf("%.2x", (unsigned char)key[i]);
        }
        printf("\n");
    aesEncrypt(key, 16, pt, ct, 16); // 加密
    for(i=0;i<16;i++)
    {
        if(ct[i]==expectct[i])
            m++;
    }
    if(m==16)
    {
        printHex(key, 16, "key:");
        break;
    }
}
}

得到了秘钥key:95 FA 20 30 E7 3E D3 F8 DA 76 1B 4E B8 05 DF D7

Task 3: Measure the Entropy of Kernel

运行命令生成随机值:
在这里插入图片描述
在这里插入图片描述

在分别进行点击鼠标,移动鼠标,打开软件,新建文件夹等操作后,发现移动鼠标和打开软件时值变化幅度较大,且鼠标移动越快值增加越快(值一直处于增长中)

Task 4: Get Pseudo Random Numbers from /dev/random

按照pdf上的要求,首先我们运行$ cat /dev/random | hexdump命令发现首先产生一些16进制数,然后不定时的再产生一些:
在这里插入图片描述

接着我们使用Ctrl -C命令强制停止,再运行$ watch -n .1 cat /proc/sys/kernel/random/entropy_avail 命令得到结果:
在这里插入图片描述

观察得到当鼠标不动时随机数缓慢的增加,当鼠标移动时,随机数会先增加然后又马上减小,在120~190之间,随机数在这两个值之间迅速的波动。

Task 5: Get Random Numbers from /dev/urandom

首先我们运行$ cat /dev/urandom | hexdump 这个代码,发现和$ cat /dev/random | hexdump 一样是出现大量的16进制数,但是$ cat /dev/urandom | hexdump 会不间断的快速的产生,而不像$ cat /dev/random | hexdump产生一定量的16进制数后就缓慢的,间断的产生。
在这里插入图片描述

修改代码实现产生256位随机数秘钥:
修改的代码如下:

#include<stdio.h>
#include<stdlib.h>
#define LEN 32 // 256 bits
void main()
{
unsigned char *key = (unsigned char *) malloc(sizeof(unsigned char)*LEN);
FILE* random = fopen("/dev/urandom", "r");
fread(key, sizeof(unsigned char)*LEN, 1, random);
fclose(random);
int i;
for(i=0;i<32;i++)
{
printf("%.2x",(unsigned char)key[i]);
}
printf("\n");
}

运行结果:
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值