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

标签 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"));
    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));
    }
}

请告诉我以下几行发生了什么:

    do 
    {
        r = q.subtract(new BigInteger(random.nextInt(1000) + ""));
    }
    while ((r.compareTo(new BigInteger("0")) > 0) && (q.gcd(r).intValue() != 1));

(1)为什么生成的随机数上限为1000?

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

最佳答案

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

直接回答您的问题:

  1. Why is random number generated with upper bound 1000?

Merkle-Hellman algorithm 确实表明r应该是“随机”。这样做的实现非常随意;这可能就是让你失望的原因。从技术上讲,该代码不是算法,因为不能保证循环终止。理论上,r 的伪随机候选选择可能是任意长的数字序列,这些数字与 q 不互质,从而导致无限循环。

上限 1000 可能是为了确保所选的 r 足够大。一般来说,大按键比小按键更难破解,因此如果 q 很大,那么此代码只会找到大的 r

获得随机互质数的一种更具确定性的方法是测试低于 q 的每个数字,生成互质数列表并随机选择一个。这可能会更安全,因为攻击者知道 qr 彼此相差在 1000 以内,搜索空间就会显着减少。

  1. Why is it subtracted from q?

减法很重要,因为r 必须小于q。 Merkle-Hellmen 算法就是这样指定的。我不相信事情必须如此。公钥是通过将 w 中的每个元素乘以 r 并取模 q 生成的。如果r非常大,大于q,似乎会进一步混淆qw中的每个元素>.

另一方面,Merkle-Hellmen 的解密步骤取决于 modular inverse每个加密字母a x r−1 mod q。此操作可能会因 r > q 受到阻碍;看来还是可以解决的。

但是,如果 nextInt 可以返回 0,则循环的迭代就是一种浪费,因为 qr 必须不同(gcd(a,a) 只是 a)。

分解代码:

do 

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

    r = q.subtract(new BigInteger(random.nextInt(1000) + ""));

查找 qq - 1000 之间的候选值。

while ((r.compareTo(new BigInteger("0")) > 0) && (q.gcd(r).intValue() != 1));

继续前进,直到找到一个 r :

  • 大于 0 r.compareTo(new BigInteger("0")) > 0,并且
  • q 互质,q.gcd(r).intValue() != 1。显然,随机选择的数字不能保证与另一个数字互质,因此随机生成的候选数字可能不适用于此 q

这样就清楚了吗?我必须承认我不是 Merkle-Hellman 方面的专家。

关于cryptography - 请解释一下 Merkle–Hellman 背包密码系统的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29684733/

相关文章:

c# - 如何将 Rijndael 加密与 .Net Core 类库一起使用? (不是 .Net 框架)

ssl - 非RSA TLS1.2数据包解密

c - 哪个哈希函数在密码验证中是安全的?

转到 AES CFB 兼容性

git - GIT中的 'Commit ID'和 'SHA1 Hash'有什么区别?

php - 在android(客户端)中加密密码并使用rsa在服务器端PHP中解密

database - IV 对静态数据的认证加密(GCM 模式)的关注

node.js - 加密 Node 库更新是什么意思?

cryptography - 为什么 s-box 输入比其输出长?

java - java中如何将String转换为Key