在前文介绍了非对称加密系统Polly Cracker,就像naive RSA一样,它也不是一个安全的加密系统。例如,在已知一对明文密文\((m, c)\),攻击者可以构造出来一个新的明文密文对\((m+m', c+m')\),因为\((c + m')(\sigma) = c(\sigma) + m' = m + m'\)。但本文将要讨论的问题要比这个严重的多:攻击者可以通过构造特殊的密文,直接解出来Polly Cracker的密钥。

密钥

假设在攻击模型里面存在一个Oracle,它的作用是接收攻击者提交的密文,并返回明文给他。有了Oracle的帮助,攻击者可以最终获得密钥。

为了防止遗忘,在这里再次列出加密与解密的过程

$$ c = m + \sum_{j=1}^s p_j h_j,$$ $$ c(\sigma) = m + \sum_{j=1}^s p_j(\sigma) h_j(\sigma) = m$$

现在攻击者不直接对消息m进行加密,而是加密一个变量\(x_i \in \{ x_1,\dots,x_n \}\),得到密文 $$ c = x_i + \sum_{j=1}^s p_j h_j,$$ 并发送给Oracle,Oracle返回对应的明文给攻击者。通过观察返回的明文,他可以慢慢重新构建出完整的密钥。 怎么做到的呢? 观察一下,当攻击者用变量\(x_i\)代替真实的消息以后,解密时也需要相应的值代替该变量,即\(\sigma_i\) $$ m = c(\sigma) = \sigma_i + \sum_{j=1}^s p_j(\sigma) h_j(\sigma) = \sigma_i。$$ 不难理解,返回的明文即是密钥\(\sigma\)的第i维坐标。如此重复n回,攻击者即能获得完整的密钥信息,取得胜利。

升级

会出现如此严重的问题是因为,Polly Cracker系统并没有检测正在解密的密文来自一条正常的消息,还是加密变量的结果。如果能够检测出来密文来自变量并拒绝解密,攻击者就无法通过直接观察返回的明文来获取密钥的信息。现在我们来升级一下Polly Cracker系统使之能够拒绝某些密文。

回到密钥生成的阶段,如果能够找到一组多项式 \(p_1, \dots, p_s\) 同时拥有两个不同的解 \(\sigma_1,\sigma_2\),或者直接组合两个不同的Polly Cracker系统来构造一个新的Polly Cracker。当解密的时候,分别用\(\sigma_1\)和\(\sigma_2\)去替代密文中的变量,如果两个结果相同则认为是合法密文,否则拒绝。

通过这个方法,可以让前述的非法密文失效。但是攻击者不会就这么轻易放弃的,不断地挑战能够带来极大的快乐。聪明的他想到了一个新的办法,是怎样呢?

他又构造了一种密文,可以顺利通过检查

$$ c_{\alpha,\beta} = (x_i - \alpha)(x_i - \beta) + \sum_{j=1}^s p_j h_{j,\alpha,\beta},$$

其中\(\alpha, \beta \in \mathbb{F}_q: \alpha \neq \beta\)。通过尝试不同的\( (\alpha,\beta) \),攻击者可以获得合法的密文,显然返回的明文都是0,也就意味着\(\alpha或者\beta是\sigma_1或者\sigma_2\)的第i维坐标。攻击者为所有的变量\(x_i\)都尝试构造这样的密文,最终获得n组\( (\alpha,\beta) \)。那么接下来的工作就是,区分每一组里面的\(\alpha\)和\(\beta\)分别属于哪一个\(\sigma\)。

怎么做呢?攻击者开动脑筋继续构造一种新的密文并发给Orcale $$ c = (x_1 - \alpha_1)(x_2 - \alpha_2) + (x_1 - \beta_1)(x_2 - \beta_2) + \sum_{j=1}^s p_j h_j,$$ 如果返回的明文为0,可以判断\((x_1,x_2)\)在解密的时候被(\(\alpha_1,\beta_2)\)和\((\alpha_2,\beta_1)\)所替代;如果返回的明文不为0,则是被\((\alpha_1,\alpha_2)\)和\((\beta_1,\beta_2)\)所替代。

这样攻击者恢复了\(\sigma_1\)和\(\sigma_2\)的前两个坐标,重复对\((x_2,x_3), \dots, (x_{n-2},x_{n-1}),(x_{n-1},x_n)\)构造类似的密文,最终恢复出完整的两条\(\sigma_i\)链,也就是系统的两个密钥。

攻击者又一次胜利了。