1
简易密码方案算法实现参考
一、随机全排列生成程序
(一) 目的
该部分内容是后面密码方案实现的基础,该程序主要是为了产生¡ 全排列的随机数¡。通过本部
分内容使学生掌握一种以上产生今后在密码学中经常用到的随机全排列(可用作产生¡ 代替表¡ 或
¡ 置换表¡)的方法。
(二)内容
编制生成 0~n(n≤255)的一个全排列的程序,可选择下列两个方法之一或自行设计另外方法:
方法 1:从一个随机文件读取 n+1 字节数据 d
0
,d
1
,¡ ,d
n
。由预先取定的一个 0~n 的全排列 P(比如,
可为 0~n 的自然排列)开始,依次对 i=n,n-1,¡ ,1,计算:j=d
i-1
+d
i
(mod i)交换 P 的第 i 项第 j 项(在
此注意我们假定 P 从第 0 项开始)。
方法 2:用一个随机函数产生 m(m>n)字节数据 d
1
,d
2
,¡ ,d
m
。对
d
1
(mod(n+1)),d
2
(mod(n+1)),¡ ,d
m
(mod(n+1))依次考察,把后面出现的与前相同者去掉;在最后剩下的
数据中,把没有出现的 0~n 依序补写于后面。
(三)原理(提示)
关于¡ 随机全排列生成程序¡ 应用的设计
¡ 一个 0~n 随机全排列¡ 中的随机性是指:某种相应的生成方法可以做到¡ 让 0~n 中任意数等可
能地出现在任一位置¡。生活中应用¡ 一个 0~n 随机全排列¡ 的例子随处可见,比如¡ 编排考试等一
个场所中的随机座位号¡,¡ 模拟抽取某种福利或体育彩票中的一组中奖号码¡,¡ 模拟分发固定人数
参与游戏的一付扑克牌¡ 等等。
(四)主要参考程序
//方法 1:
unsigned char*full_array1(int n)
{
int i,j;
char filename[20];
FILE*fp;
static unsigned char d[256],P[256],temp;
start:
printf("\n 请输入随机数据采样文件名:");
scanf("%s",filename);//¡ gets(filename);¡ 似乎与之效果一样,但有时会有问题
Created with novaPDF Printer (www.novaPDF.com). Please register to remove this message.