2012-07-23 122 views
2

我正在为windows phone开发一个应用程序,需要一个1MB的字节随机池来用作一次性pad加密的密钥。 我打算先制作一个字节数组,然后用内置的RNGCryptoServiceProvider(应用程序由c#生成)生成的字节填充它。并使用加速计,相机,麦克风和触摸等来源的信息。然后,我将这些信息与每个池中的位进行逐位比较。加密安全随机数生成器

这是一种安全的方法还是有更好/更安全的方法?

+6

如果它是伪随机的,它不是一次性的。你只是在构造一个恼人的使用流密码。 – CodesInChaos 2012-07-23 20:51:00

+0

@CodesInChaos:**加速度计,相机,麦克风和触摸**!=伪随机。 – SLaks 2012-07-23 20:51:23

+3

你会用加密的字节做什么?有人需要解密他们,而且有人需要你的一次性平板电脑。那么你打算如何将它发送给接收器?也许你需要对它进行修改。严重的是:这个解决方案与关键一样安全。 – 2012-07-23 20:52:22

回答

2

好吧,所以我们似乎有几条评论,第1部分,这是安全的。现在问题2,是否有更安全的方法?

这个难题有三个部分:密钥生成,密钥分配和加密。

我强烈建议坚持尝试真正的密钥分配和加密方法,但是从采样输入设备向密钥生成中添加熵只能提供帮助。

这里的诀窍就是要使用哈希函数累积和“美白”该熵到密钥中。例如,您可以从您提到的所有熵源中收集数据,使用SHA-256对其进行散列以将所有熵值打包到可管理的空间并随机化,然后按照您以前的建议与RNGCryptoServiceProvider数据异或。

现在,您添加的野生熵已经使您的PRNG成为真正的RNG。

随着您收集更多熵,将原始散列与新数据进行散列,以便旧熵与新散列一起变得清晰。这样,你最终会累积一个完整的哈希值的熵值。

虽然,搞清楚达到这个状态需要多长时间是很困难的。

+0

感谢你的回答,你们中的一些人可能会发现这种冒犯,并认为不听取给我的建议,但那不是真的,我尝试尽可能多地学习,但我只想更好地解释上述评论中的一些陈述,所以就来了。你难过这个难题的三个重要组成部分。密钥生成,密钥分配和加密。如果我使用像您建议的密钥生成和密钥分发不在我的应用程序中没有问题,为什么我可以使用aes作为上面的注释建议,而不是一个otp。 – 2012-07-24 17:59:16

+1

对于OTP,您必须以某种方式安全地获取与接收者相比明文长或更长的垫。这并不比安全传送明文更简单,它只是让您安排秘密部分何时发生。此外,整个键盘需要是随机的 - 纯熵,这对您的RNG非常苛刻。 AES,RC4等允许您传输一个可以用于大量数据的小密钥。公钥技术允许您公开交换或创建这些密钥。 ...所有这些都取决于将受益于更多熵的RNG。 – tbroberg 2012-07-25 03:37:11