🍟背包密码(一)
2023-8-31
| 2023-11-1
0  |  0 分钟
type
status
date
summary
password
category
slug
icon
🥱
最近总是遇见背包,从0开始学一下,想到是算法就头大,不想学😣😣😣🌧️🌧️🌧️
 

🎒背包问题

密码学背包问题(Cryptographic Knapsack Problem)是一种基于背包问题的密码学问题。它是由Merkle和Hellman于1978年提出的,也被称为Merkle-Hellman背包密码。
 
假定一个背包可以称重 W,现在有 n 个物品,其重量分别为 a1,a2,...,an ,装哪些物品可以恰好使得背包装满,并且每个物品只能被装一次。这其实就是在解这样的一个问题
其中所有的 xi只能为 0 和 1
蛮力攻击的时间复杂度是,就算中途相遇也只能降低到

🔑背包密码

Merkle-Hellman背包算法的思想是将消息编码为背包问题的解。明文分组长度等于堆中物品的个数,并且明文位与xi的值相对应,密文则是计算得到的和值
背包实际上存在两类不同的背包问题
  • 线性时间内可解
  • 线性时间内不可解
对于易解的背包问题,可以选择超递增序列,那么相应的背包问题容易求解。
 

超递增背包

超递增是指序列满足如下条件
即第 i 个数大于前面所有数的和。
超递增背包
已知背包向量A=(a1,a2,…,an),若有以下关系成立:
则称为背包向量A为超递增背包向量。
超递增背包向量问题可以通过贪婪算法求解。
贪婪算法 已知s为背包容积,对A从右向左检查每一元素,判断元素是否在解中。检查时判断如下条件:s≥an,则an在解中,令xn=1;否则令xn=0。依次检查完成后可以即可得到
🎈
超递增背包问题的解很容易找到,计算其总量并与序列中最大的数比较,如果总重量小于这个数,则它不在背包中,如果总重量大于这个数,则它在背包中,背包重量减去这个数,进而考察序列中下一个最大的数,重复直到结束。如果总重量减为0,那么只有一个解,否则,无解。 非超递增序列的背包是困难的问题,它们没有快速算法。要决定哪一项在背包中的唯一方法,是依次测试所有解,直到你得到正确的解为止。最快的算法仍随背包中物品超递增问题困难,对于后者,当你加入一项到序列中,求解只需要再进行一次运算。

加密流程

公私钥生成

生成私钥

私钥就是我们的初始的背包集,生成超递增序列
 

生成公钥

在生成公钥的过程中主要使用了模乘的运算。
首先,我们生成模乘的模数 m ,这里要确保
其次,我们选择模乘的乘数 w,作为私钥并且确保
之后,我们便可以通过如下公式生成公钥
并将这个新的背包集 bi (伪装超递增背包)和 m 作为公钥。

加密

假设我们要加密的明文为 v,其每一个比特位为 vi,那么我们加密的结果为
加密例子:
notion image

解密

对于解密方,首先可以求的w 关于 m 的逆元 
然后我们可以将得到的密文乘以  即可得到明文,这是因为
这里
对于每一块的加密的消息都是小于 m 的(,所以求得结果自然也就是明文了。
notion image

🐾代码

获得私钥
🎈
ai > sum(b), 可以看出b是一个超递增序列;q为模数且为素数,大于b中最大元素, r是乘数
获得公钥
🎈
公钥序列a:
加密
assert这行保证明文msg转二进制串比公钥长度小 此处即为上文所说的
只不过此时 m1 到 mi 是从低位到高位
解密

👝安全性

在超递增背包中,每项值一般为200~400位。模数一般为100 ~ 200位。该算法在实际使用中,用随机序列发生器来产生这些值。

背包相关题型

r,q,私钥未知

记已知的公钥数组为 pk ,加密后的结果为 enc ,则可以构造
notion image
LLL算法破解
notion image
notion image
notion image
脚本
 

🤔总结

 
👉
待练习
2020密码数学挑战赛第三题
 
📎 参考
 
日常学习
Crypto RSA中的数学技巧流密码
目录