-
-
[原创]乱排随机函数源码举例
-
2014-12-24 15:39
4153
-
在“新型随机函数”帖中介绍了乱排随机函数。
乱排随机函数是一种新型随机函数,它的最大特点是生成的数组之间没有关联,这是以往随机函数所欠缺的。但它仍然是可以用种子来控制的随机函数,如果将种子销毁其输出结果可以媲美真随机数组,作为信息加密密钥是可以胜任的。
下面给出一个“乱排随机函数”的实例。其中用到的随机函数是C语言中那个简单的rand()。用性能更好的随机函数取代rand()你可以做出更厉害的“乱排随机函数”。
//乱排随机函数声明及变量
unsigned char SJHS(void); //乱排随机函数
void SJHS_CSH(unsigned int x); //乱排随机函数的初始化函数(种子设置函数)
//随机函数专用变量
unsigned char A_[1024+1]={0};
int B_1=-1; //输出指针
//所用到的随机函数randa()的声明变量及函数实体
#define MUL 0x015a4e35L
#define INC 1
static long Seed=1;
void sranda(long seed);
unsigned int randa(void);
void sranda(long seed)
{
Seed=seed;
}
unsigned int randa(void)
{
Seed=MUL*Seed+INC;
return((unsigned int)(Seed>>24));
}
//乱排随机函数的初始化函数实体
void SJHS_CSH(unsigned int x)
{
int n1=101,i;
unsigned char ch;
for(i=0;i<1024;i++) //随机排序
{A_[i]=i%256;} //赋初值
sranda(x); //设置用到的随机函数种子
for(i=0;i<1024;i++) //随机排序
{
n1=(n1 + A_[n1] + i + A_[i] + randa())%1024;
ch=A_[i];
A_[i]=A_[n1];
A_[n1]=ch;
}
}
//乱排随机函数实体
unsigned char SJHS(void)
{
int i;
int n1=127;
unsigned char ch;
if(B_1==0)
{
for(i=0;i<1024;i++) //随机排序 更新数组
{
n1=(n1 + A_[n1] + i + A_[i])%1024;
// n1=(i + randa())%1024; //randa()参与
ch=A_[i];
A_[i]=A_[n1];
A_[n1]=ch;
}
B_1=1023; //改变指针
}
else
{
B_1--;
}
return A_[B_1];
}
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法