PRNG在java中按键播种

时间:2013-04-15 13:38:47

标签: java random cryptography prng random-seed

我需要使用密钥伪随机创建数字。 key是转换为字节数组的字符串。 这就是我想出的:

    int N=10;
    int key[]= {13,10,1,5};
    int tmp,j=0;
    for (int i=0; i < N; i++) { 
        j = (j + key[i % key.length]) % N; 
        System.out.println(j);
    }

此代码取自RC4的PRNG并进行修改。它没有按预期工作,价值正在重复。

2 个答案:

答案 0 :(得分:2)

此代码将为您提供数字0到9的一致,随机排列...排列是随机的,但对于相同的键将始终相同

public static void main(String[] args) throws Exception
{
    byte key[]= {13,2,4,6,7}; 
    SecureRandom random = new SecureRandom(key); 

    List<Integer> nums = new ArrayList<Integer>();
    for (int i = 0; i < 10; i++) { 
        nums.add(i);
    }

    Collections.shuffle(nums,random);

    for(Integer n: nums) {
        System.out.println(n);
    }
}

答案 1 :(得分:1)

嗯,第一个问题是你试图用四字节密钥制作一个PRG。这本身就是不安全的。攻击者很容易猜到。

第二个问题是你只使用十轮PRG,这意味着即使你有一个128位的密钥,你也只会使用前十个,这使得这本身就不安全。

您的第三个问题是您使用i % key.length作为您的mod函数的索引。这是一个问题,因为您使用的索引将增加一个。如果你有一个更大的密钥,这将更好地模拟随机性,但由于你的密钥只有四个字节,它不会。

此外,您似乎在函数末尾随意添加了% N。我不确定你想要完成什么,但是我发现重复的模式我并不感到惊讶。你已将功能折叠到一个很小的数字。同样重要的是要注意,随着迭代计数的增加,输出大小会增加,这通常是无用的。

您的算法也忽略了RC4生成算法的大多数关键点;阅读here了解更多信息。

没有办法告诉你如何解决这个问题,因为我不认为可以解决这个问题。我认为这个概念本质上是不安全的。