Cryptography 请解释一下Merkle–Hellman背包密码系统的代码?
这是一个实现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"));
// 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));