2

我需要使用密钥伪随机地创建数字。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 并进行了修改。它没有按预期工作,值正在重复。

4

2 回答 2

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);
    }
}
于 2013-04-16T15:33:13.787 回答
1

嗯,第一个问题是你试图从一个四字节的密钥中创建一个 PRG。这本质上是不安全的。攻击者将能够很容易地猜测。

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

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

此外,您似乎在% N函数末尾任意添加了 a 。我不确定你想要完成什么,但我并不惊讶你会发现重复的模式。您已将函数压缩为一个很小的数字。同样重要的是要注意,随着迭代次数的增加,输出大小也会增加,这通常是没有用的。

你的算法也忽略了RC4生成算法的大部分关键点;阅读此处了解更多信息。

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

于 2013-04-15T13:59:50.360 回答