我正在开发一款适用于 Windows 手机的应用程序,需要一个 1MB 的随机字节池作为一次性加密的密钥。我计划首先制作一个字节数组,并用内置的 RNGCryptoServiceProvider 生成的字节填充它(应用程序是用 c# 制作的)。并使用来自加速度计、摄像头、麦克风和触控等来源的信息。然后我用每个池位按位异或这个信息。
这是一种安全的方法还是有更好/更安全的方法?
我正在开发一款适用于 Windows 手机的应用程序,需要一个 1MB 的随机字节池作为一次性加密的密钥。我计划首先制作一个字节数组,并用内置的 RNGCryptoServiceProvider 生成的字节填充它(应用程序是用 c# 制作的)。并使用来自加速度计、摄像头、麦克风和触控等来源的信息。然后我用每个池位按位异或这个信息。
这是一种安全的方法还是有更好/更安全的方法?
好的,所以我们似乎有几个针对第 1 部分的评论,这是否安全。现在进入问题 2,有没有更好更安全的方法?
这个难题包含三个部分:密钥生成、密钥分发和加密。
我强烈建议坚持使用经过验证的、真实的密钥分发和加密方法,但在从采样输入设备生成的密钥中添加熵只会有帮助。
诀窍是您想使用散列函数将熵累积并“白化”到密钥中。例如,您可以从您提到的所有熵源收集数据,使用 SHA-256 对它们进行哈希处理,以将所有熵打包到一个可管理的空间中并对其进行随机化,然后按照您之前的建议与 RNGCryptoServiceProvider 数据进行异或。
现在,您添加的狂野熵已经从您的 PRNG 中生成了一个真正的 RNG。
当您收集更多熵时,将原始哈希与新数据散列,以便旧熵与新熵混合。这样,您最终将累积一个完整的哈希长度的熵。
但是,要弄清楚达到该状态需要多长时间是比较困难的。