1.NLFSR:
在ctf-wiki中我们可以找到一种对NLFDSR的攻击方法——https://wiki.x10sec.org/crypto/streamcipher/fsr/nfsr/。由于对多个LFSR组合时不能实现均匀混合吗,我们可以发现有的值和最后结果相近,我们可以据此对NLFSR中的部分LFSR进行爆破。最后我们可以对剩下的LFSR进行爆破。首先我们可以根据多个LFSR组合判断哪些LFSR爆破。
ass=0
bs=0
cs=0
ds=0
print "%s,%s,%s,%s,%s"%("ao","bo","co","do","re")
for i in xrange(0b10000,0b100000):
ao=int(bin(i)[-4],10)
bo=int(bin(i)[-3],10)
co=int(bin(i)[-2],10)
do=int(bin(i)[-1],10)
re=(ao*bo) ^ (bo*co) ^ (bo*do) ^ co ^ do
print "%d,%d,%d,%d,%d"%(ao,bo,co,do,re)
if ao==re:
ass=ass+1
if bo==re:
bs=bs+1
if co==re:
cs=cs+1
if do==re:
ds=ds+1
print "%d,%d,%d,%d"%(ass,bs,cs,ds)
我们发现结果中a和最后结果有75%相似,我们首先对a进行爆破。
def lfsr(r, m): return ((r << 1) & 0xffffff) ^ (bin(r & m).count('1') % 2)
def guess(beg, end, num, mask):
f=open('data','r')
data = f.read()[:1600]
f.close()
now = 0
res = 0
for i in range(beg, end):
r = i
cnt = 0
jie=0
for j in range(num * 8):
r = lfsr(r, mask)
lastbit=r & 1
if lastbit == int(data[j],10):
cnt=cnt+1
if cnt > now:
now=cnt
res = i
print cnt, res
return res
guess(pow(2,18),pow(2,19),100,0x505a1)
我们发现a=363445时,a所对应的lfsr和总的nlfsr结果有接近75%类似,我们已将a猜出,接下来我们观察之前的结果发现当a为1时,b所对应的lfsr和总的nlfsr结果有接近75%类似,当a为0时,b所对应的lfsr的反和总的nlfsr结果有接近75%类似。由于a已经确定,我们借助a爆破b
def lfsr(r, m): return ((r << 1) & 0xffffff) ^ (bin(r & m).count('1') % 2)
def guess(beg, end, num, mask):
f=open('data','r')
data = f.read()[:800]
f.close()
now = 0
res = 0
for i in range(beg, end):
r = i
cnt = 0
a=363445
for j in range(num * 8):
r = lfsr(r, mask)
a = lfsr(a, 0x505a1)
lastbit=r & 1
alastbit = a & 1
if alastbit==1 and lastbit == int(data[j],10):
cnt=cnt+1
if alastbit==0 and lastbit != int(data[j],10):
cnt=cnt+1
if cnt > now:
now = cnt
res = i
print now, res
return res
guess(pow(2,18),pow(2,19),100,0x40f3f)
我们得到b是494934,剩下的c和d可以直接爆破获得
def lfsr(r, m): return ((r << 1) & 0xffffff) ^ (bin(r & m).count('1') % 2)
a=363445
b=494934
ma, mb, mc, md = 0x505a1, 0x40f3f, 0x1f02, 0x31
f=open('data','r')
data = f.read()[:800]
f.close()
for ha in range(pow(2,12),pow(2,13)):
for hah in range(pow(2,5),pow(2,6)):
c=ha
d=hah
flag = True
a=363445
b=494934
for j in xrange(30 * 8):
a = lfsr(a, ma)
b = lfsr(b, mb)
c = lfsr(c, mc)
d = lfsr(d, md)
[ao, bo, co, do] = [i & 1 for i in [a, b, c, d]]
lastbit=(ao*bo) ^ (bo*co) ^ (bo*do) ^ co ^ do
if not str(lastbit)== data[j]:
#print j
flag = False
break
if flag:
print "c is %d,d is %d"%(ha,hah)
2.ECDH
这是在之前JWE上的一个漏洞,在题目中我们发现在重新输入公钥时没有检测公钥所对应点是否在原先的椭圆曲线上。而无论在点的加法还是乘法都不涉及b,所以我们可以选择一个不在椭圆曲线上的点改变椭圆曲线以降低密钥的阶。然而我们使用多组密钥构成多组同余方

本文深入探讨了非线性反馈移位寄存器(NLFSR)的破解方法,通过分析组合线性反馈移位寄存器(LFSR)的输出特性,提出了一种有效的爆破策略。同时,文章还介绍了ECDH协议中的漏洞利用及解决思路,以及RSA算法在特定条件下的破解技巧,最后讨论了同态加密原理及其应用。
最低0.47元/天 解锁文章
2114





