流密码简单介绍

 #流密码:
#逐字节或逐比特处理数据
#密钥长度会与明文的长度相同
#密钥派生自一个较短的密钥,派生算法通常为一个伪随机数生成算法
#关键在于设计好的伪随机数生成器
#统计特征被覆盖的非常好

#常见的流密码:反馈移位寄存器
#初态 a0,a1
#加密方式:线性 非线性
#状态转换 ai+n=F(a1,a2,an-1)


#线性反馈移位寄存器(LFSR)
def lfsr(R,mask):
    output = (R << 1) & 0xffffffff #左移一位
    i = ( R & mask) & 0xffffffff
    lastbit = 0
    while i != 0:
        lastbit ^= (i & 1)  #lastbit 异或i的最后一位
        i = i >> 1
    output ^= lastbit #lastbit为i的mask为1位的所有异或结果
    print ('output: ' + bin(output))
    return output,lastbit


#截取,以二进制读取
flag="1923701100110110105"

R = int(flag[5:-1],2)
key = [85,56,247,66,193,13,178,199,237,224,36,58]
#12位
mask = 0b1010011000100011100
#19位
for k in range(2**19):
    R = k
    a = ''
    judge = 1
    for i in range(12):
        tmp = 0
        for j in range(8):
            (k,out) = lfsr(k, mask)
            tmp = (tmp << 1)^out
        if(key[i] != tmp):
            judge = 0
            break
    if(judge == 1):
        print('flag{'+bin(R)[2:]+'}')
        break
        
#flag{1110101100001101011}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值