java - 我想了解 Java 的 SecureRandom 对象

标签 java random cryptography

在学习初学者的加密类(class)时,我试图掌握 Java 的 SecureRandom 对象。我想我的理解是:

a) 无论您知道多长的随机数序列,都无法预测序列中的下一个随机数。

b) 无论您知道多长的随机数序列,除了蛮力猜测之外,都无法知道使用哪个种子启动它们。

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

d) 您可以为新创建的 SRNG 播种各种不同大小的值。您创建并使用相同值作为种子的每个新创建的 SRNG 都会产生相同的随机数序列。

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

Random sr = SecureRandom.getInstance("SHA1PRNG", "SUN");

我的基本理解正确吗?提前致谢。

我还有一些问题要问任何精通加密技术的人。它们与播种 SRNG 相关,而不是让它在首次使用时自行播种。

e) 如果您使用长整数而不是 8 字节数组作为 SRNG 的种子,它对生成的随机数有什么区别(如果有的话)?

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

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

h) 如果我通过用 SRNG 播种 256 字节来加密明文,然后让它生成随机字节与明文中的字节进行 XOR,窃听者解密生成的密文有多容易?可能需要多长时间?我认为窃听者必须知道、猜测或计算 256 字节种子的想法是否正确?

我查看了之前关于 SecureRandom 的问题,但似乎没有一个能回答我特别关心的问题。 如果这些问题中的任何一个看起来过于愚蠢,我想重申我是研究这个领域的初学者。如果我想了解如何在密码学中使用 Java SecureRandom 对象,我将不胜感激。

最佳答案

d) 这对于 PRNG 是正确的。 CSRNG 并不总是如此。阅读 SecureRandom.setSeed() 的 Javadoc:“给定的种子补充而不是替换现有的种子。因此,保证重复调用永远不会减少随机性。”

任何合理的 CSRNG 都会有您无法明确控制的“隐形”熵源,通常是从操作系统级别获取的各种内部参数。因此,播种比您明确传递给 RNG 的任何数字都多。

关于java - 我想了解 Java 的 SecureRandom 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23256949/

相关文章:

java - 如何通过哈希随机化(在 Java 中)?

Java 密码库偶尔无法启动

java - 微调框已选择项目选择事件

Java-Stream - Java 11 中基于聚合计数的分组和排序

java - Java 中的 MP4 容器编写器

Javascript 随机引用 onclick

java - 是否有理由不能拥有具有相同签名的静态和非静态方法?

c - C中的随机数

c# - 部分解密数据

cryptography - AES加密如何传输IV