我想了解Java的SecureRandom对象

Gar*_*ght 5 java random cryptography

在做初学者的加密课程时,我正试图掌握Java的SecureRandom对象.我认为我理解的是:

a)无论你知道多少个随机数,都无法预测序列中的下一个随机数.

b)无论你知道多长一段随机数,除了暴力猜测之外,没有办法知道用哪种种子开始它们.

c)您可以请求各种大小的安全随机数.

d)您可以使用各种不同大小的值为新创建的SRNG播种.您创建的每个新创建的SRNG和具有相同值的种子将生成相同的随机数序列.

我应该补充一点,我假设这个代码在Windows上使用:

Random sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
Run Code Online (Sandbox Code Playgroud)

我的基本理解是否正确?提前致谢.

对于那些在加密方面相当专业的人,我还有一些问题.它们涉及播种SRNG而不是让它在首次使用时播种.

e)如果使用长整数而不是8字节的数组播种SRNG,它对生成的随机数有什么不同?

f)如果我用一个具有256个字节的SRNG播种,是否有任何其他种子可以产生相同的随机数序列?

g)是否有某种最佳种子大小?在我看来,这可能是一个毫无意义的问题.

h)如果我通过将SRNG播种为256字节来加密明文然后使用明文中的字节生成随机字节到XOR,那么窃听者解密生成的密文有多容易?需要多长时间?我是否认为窃听者必须知道,猜测或计算256字节的种子?

我看过以前有关SecureRandom的问题,似乎没有人回答我特别关注的问题.如果这些问题中的任何一个看起来过于愚蠢,我想重申一点,我是学习这一领域的初学者.我非常感谢任何输入,因为我想了解如何在加密中使用Java SecureRandom对象.

Maa*_*wes 1

好的,按顺序:

a) 正确

b) 正确

c) 正确,您甚至可以使用 [0, n) 范围内的数字nextInt(n)

d) 尽可能正确:SHA1PRNG 的实现没有由任何算法公开定义,并且有迹象表明该实现及时更改,因此这仅适用于 Sun 提供商,并且仅适用于特定的运行时配置

e) 由于 API 明确指示使用了 long 中的所有字节(“使用给定 long 种子中包含的八个字节”),因此添加到状态的熵量不应有任何差异

请注意,快速检查表明其setSeed(long)行为完全不同,setSeed(byte[])主要区别在于值的种子long始终与从系统检索的随机性混合在一起,即使这是SecureRandom构造实例后的第一次调用。

f) yes - 无限数量的种子生成相同的流;由于使用了哈希函数,因此不可能找到一个

g) 如果加入额外的熵,则熵越多越好,但没有最小值;如果你使用它作为唯一的种子,那么你不应该从少于 20 字节的种子开始,也就是说:如果你想让种子保持与 PRNG 的内部状态相同的安全约束

我想补充一点,如果您使用的熵少于 64 字节,那么您肯定处于危险区域。请注意,1 位熵并不总是意味着一个字节中的 1 位。大小为 8 的字节数组可能具有 64 位或更少的熵。

h) 这基本上是一个基于哈希的流密码;它是安全的,所以攻击者几乎没有机会(假设你不重复使用种子),但它是一个非常不可靠的(参见答案d)和慢速流密码,所以请永远不要这样做 - 使用Cipherwith "AES/CTR/NoPadding""AES/GCM/NoPadding"代替