c - 生成没有良好随机源的初始化 vector

标签 c random cryptography initialization-vector

对于 Rockbox 的密码存储插件(用 C 编写),我需要生成初始化 vector 。

问题是我没有很好的随机源。 Rockbox 提供的 random() 不是加密 RNG。而且我几乎没有任何可以访问的随机源(没有鼠标移动,...在运行 Rockbox 的 IPod 上)。

key 目前是通过 PBKDF2 从用户提供的密码和盐(它是一个常量前缀 + 来自 random() 的一些数据)派生的。我认为伪随机数据对于具有 10000 次 PBKDF2 迭代的 salt 应该足够好。

但是,我从哪里获取初始化 vector 呢?如果我获取一些半随机数据(时间 + 随机())和 SHA,比如 10000 次,可以吗?我应该使用 arc4random 和从 random() 中获取的种子吗?

如果我实际上从不使用同一个 key 两次(每次更改存储的数据时都会重新计算盐),我什至还需要 IV 吗?处理此类情况的最佳方法是什么?

编辑: 只有一个用户(我,拥有 iPod),加密算法:AES-CBC 256 位。 该文件仅存储各种网站的站点/帐户/密码列表。它很少被修改(每当我在网站上创建一个新帐户时),当发生这种情况时,会生成一个新的 salt 和一个新的 IV。

最佳答案

一般来说,对于 CBC,IV 必须是随机且统一的。 “不重复”是不够的。更准确地说,CBC 的全部意义在于避免将同一个数据 block 两次提供给底层分组密码的情况。因此,条件是如果您使用相同的 key 加密两个消息,则两个 IV 的差异必须是均匀随机的。使用 128 位 block 密码(例如 AES),同一 block 被两次获得的概率非常低,可以忽略不计——只要 IV 在整个 128 位值空间上以均匀概率随机选择. IV 选择中的任何结构(例如重复使用相同的 IV、使用计数器或低质量的随机生成器)都会增加这种可能性,因为您正在加密本身具有很多结构的数据。

这有一个好的方面:如果您从不两次使用相同的 key ,那么您可以容忍固定的 IV。但这是一个强有力的“从不”。

“非重复 IV”对于 CBC 来说不是一个足够好的属性。但是,有一些加密模式可以使用非重复 IV。特别是,看看 EAXGCM .这里的技巧是那些模式在使用加密 key 的自定义 PRNG 中使用提供的 IV;这将非重复 IV(例如计数器或低质量的“随机值”)转换为从密码学的角度来看足够随机的东西。不要尝试构建自己的 PRNG!这些事情很微妙,没有确定的方法来测试结果的质量。

关于c - 生成没有良好随机源的初始化 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4695631/

相关文章:

c - 包含 math.h 库时程序内存不会增加

c++ - 如何在 C++ 中编写好的 round_double 函数?

objective-c - 根据游戏状态随机生成敌人统计数据

java - java中的细粒度身份验证

c - 基于DBusGProxy连接dbus信号失败

c - 使用 LookupAccountName 时访问冲突写入位置 0x00000000

PHP:如何随机选择最大概率值?

haskell - Rand monad 的 MonadFix 实例

java - 无法使用 "SecretBox"(C#) 打开 TweetNacl (Java) 生成的 "Libsodium-net"

适用于 windows phone 7 和 8 应用程序、silverlight 客户端和 windows 平板电脑应用程序的 c# 密码学