请为Merkle–Hellman背包密码系统解释此代码?

用户名

这是实现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中减去?

帕特里克·M

代码正在搜索与已选择的值互质的值q在我看来,这样做的效果很差,但是您提到它是模拟器吗?我不确定这意味着什么,但是也许这只是意味着代码既快速又肮脏,而不是缓慢而安全。

直接回答您的问题:

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

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

上限1000可能是为了确保所选r的足够大。通常,大键比小键更难破解,因此如果q,则此代码只会找到大r

获取随机互素的更确定性的方法是测试每个小于q的互素,生成一个互素列表并随机选择一个。这可能会更安全,因为攻击者知道这一点q并且r彼此之间的距离在1000以内,搜索空间将大大减少。

  1. 为什么从q中减去?

减法很重要,因为r必须小于qMerkle-Hellmen算法以这种方式指定它。我不认为一定要那样做。通过将w中每个元素乘以r并取模数q来生成公共密钥如果r非常大,大于q,似乎将进一步混淆qw中的每个元素

另一方面,Merkle-Hellmen的解密步骤取决于每个加密字母a x r -1 mod q模逆使用>可能会妨碍此操作似乎仍然可以解决。rq

但是,如果nextInt可以返回0,则循环的迭代将浪费a,q并且r必须不同(gcd(a,a)只是a)。

分解代码:

do 

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

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

查找介于q之间的候选值q - 1000

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

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

  • 大于0 r.compareTo(new BigInteger("0")) > 0,并且
  • 是互质带qq.gcd(r).intValue() != 1显然,不能保证随机选择的数字与另一个数字互质为素数,因此随机生成的候选者可能对此无效q

这样可以清除吗?我必须承认我不是Merkle-Hellman的专家。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Merkle–Hellman背包密码系统-我的考试

来自分类Dev

请解释此python代码的输出

来自分类Dev

多cURL,请解释此php.net代码

来自分类Dev

请解释一下此序言代码的作用

来自分类Dev

请解释此 C 代码的 for 循环和输出

来自分类Dev

请解释此代码列表=''.join(如果列表中不是i,则i为list_text_from_file中的i)

来自分类Dev

请解释此嵌套查询

来自分类Dev

请解释这行javascript代码

来自分类Dev

解释此javascript代码

来自分类Dev

为什么此Python代码像它那样起作用?请解释

来自分类Dev

请为所有初学者解释此.htaccess文件

来自分类Dev

请解释此递归javascript函数

来自分类Dev

请解释此C#LINQ语句

来自分类Dev

请解释此SSH连接命令格式

来自分类Dev

请详细解释此.htaccess文件

来自分类Dev

请有人向我解释此JAVA代码的输出不要运行此代码会窃取密码

来自分类Dev

解释此代码的程序输出?

来自分类Dev

请解释我提到的代码行

来自分类Dev

请解释linux内核源代码目录

来自分类Dev

请解释以下代码的输出

来自分类Dev

请详细解释下面的代码

来自分类Dev

Javascript:请解释以下代码

来自分类Dev

请解释这段C代码的输出

来自分类Dev

请解释一下此Javascript关闭练习

来自分类Dev

请解释此缩写的ES6 JSX声明

来自分类Dev

请详细解释此正则表达式(Powershell)

来自分类Dev

请解释此PowerShell脚本中“%i * g”的含义

来自分类Dev

请帮助解释此bash输出重定向

来自分类Dev

谁可以解释此Scala代码的含义