【问题标题】:How to generate a pseudo-random number using a seed in java for a Stream Cipher?java - 如何使用Java中的种子为Stream Cipher生成伪随机数?
【发布时间】:2023-03-21 15:17:02
【问题描述】:

我正在用 Java 编写一个 Stream Cipher 程序,它应该从 shell 中获取三个参数:一个带密钥的文件、一个用于输入的文件和一个用于输出的文件。然后,该密钥应用作种子,该种子应生成一个伪随机数,该伪随机数应与输入文件中的明文“异或:ed”。

我已经设法编写了用于读取文件的代码,但我不知道我应该如何编写将密钥作为种子的代码,从而生成一个伪随机数,如上所述。有人可以帮我吗?

public static void main(String[] args) throws IOException {
   File key = null;
   File input = null;
   File output = null;
   if (0 < args.length) {
      key = new File(args[0])
      input = new File(args[1]);
      output = new File(args[2]);
}
//more stuff

//a function that takes the seed from the key file and should generate a pseudo-random number

int prng (long seed) {
    Random random = new Random ();
    int bound = 256;
    int number = random.nextInt(bound);

    return number;

    }


      

【问题讨论】:

  • 我在那里看不到流密码。您可以在 CTR 模式下使用 AES 或使用 ChaCha20
  • 如果这是一个学习练习,那么您可以尝试编码RC4,这是一种流密码,但比 AES 更容易为自己编写。对于练习,RC4 很好,但它现在已经过时并且不再安全。它确实可以很好地了解流密码的工作原理。
  • @rossum 谢谢你的回答,但是我不能在这个练习中使用 RC4 或 AES,我必须使用库 java.util.Random。如何从用户输入中获取种子来生成随机数流?

标签: java random cryptography encryption-symmetric stream-cipher


【解决方案1】:

作业中描述的伪随机并不意味着您需要使用随机数生成器。流密码创建的密钥流是伪随机的(对攻击者而言),因为它是从他们不知道的密钥生成的。所以你不应该使用RandomSecureRandom 或类似的。相反,您应该使用Cipher

基本上有两种方法可以实现 CTR 模式。首先,您可以创建一个 16 字节的唯一值流,并在 ECB 模式下使用 AES 对其进行加密(或直接使用分组密码,但这在 Java 中不可用)。然后你得到 16 字节的密钥流作为回报,你可以缓冲并使用它与明文进行异或。

您也可以作弊并使用AES/CTR/NoPadding。然后,要使用所有字节都设置为零来更新密钥流。因为与零的 XOR 是身份函数,所以您将获得密钥流。这可以反过来与实际的明文进行异或以获取密文。由于这是为了练习,如果您实施较早的方法,您可能会学到更多。

【讨论】:

  • 感谢您的回答,不幸的是,我只能在本练习中使用库 java.util.random 来生成字节流。
【解决方案2】:

您需要使用java.util.Random 的(伪)随机字节流。首先从用户那里读取种子/密钥,然后使用它来初始化 Random 类的实例。

long seedKey = getUserInput();
Random myRandom = new Random(seedKey);

仅在代码开头执行一次。

接下来,您需要处理您的输入。如果您对使用流感到满意,那么您可以使用Random.ints()Random.longs() 来生成随机密钥流。或者,将输入文件分成块并使用Random.bytes(myAry) 获取足够的字节来与您使用的任何大小的块进行异或。

除非您使用的是单字节块,否则您将需要处理输入末尾留下的任何部分块。

XOR 的输出将是原始字节,而不是文本。如果您需要文本输出,请使用java.util.Base64 转换为 Base64,这样您就可以得到可打印的内容,而原始加密字节则不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2011-08-21
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多