参考
Dexterjie杰哥

Harry师傅

背包密码

前情提要

背包问题

假设一个背包可以承受重量为$S$,现在有n个物品,其重量分别为$a_1$,$a_2$,…$a_n$

问题:哪些物品在最多只能装一次的情况下可以恰好使得背包被装满。

对应关系式:$x_1a_1+x_2a_2+…+x_na_n=S$

其中($x_i\in0,1$)

实际上,我们可以将明文转换成数字,并将其二进制01码从高位到低位依次作$x_i$.

公布$a_i、S$、这样就实现了,利用背包问题来简单加密明文。

此时,若要破解出$x_i$,爆破攻击的时间复杂度是$O(2^n)$,非常困难也非常安全,但没有意义。

因为加密的目的,是让指定的人(同时有公私钥的人)能快速解密,而只有公钥的人则无法快速解密。

如上所述的加密方式,没有这么一种「私钥」能让拥有者快速解出明文$x_i$

超递增序列

为什么要将这个因为直接爆破攻击时间复杂度为$O(2^n)$,非常困难,为此需要找到一个在特殊情况下可以快速求出序列$X$(即$x_i$组成的序列),即超递增序列

${r_1,r_2,…,r_n}$是超递增序列,指的是$r_i>=r_1+r_2+r_3+…+r_{i-1}$,就是第$i$个个数大于前面$i-1$个数之和,也就是$r_i>2r_{i-1}$

当明文和超递增序列依次相乘再求和时

$x_1r_1+x_2r_2+…+x_nr_n=S$,$x_i={0,1}$,$a_i>0$

可以通过依次比较$S$与序列中最大元素的大小关系来确定该元素性质。

eg:

$S$>$r_n$则$r_n$一定存在于等式左边,即$x_n$=1

就是因为超递增序列的纯在,即使小于$r_n$的所有都存在于等式左边,它们的和也小于$r_n$,所以$S$若要大于$r_n$,$r_n$就必须存在。

令$S=S-r_n$,然后比较$S$和$r_{n-1}$同理可得$x_{n-1}$

同理可得到序列$X$所有元素。

加密算法流程

Encryption

  1. 明文

    • 明文字符串转数字
    • 明文数字转二进制
    • 生成明文序列$x=(x_1,x_2,x_3,…,x_n)$,$x_i\in(0,1)$
  2. 私钥

    • 生成超递增序列:$r=(r_1,r_2,r_3,…,r_n)$为私钥序列
  3. 公钥

    • 生成模数$B$,满足$B>\sum_{i=1}^nr_i$,就是$B>2r_n$
    • 生成乘数$A$,满足$gcd(A,B)=1$
    • 生成公钥序列$M=(M_1,M_2,M_3,…,M_N)$,其中$M_i\equiv Ar_i\pmod B$
  4. 密文

    生成密文$S=x\cdot M=\sum_{i=1}^nx_iM_i$

已知公布序列$M$,乘数$A$,模数$B$,密文$S$

Decryption

  1. 计算$A$关于模$B$的逆元$A^{-1}$
  2. $S’\equiv A^{-1}S\equiv A^{-1}\sum_{i=1}^nx_iAr_i\equiv \sum_{i=1}^nx_ir_i \pmod B$
  3. 利用超递增序列$r$性质,求解二进制明文->数字->字符串

拥有公、私钥者可以计算出$S’$,然后利用超递增序列$r$轻易求解明文

没有私钥者只能计算出$S’$,缺少序列$r$无法利用超递增序列求解。

只能用$S=x\cdot M=\sum_{i=1}^nx_iM_i$,只要正常选择好乘数$A$、序列$r$,模$B$后的序列$M$各元素$(M\equiv Ar_i \pmod B)$将丧失原大小顺序性质。也就是攻击者还是要克服$O(2^n)$的时间复杂度解决问题。

攻击

参数不当

如果乘数$A$,超递增序列$r$大小选取不当,使得$Ar_i$<$B$,则$Ar_i\pmod B=Ar_i$,导致公钥序列是个很明显的超递增序列

参考题目knapsack

这题的思路还是挺清晰的

背包密码求解

贴合实际:

$S=\sum_{i=0}^{n-1}x_iM_i$

其中$M$为背包的公钥,$S$为密文,记$n=len(M)$,背包密度$d=n/log_2(max(M))$

当密度$d<0.9408$时,可以用LLL,BKZ算法来完成求解

这块杰哥讲的比较细时间也比较新。

lattice1

造格

(n+1)*(n+1)

$\begin{pmatrix} 1 & 0 & \cdots & 0 & M_1 \ 0 & 1 & \cdots & 0 & M_2 \ \vdots & \vdots & \ddots & \vdots & \vdots \ 0 & 0 & \cdots & 1 & M_n \ 0 & 0 & \cdots & 0 & S \end{pmatrix}$

线性关系

$(x_1\ x_2 …\ x_n\ -1)\cdot \begin{pmatrix} 1 & 0 & \cdots & 0 & M_1 \ 0 & 1 & \cdots & 0 & M_2 \ \vdots & \vdots & \ddots & \vdots & \vdots \ 0 & 0 & \cdots & 1 & M_n \ 0 & 0 & \cdots & 0 & S \end{pmatrix}=(x_1,x_2,…,0)$

lattice2

造格

(n+1)*(n+1)

$\begin{pmatrix} 2 & 0 & \cdots & 0 & M_1 \ 0 & 2 & \cdots & 0 & M_2 \ \vdots & \vdots & \ddots & \vdots & \vdots \ 0 & 0 & \cdots & 2 & M_n \ 1 & 1 & \cdots & 1 & S \end{pmatrix}$

$(x_1\ x_2\ …\ x_n\ -1)\cdot \begin{pmatrix} 2 & 0 & \cdots & 0 & M_1 \ 0 & 2 & \cdots & 0 & M_2 \ \vdots & \vdots & \ddots & \vdots & \vdots \ 0 & 0 & \cdots & 2 & M_n \ 1 & 1 & \cdots & 1 & S \end{pmatrix}=(2x_1-1,2x_2-1,…,0)$

带模的背包

$S=\sum_{i=0}^nx_iM_i\pmod p→S=\sum_{i=0}^nx_iM_i-kp$

对应的格为

$(x_1\ x_2\ …\ x_n\ -1\ k)\begin{pmatrix} 2 & 0 & \dots & 0 & 0 & M_1 \ 0 & 2 & \dots & 0 & 0 & M_2 \ \vdots & \vdots & \ddots & \vdots & \vdots & \vdots \ 0 & 0 & \dots & 2 & 0 & M_n \ 0 & 0 & \dots & 0 & 1 & S \ 1 & 1 & \dots & 1 & 0 & p \end{pmatrix}=(2x_1-1\ 2x_2-1\ …\ 2x_n-1\ 1\ 0)$

乘法背包