Cryptography 请解释一下Merkle–Hellman背包密码系统的代码?

Cryptography 请解释一下Merkle–Hellman背包密码系统的代码?,cryptography,Cryptography,这是一个实现Merkle–Hellman背包密码系统的程序的代码片段 // Generates keys based on input data size private void generateKeys(int inputSize) { // Generating values for w // This first value of the private key (w) is set to 1 w.addNode(new BigInteger("1"));

这是一个实现Merkle–Hellman背包密码系统的程序的代码片段

// Generates keys based on input data size
private void generateKeys(int inputSize) 
{
    // Generating values for w
    // This first value of the private key (w) is set to 1
    w.addNode(new BigInteger("1"));
    for (int i = 1; i < inputSize; i++) 
    {
        w.addNode(nextSuperIncreasingNumber(w));
    }
    // Generate value for q
    q = nextSuperIncreasingNumber(w);

    // Generate value for r
    Random random = new Random();

    // Generate a value of r such that r and q are coprime
    do 
    {
        r = q.subtract(new BigInteger(random.nextInt(1000) + ""));
    }
    while ((r.compareTo(new BigInteger("0")) > 0) && (q.gcd(r).intValue() != 1));

    // Generate b such that b = w * r mod q
    for (int i = 0; i < inputSize; i++) 
    {
        b.addNode(w.get(i).getData().multiply(r).mod(q));
    }
}
1为什么随机数的上限为1000


2为什么要从q中减去它?

代码正在搜索与已选择的值q共素数的值。在我看来,它做得相当糟糕,但你提到它是一个模拟器?我不确定这意味着什么,但也许这只是意味着代码是快速和肮脏的,而不是缓慢和安全的

直接回答您的问题:

为什么随机数的上限是1000? 这确实表明r应该是“随机的”。这样做的实施相当随意;这可能就是你被甩的原因。该代码在技术上不是一个算法,因为循环不能保证终止。理论上,r的psuedo随机候选选择可以是一个任意长的数字序列,它不是q的共素数,从而形成一个无限循环

1000的上限可以确保选择的r足够大。一般来说,大的键比小的键更难破解,所以如果q很大,那么这段代码只会找到大的r

获得随机共素数的一种更确定的方法是测试每个低于q的数字,生成一个共素数列表,然后随机选择一个。这可能会更安全,因为攻击者知道q和r彼此之间的距离在1000以内时,搜索空间会显著减少

为什么从q中减去它? 减法很重要,因为r必须小于q。Merkle-Hellmen算法就是这样规定的。我不认为有必要这样做。通过将w中的每个元素乘以r并取模q来生成公钥。如果r非常大,比q大,它似乎会进一步混淆q和w中的每个元素

另一方面,Merkle Hellmen的解密步骤取决于每个加密字母a x r的大小−1模q。r>q可能会妨碍该操作;看来还是可以解决的

然而,如果nextInt可以返回0,那么循环的迭代就是浪费,因为a q和r必须是不同的gcda,a只是a

分解代码:

do 
至少试一次。在调用方法之前,r可能为null或未定义

    r = q.subtract(new BigInteger(random.nextInt(1000) + ""));
找到一个介于q和q-1000之间的候选值

继续,直到找到一个r,即:

大于0 r.比较新的大整数0>0,以及 与q,q.gcdr.intValue共素数!=1.显然,随机选择的数字不能保证与另一个数字共同素数,因此随机生成的候选者可能不适用于该q。
这就清楚了吗?我必须承认我不是Merkle Hellman方面的专家。

如何修改代码以使其更整洁、更高效?我不确定效率是否是您想要的。安全性是密码系统的基准,这艘船已经驶向Merkle Hellman。维基百科参考了Shamir,Adi 1984。一种用于破解基本Merkle-Hellman密码体制的多项式时间算法。信息论,IEEE学报,30 5:699–704。但是,您可以通过在随机选择一个之前找到所有小于且与q互质的数字来改进这个特定的实现,并且尽可能高效地这样做不会损害安全性。
    r = q.subtract(new BigInteger(random.nextInt(1000) + ""));
while ((r.compareTo(new BigInteger("0")) > 0) && (q.gcd(r).intValue() != 1));