硬背包问题的通用新算法
1. 引言
0 - 1 背包问题,也称为子集和问题,是著名的 NP 难题,常被用于密码系统的构建。该问题的一个实例包含一个由 n 个正整数组成的列表 $(a_1, a_2, \cdots, a_n)$ 以及另一个正整数 S。它有两种形式:
- 决策背包问题 :判断 S 是否可以写成 $S = \sum_{i = 1}^{n} \epsilon_i a_i$ 的形式,其中 $\epsilon_i$ 的值在 ${0, 1}$ 中。
- 计算背包问题 :若至少存在一个解,则找出解 $\epsilon = (\epsilon_1, \cdots, \epsilon_n)$。
决策背包问题是 NP 完全问题。已知一个能解决决策问题的神谕,通过对该神谕进行 n 次调用,就可以解决计算问题。
背包问题于 1978 年由 Merkle 和 Hellman 引入密码学领域。Merkle - Hellman 公钥密码系统的基本思想是将一个简单的背包实例隐藏在一个看似困难的实例中,但该方案被 Shamir 利用格规约破解。此后,许多基于背包的密码系统也被格规约方法破解。
背包的密度定义为 $d = \frac{n}{\log_2(\max_i a_i)}$。当 $d < 1$ 时,给定的和 S 通常可以唯一地反转,这些背包可用于加密;当 $d > 1$ 时,大多数和有许多原像,背包可用于哈希。然而,对于加密而言,密度不能太低,因为 Lagarias - Odlyzko 低密度攻击在给定一个能解决格中最短向量问题(SVP)的神谕时,可以解决密度 $d &
超级会员免费看
订阅专栏 解锁全文
13

被折叠的 条评论
为什么被折叠?



