背包加密系统

背包问题

假定一个背包可以承重 W,现在有 n 个物品,其重量分别为a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1​,a2​,a3​,...,an​, 问装哪些物品可以恰好使得背包装满,并且每个物品只能被装一次。背包问题其实就是在解这样的一个问题:

x1a1+x2a2+x3a3+...+xnan=Wx_1a_1 + x_2a_2 + x_3a_3 + ... + x_na_n = Wx1​a1​+x2​a2​+x3​a3​+...+xn​an​=W

其中所有的 xix_ixi​ 只能为 0 和 1。显然我们必须枚举所有的 n 个物品的组合才能解决这个问题,而复杂度也就是 2n,这也就是背包加密的妙处所在。

在加密时,如果我们想要加密的明文为 xxx,那么我们可以将其表示为 n 位二进制数,然后分别乘上 aia_iai​ 即可得到加密结果。

但是解密的时候,该怎么办呢?我们确实让其他人难以解密密文,但是我们自己也确实没有办法解密密文。

但是当是超递增的话,我们就有办法解了,所谓超递增是指序列满足如下条件:

ai>∑k=1i−1aka_i > \sum_{k=1}^{i-1}{a_k} ai​>k=1∑i−1​ak​

即第 iii 个数大于前面所有数的和。

超递增背包问题的解很容易找到,我们可以计算其总量并与背包序列中最大的数比较,如果总重量小于这个数,则它不在背包中;如果总重量大于这个数,则它在背包中。背包重量减去这个数,进而考察序列中下一个最大的数,重复直到结束。

但是,这样又出现了一个问题,由于 aia_iai​ 是公开的,如果攻击者截获了密文,那么它也就很容易去破解这样的密码。为了弥补这样的问题,就出现了 Merkle–Hellman 这样的加密算法。

Merkle–Hellman

公私钥生成

生成私钥

私钥就是我们的初始的背包集,这里我们使用超递增序列,怎么生成呢?我们可以假设 a1=1a_1 = 1a1​=1,那么 a2a_2a2​ 大于 1 即可,类似的可以依次生成后面的值。

生成公钥

在生成公钥的过程中主要使用了模乘的运算。

首先,我们生成模乘的模数 mmm,这里要确保

m>∑i=1i=naim > \sum_{i=1}^{i=n}{a_i}m>i=1∑i=n​ai​

其次,我们选择模乘的乘数 www,作为私钥并且确保

gcd(w,m)=1gcd(w,m) = 1gcd(w,m)=1

之后,我们便可以通过如下公式生成公钥

bi=waimodmb_i = wa_i \mod mbi​=wai​modm

并将这个新的背包集 bib_ibi​ 和 mmm 作为公钥。

加解密

加密

假设我们要加密的明文为 v,其每一个比特位为 viv_ivi​ ,那么我们加密的结果为

m>∑i=1i=nbivimodmm > \sum_{i=1}^{i=n}{b_iv_i\mod m}m>i=1∑i=n​bi​vi​modm

解密

对于解密方,首先可以求的 www 关于 mmm 的逆元 w−1w^{-1}w−1。

然后我们可以将得到的密文乘以 w−1w^{-1}w−1 即可得到明文,这是因为

∑i=1i=nw−1bivimodm=∑i=1i=naivimodm\sum_{i=1}^{i=n}{w^{-1}b_iv_i\mod m} = \sum_{i=1}^{i=n}{a_iv_i\mod m}i=1∑i=n​w−1bi​vi​modm=i=1∑i=n​ai​vi​modm

这里有

bi≡waimodmb_i \equiv wa_i \mod mbi​≡wai​modm

对于每一块的加密的消息都是小于 m 的,所以求得结果自然也就是明文了。

破解

该加密体制在提出后两年后该体制即被破译,破译的基本思想是我们不一定要找出正确的乘数 w(即陷门信息),只需找出任意模数 m′m^′m′ 和乘数 w′w^′w′,只要使用 w′w^′w′ 去乘公开的背包向量 B 时,能够产生超递增的背包向量即可。

Example

题目来源:Dest0g3 Crypto Bag

题目代码:

