Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在haskell中正确生成随机bytestring_Haskell_Random_Cryptography - Fatal编程技术网

如何在haskell中正确生成随机bytestring

如何在haskell中正确生成随机bytestring,haskell,random,cryptography,Haskell,Random,Cryptography,我是haskell的新手,想编写一个函数来生成随机字节字符串。 从我的角度来看,From似乎是最好的模块,但我想不出来 我想做如下工作: let size = 2048 let bytestring = randomByteString size 您需要在IOmonad中执行此操作,以初始化生成器的熵。对于一个简单的示例,类似于此片段的内容就可以了,不过在更复杂的代码中,您可能应该保留生成器g2,以后再使用它 do g <- newGenIO :: IO SystemRandom

我是haskell的新手,想编写一个函数来生成随机字节字符串。 从我的角度来看,From似乎是最好的模块,但我想不出来

我想做如下工作:

let size = 2048
let bytestring = randomByteString size

您需要在
IO
monad中执行此操作,以初始化生成器的熵。对于一个简单的示例,类似于此片段的内容就可以了,不过在更复杂的代码中,您可能应该保留生成器
g2
,以后再使用它

do
    g <- newGenIO :: IO SystemRandom
    case genBytes size of
        Left err -> error $ show err
        Right (result, g2) -> return result
do
g错误$show err
右(结果,g2)->返回结果

这里有很多部分,所以我将在下面描述这些部分是如何工作的。。。。但现在,这里是代码

import Data.ByteString
import Data.Word8
import System.Random


randomBytes::Int->StdGen->[Word8]
randomBytes 0 _ = []
randomBytes count g = fromIntegral value:randomBytes (count - 1) nextG
                      where (value, nextG) = next g

randomByteString::Int->StdGen->ByteString
randomByteString count g = pack $ randomBytes count g

main = do
  g <- getStdGen
  let bytestring = randomByteString 2048 g
  print bytestring
import Data.ByteString
导入数据.Word8
导入系统。随机
随机字节::Int->StdGen->[Word8]
随机字节0
randomBytes count g=fromIntegral值:randomBytes(计数-1)nextG
其中(值,nextG)=下一个g
randomByteString::Int->StdGen->ByteString
randomByteString计数g=pack$randomBytes计数g
main=do
G
  • 您可以使用
    CryptoRandomGen
    的任何实例,如Ganesh所示
  • 对于非安全随机值,可以使用
    System.Random
    (参见jamshidh的答案)
  • 您只需获取平台底层生成器提供的熵(这就是
    SystemRandom
    在封面下所做的)
  • 选项3:从平台获取熵

    最后一种技术是最简单的,但是在没有RDRAND指令的系统上有更高的开销——它必须打开文件、读取和关闭文件。这是使用
    包:

    import System.Entropy
    
    someFunc = do
        randBytes <- getEntropy 2048
        ....
    
    import Crypto.Random.DRBG
    
    然后就是Ganesh的例子(在这里复制),在newGenIO上有一个不同的签名:

    do
      g <- newGenIO :: IO CtrDRBG
      case genBytes size g of
        Left err -> error $ show err
        Right (result, g2) -> return result
    
    do
    g错误$show err
    右(结果,g2)->返回结果
    
    出于好奇,我-除了
    RDRAND
    HashDRBG
    HmacDRBG
    之外,它们中的大多数都不符合任何标准(这是不好的,它们似乎完全是程序员的即兴发明)


    由于他正在研究crypto api,我认为他需要更好的随机性,而不是一次性使用,直接使用
    系统不会出现性能瓶颈。熵
    模块更干净,可能更不容易出错(参见我的答案)。但是我同意你的看法,在部署的设置中持续使用RNG加上一些monad-like
    MonadCryptoRandom
    是一个很好的功能解决方案。我使用选项3,因为它正是我想要的功能,我不介意开销,因为我将生成千兆字节的数据,并且根据包的描述,它应该具有很强的加密能力。思考!cryptonite包有一个Crypto.Random模块,其中还有一个getRandomBytes