首页
社区
课程
招聘
[原创]新型随机函数的制作
2014-12-4 19:59 17050

[原创]新型随机函数的制作

2014-12-4 19:59
17050
  新型随机函数和以往的随机函数一样的地方是:使用时需要首先设置种子,每次调用得到一个数据,输出的是一些乱码。
  不同之处是这种随机函数输出的数据之间是没有关联的,你不能用连续几个输出值推算其计算公式,这是因为它生成方式所致,它没有公式你也推导不出来。
  以往的随机函数是由算式生成的,所以它的数据是由算法关联起来的,可能是线性关联甚至高维度的关联。
  新函数是采用构造法生成随机数的,现在基本数据是字节,别的结构可以用字节来组合,所以就单说以字节为单位的随机函数,它的元素是 0至 255共256个,构造法是这样运作的,例如要建造256×N长度的随机数组,所要材料是256×N个元素,一般需要元素分布均匀,所以每种元素取N个,将这些元素组成一个数组,初始状态如何都没关系,然后对这个数组进行随机排序,随机排序就是让数组内的元素位置随机的交换,一般可以用循环来完成,例如256×N的长度,用一个循环变量i,从头到尾的循环,另外随机的在256×N中选择一个位置,用这个位置的元素和第i个元素进行交换,这样循环一次每个元素都被交换了,交换完成后新的顺序建立了,生成了新的数组。从256×N中选择位置的操作可以用其它随机函数来完成,也可以拼凑一些随机性较强的变数来完成。一遍随机排序不理想可以进行多遍,一般借助于优秀的随机函数一遍就够了。这样子一下子就生成了一个长度为256×N的数组。如果借助于其它随机函数那么其需要的种子也就是此种生成方式的种子了,否则其中生成随机位置的参数等将作为种子。所有其它随机函数必须是专用的,否则将影响到结果的一致性而失控。
  新型随机函数数据的生成机制上面已经说了,为了照顾到应用习惯,模拟老式随机函数的使用方式。方法是你可以生成一定数量随机数据,函数每调用一次输出一个数据,用完后继续生成新的,这样函数就形成了。具体细节是每次生成的量不可过小,要大于元素总和数的数倍,为了均匀一般是整数倍,为什么呢?可以这样看,例如这个量是由256个不同元素组成,那将出现一个问题,我们的输出可能是每次不相同的元素,可能连续256次都有此特点,这显然是让数组有了某些规律性,所以生成量要更大些才能消除这个规律。
  新型随机函数的随机性比老式的要更好些,它是数据混合均匀后的输出,什么数据都是等概率的,也可能输出的是零值,一般随机函数没有此特性。
  现在的输出数据是无符号字节数组,很容易变成其它形式,例如做32位无符号整形数组,只要每次取四个无符号字节就可以组合。
  基本的新函数已经做出性能还是不错的,并且生成速度可达到每秒几十兆字节。
  新函数还没有名称随便征求一下。由于还没有见到类似的随机数生成方式,所以暂时可称其为“构造随机函数”或“乱排随机函数”。
  此种方法的理论基础是热力学第二定律——熵增加原理,当我们以多种方式影响数组的序列时,数组将向着更加混乱的方向发展而不可能相反。
  虽然此种方式可以完全不利用任何随机函数,但利用随机函数可以使工作效率增高。所以本方法也可以看成是随机函数的改良方式,主要益处是生成的数据之间没有连带关系,所以适合于做信息加密中的密钥数组。
  即便是最简单的随机函数例如C语言中的rand(),它的运算只是一乘一加,用此来制作乱排函数也能得到一个性能优良的输出,原来数据间的关联不见了,周期大大的提高了,原来周期只有16M,现在至少大于10G(没有深入测算)。
  如果是性能优良的随机函数其改造为乱排函数后,性能更加优良,直接用作密钥是能够胜任的,对于这样的无规律数据发生器破解者毫无办法。
  如何控制乱排函数,当然是用户密码,可以在原始数组阶段参与控制,也可以在随机排序部分参与控制是相当灵活的,多少字节的用户密码都可以被充分利用上。这是分组密码所没有的优势,后者只能使用有限的那几位所以相当虚弱。
  乱排函数还有一个特点就是没有一般随机函数可能出现的死点(即在特殊种子时,随机序列严重变坏),这也是构造法的特点,所有元素的出现都是等概率的零也不例外,这一点一般随机函数也做不到。
  即便到了量子计算机时代,如果密钥是独立未知数也照样不能破解,这是肯定的。这一点很容易证明。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (26)
雪    币: 8863
活跃值: (2374)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2014-12-4 20:49
2
0
这个世界不存在真的随机数~
雪    币: 5919
活跃值: (3725)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
yimingqpa 1 2014-12-4 21:06
3
0
  单纯的rand,random很不和谐,随机加复合运算就没XX.
