我正在开发一款适用于Windows手机的应用程序,需要一个1MB的字节随机池作为一次性密钥加密的密钥。 我计划首先创建一个字节数组,并用内置的RNGCryptoServiceProvider生成的字节填充它(app用c#制作)。并使用来自加速度计,相机,麦克风和触摸等来源的信息。然后我用每个池位按位xor这个信息。
这是一种安全的方法还是有更好/更安全的方式?
答案 0 :(得分:2)
好的,所以我们似乎对第1部分有几条评论,这是否安全。现在问题2,是否有更好的安全方式?
这个难题有三个部分:密钥生成,密钥分发和加密。
我强烈建议坚持使用经过验证的密钥分发和加密方法,但是从采样输入设备向密钥生成添加熵只会有所帮助。
有一种技巧是你希望使用散列函数将熵聚集并“篡改”到密钥中。例如,您可以从您提到的所有熵源收集数据,使用SHA-256对它们进行哈希处理,将所有熵打包到可管理的空间中并随机化,然后按照您之前的建议使用RNGCryptoServiceProvider数据进行XOR。
现在你添加的野生熵已经从你的PRNG中产生了一个真正的RNG。
当您收集更多熵时,使用新数据对原始哈希进行哈希处理,以便旧熵与新熵一起使用。这样,您最终将累积一个完整的散列长度值熵。
然而,确定达到该状态所需的时间更难。