我需要使用密钥伪随机创建数字。 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并进行修改。它没有按预期工作,价值正在重复。
答案 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了解更多信息。
没有办法告诉你如何解决这个问题,因为我不认为可以解决这个问题。我认为这个概念本质上是不安全的。