雪    币: 6528
活跃值: (2644)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Kisesy 2014-12-4 21:10
4
0
用来干什么啊,需要这么厉害的随机
雪    币: 10813
活跃值: (2664)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
menglv 2014-12-4 21:10
5
0
感觉一个加入时间的随机种子和一个随机函数可能都比你要好,这个有意义吗?
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-12-4 21:52
6
0
存不存在真随机数没关系,需要的是之间没有关联的数组,至于干什么用可以直接当密钥使用。
伪随机数不能胜任的关键是数据间是有关联的,所以要出现漏洞。
雪    币: 149
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
olggun 2014-12-4 22:31
7
0
没有绝对随机数,但符合一定的标准就认为是真随机,产生的随机数据还是送检一下,检测一下是否真随机,,金融机构对这个还是有要求的,如果不是特别严谨的场合,随机数其实无所谓的事情
雪    币: 8863
活跃值: (2374)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2014-12-4 23:58
8
0
	std::random_device rd;
	std::mt19937 gen(rd());
	std::array<unsigned int, std::mt19937::state_size> seed_data;
	std::generate_n(seed_data.begin(), seed_data.size(), std::ref(gen));
	std::seed_seq seq(std::begin(seed_data), std::end(seed_data));
	auto engine = std::make_unique<std::mt19937>(seq);
	std::cout << *engine;

随手写了个输出标准mt随机数,敢问这随机就算有公式在能攻击到么?

一个随机算法是要靠大量的数据测试,大量的数学证明的~~mt19937能流行至今肯定是有原因的~
雪    币: 602
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kangcin 2014-12-5 08:12
9
0
老大,你还真较真了,看看LZ以前的文章吧,也就是能XXOO一下,真写东西,毛都不会。
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-12-5 09:49
10
0
To cvcvxk:
  确实即便是很简单的随机函数也是不好攻击的。
  乱排随机函数的意义主要是数组元素之间没有关联,这是现有随机函数做不到的。
  mt19937是不错啊,但也只能生成伪随机数组,如果利用它来做乱排随机函数就更加厉害了,将能为你做出海量的独立数据并且是可控的,比采自自然的真随机数组更好使用。
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rqqeq 2014-12-5 18:09
11
0
我觉得把……随机种子很重要……
比如某个东西……别人跟他的服务器时间同步了……然后……
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
AASSMM 2014-12-5 18:32
12
0
只要有足够大基数就够了,比如至少64bit ,甚至128bit  
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-12-5 20:13
13
0
  是啊随机种子很重要。
  用普通随机函数来制作乱排随机函数是很简单的事情,这是个化腐朽为神奇的过程。
  第一次使用,用普通随机函数F,选定种子让其生成长度为N的数组。(这是基本材料,只要N不是过小,都应是元素均匀分布的)
  第二次使用F,再次选定种子对上面长度为N的数组进行随机排序,建造最终的数组。
  如果用作密钥工作已经完成。要作乱排随机函数只剩下输出的问题了,就不多说了。
  可见乱排随机函数需要普通随机函数两次设置种子。
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-12-12 10:46
14
0
内容有所增加,欢迎继续批评。
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cnxxm 2014-12-12 12:28
15
0
你研究这个半年了吧
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-12-12 13:24
16
0
何止半年,只对信息加密感兴趣,就这个简单实用。
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-12-29 21:07
17
0
欢迎继续批评!
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2015-2-11 21:06
18
0
欢迎继续讨论。
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2015-6-16 14:21
19
0
  欢迎继续讨论这种随机数发生方式。它的特点是同时生成大量的随机数,并且随机数的质量不是以往的伪随机数(基于算式的随机函数的产物)能比拟的。
雪    币: 557
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
唐老鸭A 2015-8-12 21:37
20
0
感兴趣,希望lz能写个代码看看,正好可以测试
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2015-8-13 00:32
21
0
唐老鸭A你好,欢迎对生成的数据进行测试,请加我QQ323241088,便于联系。
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2016-1-23 13:02
22
0
补充一点,这种构造方式可能由于最初的材料过少,而限制了其随机性,当然这并不影响其作为独立变量的使用,但总是有些缺陷,比较理想的做法是,元素素材的数量达到或超过256乘256,这样生成的数组所有的组合都有可能出现了。
雪    币: 393
活跃值: (224)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
BinGzL 1 2016-1-23 15:42
23
0
用代码说话,空谈毫无疑义
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2016-1-23 21:03
24
0
代码请见
http://bbs.pediy.com/showthread.php?t=195901&highlight=%E4%B9%B1%E6%8E%92+%E6%8E%92%E9%9A%8F+%E9%9A%8F%E6%9C%BA+%E6%9C%BA%E5%87%BD+%E5%87%BD%E6%95%B0+%E6%95%B0%E6%BA%90+%E6%BA%90%E7%A0%81+%E7%A0%81%E4%B8%BE+%E4%B8%BE%E4%BE%8B
其中1024=256×4,将1024改为65536即可。
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dfhljf 2016-3-4 22:33
25
0
赞同一下
游客
登录 | 注册 方可回帖
返回