2013-07-03 133 views
3

我目前使用Crypto.Random和Crypto.Random.DRBG Haskell库来生成随机数。但是,我发现自己需要以某种形式的文件(例如.txt文件)存储它们的状态,因为我想在稍后的某个时间点继续使用同一个生成器(这是因为我需要两个独立的程序来生成相同的生成器随机数字以相同的顺序)。 上面提到的库不是Show函数的实例。有谁知道我可以如何存储所提到的发生器的状态?在haskell中保存随机数生成器的状态

+3

为什么你使用加密强度PRNG,如果你想坚持和重放状态?只需使用StdGen。 –

+0

因为我正在编写密码协议并需要DRBG的属性。并不是我需要重播状态。正如我所说的,我需要两个(不同的)程序来生成相同的数字(不同时间点),而无需转移它们。 –

+0

查看[sources](http://hackage.haskell.org/packages/archive/DRBG/0.5/doc/html/src/Crypto-Random-DRBG-HMAC.html#State),似乎它会是容易添加持久性(例如通过实现'Serialize')到'State'。我看到的一个问题是哈希算法,它被表示为一个函数,因此它不能被序列化。但是这些信息可能由用户在反序列化过程中提供。 –

回答

5

您可以使用git版本的DRBG执行CtrDRBG的序列化(因为commit 9da47c4dabf9f6976edcbf938c4a1a4b95e09b0c)。编辑:这是现在在hackage。安装:

cabal update 
cabal install DRBG 

现在你应该可以使用上CtrDRBGData.Serializeencodedecode功能。

编辑:我觉得我应该提及,像所有NIST SP 800-90发电机,DRBG可能不会给你可能期望的属性。确实,生成器是确定性的,但是您的请求会扰乱状态,因此两次生成N个字节不会产生与生成2 * N个字节的单个请求相同的字节。这是由于发电机的回溯电阻。总是产生一致大小的请求并在封面下执行级联的缓冲策略可以隐藏这种行为。