我该如何生成初始化向量?
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 #新加入开头注释 自动生成文件名 开发日期时间等内容