伪随机数发生器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

伪随机数发生器程序说明文档

——《密码编码学与网络安全》实验六一、基本变量、数据结构、函数说明:

注意:基本变量、数据结构、函数说明和实验二DES算法是一样的。没有任何变化。

1.基本变量定义部分:

flag:boolean型变量,用于标识是解密还是加密过程。

2.数据结构定义部分:

DT64:int型一维数组,64位的随机时间串。

V64: int型一维数组,64位的种子值。

sum64:int型一维数组,用于存储模二加的中间结果。

R64:int型一维数组,用于存储64位伪随机数。

bytekey:byte型一维数组,用于存储密钥及其子密钥字节流信息。

IP:int型一维数组,静态,用于存储初始置换矩阵。

IP_1:int型一维数组,静态,用于存储初始置换矩阵的逆矩阵。

PC_1:int型一维数组,静态,用于存储置换选择矩阵1。

PC_2:int型一维数组,静态,用于存储置换选择矩阵2。

E:int型一维数组,静态,用于存储扩充置换矩阵。

P:int型一维数组,静态,用于置换函数矩阵。

S_Box:int型三维数组,静态,用于SBox矩阵设置。

LeftMove:int型一维数组,静态,用于设置左移位置列表。

keydata:int型一维数组,用于存储二进制加密密钥。

encryptdata:int型一维数组,用于存储二进制加密数据。

EncryptCode:byte型一维数组,用于存储加密操作完成后的字节数组。

KeyArray:int型二维数组,用于存储密钥初试化后的二维数组。

3.基本函数定义:

UnitDes:初始化函数,用于将密钥初始化成字节型数组密钥。

KeyInitialize:用于初始化密钥,生成每一轮的子密钥。

Encrypt:每一轮的加密函数。

ReadDataToBirnaryIntArray:将数据转换为二进制数,存储到数组。

LeftBitMove:循环移位操作函数。

LoopF:落实到每一轮的具体操作函数。

GetEncryptResultOfByteArray:将存储64位二进制数据的数组中的数据转换为八个整数(byte)。

ByteDataFormat:字符串数组拼接函数。

DesEncrypt:具体的加、解密函数,由flag控制工作模式。

二、输入输出说明:

本程序是需要输入进行驱动的。具体输入项为四项:

a. 8位整数初始化种子值;

b. 希望产生的随机数个数;

c. 8位整数密钥K1。

d. 8位整数密钥K2。

通过将日期和种子作为X9.17伪随机数算法的输入,经过3DES算法,具体输出为:

a. 64位随机数0-1串;

b. 64位新种子0-1串。

三、算法简略流程说明:

(1).初始化置换函数:

for (i = 0; i < 64; i++) {

M[i] = timeData[IP[i] - 1]; // 明文IP变换

}

此语句将明文字节型数组矩阵进行了明文IP的置换。

(2).每一轮变换的详细过程:

每一轮的扩充,S盒代换,P置换,以及L、R的交换具体由每轮LoopF函数实现:

private void LoopF(int[] M, int times, int flag, int[][] keyarray) { int i;

int j;

int[] L0 = new int[32];

int[] R0 = new int[32];

int[] L1 = new int[32];

int[] R1 = new int[32];

int[] RE = new int[48];

int[][] S = new int[8][6];

int[] sBoxData = new int[8];

int[] sValue = new int[32];

int[] RP = new int[32];

for (i = 0; i < 32; i++) {

L0[i] = M[i]; // 明文左侧的初始化

R0[i] = M[i + 32]; // 明文右侧的初始化

}

for (i = 0; i < 48; i++) {

RE[i] = R0[E[i] - 1]; // 经过E变换扩充,由32位变为48位

RE[i] = RE[i] + keyarray[times][i]; // 与KeyArray[times][i]按位作不进位加法运算

if (RE[i] == 2) {

RE[i] = 0;

}

}

for (i = 0; i < 8; i++) { // 48位分成8组

for (j = 0; j < 6; j++) {

S[i][j] = RE[(i * 6) + j];

}

// 下面经过S盒,得到8个数

sBoxData[i] = S_Box[i][(S[i][0] << 1) + S[i][5]][(S[i][1] << 3)

+ (S[i][2] << 2) + (S[i][3] << 1) + S[i][4]];

// 8个数变换输出二进制

for (j = 0; j < 4; j++) {

sValue[((i * 4) + 3) - j] = sBoxData[i] % 2;

sBoxData[i] = sBoxData[i] / 2;

}

}

for (i = 0; i < 32; i++) {

RP[i] = sValue[P[i] - 1]; // 经过P变换

L1[i] = R0[i]; // 右边移到左边

R1[i] = L0[i] + RP[i];

if (R1[i] == 2) {

R1[i] = 0;

}

// 重新合成M,返回数组M

// 最后一次变换时,左右不进行互换。此处采用两次变换实现不变

if (((flag == 0) && (times == 0)) || ((flag == 1) && (times == 15))) { M[i] = R1[i];

M[i + 32] = L1[i];

} else {

M[i] = L1[i];

M[i + 32] = R1[i];

相关文档
最新文档