破解基本的 Merkle-Hellman 密码系统的多项式时间算法

本来想在网上找一些破译背包加密的脚本,结果没找到,那就只能自己写。既然这样,那总要知道是怎么破译的吧。于是把Shamir大神的论文—《A polynomial time algorithm for breaking the basic Merkle-Hellman cryptosystem》花了几天看完了,做了翻译,有些地方加上自己的理解,认真看应该能看懂。

不想再打一遍了,我就直接贴图了。

上面毕竟是破译的一个非正式描述,好好理解几遍之后(只是我的理解,可能不完全准确),我举个例子来说明破译过程。

私钥A^{'}=[12,17,47,79],M=181,U=73,W=62=U^{-1} \bmod M;生成公钥A=[152,155,173,156],这里n=4,d=2

破译算法的第一步:找[p/a_{1},(p+1)/a_{1})pW,M是陷门对的必要条件是W/M \in [p/a_{1},(p+1)/a_{1});这样的p求解的思路在论文中如下处:

也就是说,我们要找的p具有一个性质:对其他的a_{i}(i=2,...,n)p \cdot a_{i} mod a_{1}都很小,具体的界见上。这里我用一个python脚本来筛选一下p,但是并未用论文中提到的Lenstra整数规划算法寻找。

A=[152,155,173,156]
lenA=len(A)
blockb=[16,32,64,128]
blocke=[240,224,192,128]
tmp=0
for i in range(1,A[0]):
    tmp=0
    for j in range(1,lenA):
        delta=(A[j]*i)%A[0]
        if delta>blockb[j] and delta<blocke[j]:
            tmp=1
    if tmp-1:
        print i

通过这种性质选出p=1,2,3,8,9,10,51,52,53,58,59,60,102,103,104,109,110,111,可以验证W/M=62/181 \in [52/a_{1},53/a_{1}],而52果然在候选的p中。p的可候选值的数量从151迅速下降到18,算法第一步到此结束。

再看算法的第二步:在第一步选出的[p/a_{1},(p+1)/a_{1})进行分析,通过前l个锯齿曲线的间断点将[p/a_{1},(p+1)/a_{1})分成若干个子区间,然后在这些子区间上,看是否有满足超递增条件且模数大于所有超递增序列之和的解,也就是论文的如下处:

超递增条件与模数大于所有超递增序列之和分别对应第2,3个不等式。对所有的[p/a_{1},(p+1)/a_{1}),它的每个子区间[V_{t},V{t+1}),求解满足第2,3个不等式的解(在有的子区间上有可能为空)。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值