繁体   English   中英

如何使用 java 中的种子为 Stream 密码生成伪随机数?

[英]How to generate a pseudo-random number using a seed in java for a Stream Cipher?

I am working on a Stream Cipher program in Java which should take three arguments from the shell: a file with a key, a file for input, and a file for output. 然后,该密钥应作为种子,该种子应生成一个伪随机数,该伪随机数应与输入文件中的明文“异或: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;

    }


      

分配所描述的伪随机并不意味着您需要使用随机数生成器。 由 stream 密码创建的密钥 stream 是伪随机的(对对手而言),因为它是从他们不知道的密钥生成的。 所以你不应该使用RandomSecureRandom或类似的东西。 相反,您应该使用Cipher

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

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

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

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

仅在代码开头执行一次。

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

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

XOR 中的 Output 将是原始字节,而不是文本。 如果你需要文本 output 然后使用java.util.Base64转换为 Base64。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM