我该如何生成初始化向量?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我该如何生成初始化向量?相关的知识,希望对你有一定的参考价值。

我确信这个问题没有一个答案,只是想找出一个通用的方法。

使用Java 1.4.2,我需要生成一个密钥和IV,以便在对称算法中使用。这些值将通过安全通道与收件人预先共享。

我可以使用KeyGenerator.keyGenerate()生成密钥。但除非我错过它,否则没有生成随机IV的功能。

我应该做一些完全随意的事情,比如从内存中拉出16个随机字节或者是否有一种产生足够随机初始化向量的首选方法?

答案

对于某些实现,SecureRandom类将通过生成真正的随机数来帮助您:

许多SecureRandom实现采用伪随机数生成器(PRNG)的形式,这意味着它们使用确定性算法从真正的随机种子生成伪随机序列。其他实现可以产生真正的随机数,而其他实现可以使用两种技术的组合。

它有两个方法,getProvider()getAlgorithm(),它们可以为您提供有关使用哪种实现的一些信息。从this page看来,伪随机生成器SHA1PRNG(用真正的随机数据播种)似乎是其中之一,甚至是当前唯一可用的。

另一答案

这取决于您使用密码的模式。如果你正在使用CBC,那么来自SecureRandom的字节是最简单的,也可能是最安全的......只要你的RNG是好的。

大多数Java提供程序将自动生成所需的参数,但为了让您了解所选的内容,您需要了解密码和模式。例如,如果您使用的是需要IV的模式,您可以执行以下操作:

cipher.init(Cipher.ENCRYPT_MODE, secret);
IvParameterSpec spec = 
   cipher.getParameters().getParameterSpec(IvParameterSpec.class);
byte[] iv = spec.getIV();

这允许提供者选择合适的方法来生成IV本身。但是如果你在使用ECB模式的密码上使用相同的方法,它将失败。

使用计数器模式显然需要非常小心以避免重复使用计数器。

另一答案

正如其他答案暗示的那样,使用安全的随机数生成器来创建IV。

尽管如此,您不需要通过安全通道发送IV - 通常只是将其添加到消息中。请记住,为每条消息使用新的IV比保持IVs保密更为重要。在密钥的同时预先共享IV而不是重新使用IV(不良),或者限制您可以发送的消息数量。

另一答案

如果您正在使用GUI或者您可以访问用户数据输入硬件(首选鼠标)的系统调用,则可以在用户移动时创建一对鼠标指针坐标向量。将它们添加到某个字符串。比在字符串上使用您喜欢的哈希函数来创建具有高熵的完全随机IV。

以上是关于我该如何生成初始化向量?的主要内容,如果未能解决你的问题,请参考以下文章

vscode 用户代码片段 vue初始化模板 Snippet #新加入开头注释 自动生成文件名 开发日期时间等内容

Eclipse 自动创建片段布局,我该如何禁用它

如何修复 C++ 中的“分段错误”错误

片段活动中的 ListView 适配器上下文错误,我该怎么办?

从 ViewPager 中检索片段

引用向量的部分片段?