import gmpy2
from Crypto.Util.number import *
from secret import flagmessage = bytes_to_long(flag[8:-1])
Baglenth=286
Bag=[]
Bag=Bag[::-1]
m=372992427307339981616536686110115630075342113098010788080347982669869622759400031649792
w=274062421102700155372289583695782343443
assert gmpy2.gcd(m,w)==1
h=0
j=0
if m.bit_length()%2==0:h=m.bit_length()j=int(h//2)
else:h=m.bit_length()j=int(h//2+1)
def pad(m,lenth):while len(m)<lenth:m='0'+mreturn m
def keygen():pk=[]sk=[]sk.append(m)sk.append(int(gmpy2.invert(w,m)))D=[]binD=[]for i in range(Baglenth):di=(w*Bag[i])%mD.append(di)bindi=bin(di)[2:]bindi=pad(bindi,h)binD.append(bindi)U=[]V=[]for i in range(Baglenth):tempu=int(str(binD[i][:j]),2)U.append(tempu)tempv=int(str(binD[i][j:]),2)V.append(tempv)e=gmpy2.next_prime(sum(V))+2f=gmpy2.next_prime(sum(U))assert gmpy2.gcd(e,f)==1sk.append(int(e))sk.append(int(f))for i in range(Baglenth):ai=e*U[i]+f*V[i]pk.append(int(ai))return pk,sk
Pk,Sk=keygen()
print(Pk)
print(Sk)
def Encrypt(plain,pk):mbin=bin(plain)[2:]c=0mbin=pad(mbin,Baglenth)for i in range(Baglenth):c=c+int(mbin[i])*pk[i]return c
c=Encrypt(message,Pk)
print(c)

使用LLL(Lenstra-Lenstra-Lovász)格基约化算法求解:

pubKey = []
nbit = len(pubKey)
encoded = 1475864207352419823225329328555476398971654057144688193866218781853021651529290611526242518
A = Matrix(ZZ, nbit + 1, nbit + 1)
for i in range(nbit):A[i, i] = 1
for i in range(nbit):A[i, nbit] = pubKey[i]
A[nbit, nbit] = -int(encoded)res = A.LLL()
for i in range(0, nbit + 1):M = res.row(i).list()flag = Truefor m in M:if m != 0 and m != 1:flag = Falsebreakif flag:print(i, M)M = ''.join(str(j) for j in M)M = M[:-1]M = hex(int(M, 2))[2:]print(bytes.fromhex(M))

参考链接

背包加密 - CTF Wiki
密码学——公钥密码体系之背包算法1 - 哔哩哔哩
Dest0g3 520迎新赛 | Lazzaro

密码学之背包加密系统(Merkle–Hellman公钥加密算法)原理相关推荐

  1. 什么是AES加密?详解AES加密算法原理流程

    在密码学中,加密算法分为双向加密和单向加密.单向加密包括MD5.SHA等摘要算法,它们是不可逆的.双向加密包括对称加密和非对称加密,对称加密包括AES加密.DES加密等.双向加密是可逆的,存在密文的密 ...

  2. 报文加解密原理_加密系统的组成与过程

    加密系统的组成与过程 来源:超时代软件     更新时间:2018年11月28日 18:16:55 数据库透明加密就是把数据信息即明文转换为不可辨识的形式即密文的过程,目的是使不应了解该数据信息的人不 ...

  3. merkle-hellman背包算法 java_浅析几种公钥密码体制-RSA;Merkle-Hellman、背包加密体制、ECC优缺点...

    自从公钥密码体制被提出以来,出现了许多公钥密码方案 如RSA.ELGamal密码体制.背包算法和ECC.XTR.NTRU等. 下面就介绍一下各种密码体制的优缺点,并进行比较. 2RSA 在Diffie ...

  4. 【密码学】Java课设-文件加密系统(适用于任何文件)

    Java实现文件加密解密 前言 一.密码学入门 1.对称加密 2.非对称加密 二.程序代码 1.welcome类(欢迎界面) 2.Log类(登录界面) 3.Register类(注册界面) 4.Inde ...

  5. 现代密码学:加密系统五元组

    文章目录 密码学的相关概念 密码学加密系统的五元组 密码学基础 密码学的相关概念 密码学分类: (1)密码编码学 密码分析学:研究如何分析或破解各种密码编码体制的一门科学 (2)密码分析也称为密码破译 ...

  6. 现代密码学--结课论文---《70年代公钥传奇》

    摘要:在70年代之前,密码学主要被军方用于通信保护.密码学的主要研究也是由情报机构(GCHQ.NSA等)或IBM等企业运营的获得许可的实验室中进行.这时公众几乎无法获得密码学知识,直到由三位密码学家H ...

  7. 密码学之RSA加密原理解析

      密码学是指研究信息加密,破解密码的技术科学.密码学的起源可追溯到2000年前.而当今的密码学是以数学为基础的.   密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报, ...

  8. C#毕业设计——基于C#+asp.net+C++的RSA文件加密系统设计与实现(毕业论文+程序源码)——RSA文件加密系统

    基于C#+asp.net+C++的RSA文件加密系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+C++的RSA文件加密系统设计与实现,文章末尾附有本毕业设计的论文 ...

  9. 机顶盒加密系统流程 ECM EMM CW SK

    随着数字视频广播(DVB)的发展,观众会面对越来越多的数字电视节目的选择.而广播业者由于投资成本的增加,则要求对用户收取一定的收视费用.条件接收系统(Conditional Access System ...

最新文章

  1. 如何使用ggplot2绘制左右分布的柱状图
  2. ReentrantLock与公平锁、非公平锁实现
  3. java bmp_JAVA实现对BMP图片的读取
  4. java lombok
  5. Docker仓库搭建
  6. Python基础之(面向对象初识)
  7. 不同映射方式下cache的失效率_详解发动机在不同工况下的喷油量控制方式
  8. SQL Server 2005/2008 导入导出数据常见报错
  9. [转载] python中if嵌套语句_Python的if语句怎么嵌套
  10. vue中 点击二维码刷新图片(src不变)
  11. 7 ida pro 网盘_7月上市新车汇总 日产轩逸领衔 自主高端红旗HS7最具潜力
  12. Android Studio实现多媒体播放器,音乐视频一体化
  13. 通俗易懂奈奎斯特定理和香农定理
  14. vue 音乐进度条拖拽
  15. matlab 使用 audioread 、 sound 读取和播放 wav 文件
  16. GUI小工具-网盘搜索器
  17. 介绍几本学习Tkinter的书籍
  18. 周伯通的空明拳,米诺斯的星尘傀儡线,SAP Kyma的Serverless
  19. 活在当下不等于及时行乐
  20. Android Jetpack架构组件(一)带你了解Android Jetpack

热门文章

  1. 图数据库入门教程-深入学习Gremlin(1):图基本概念与操作
  2. 史上最强鸿蒙教程来袭!跟Android初学者分享几点经验,专题解析
  3. Dispatch I/O
  4. 音频视频点播收费在线观看系统网站小程序app开发建设
  5. 基于Android+Python Flask框架实现的智慧记单词APP设计
  6. 【方块消除】(附加工程)
  7. SASS _ 入门版
  8. 如何快速实现抖音分享与第三方登录?
  9. cpu怎么开启php,cpu怎么换
  10. 《Java程序小作业之自动贩卖机》#谭子