某些TP-LINK路由器登录密码加密方式研究,Python找所有密码集合

1.先说结论:

        1,在密码组合是数字大小写字母的情况下。加密有截断作用,7-13位密码及16位以上没有其它长度的密码,13-15位有少量其它长度的密码。就是随着密码越长,密码组合也越多,但有长度限制。从下表中一定有你的密码

可以百度搜索10秒破某tp路由。你会更好理解。如:

此密码 66ULYn 的密文为: H4H1dqhc9TefbwK 长度为 6 位
此密码长度小于13位,没有比它长的密码。
此密码长度等于 6 位长度的密文的密码有: 240 个,总共有 240 个密码. 集合为: 
 ['6Mw', '6orWz', 'oU', 'Ly', 'uY', 'nz'] 结束!

当您密码为66ULYn,以上集合任意组合密码都能登录您的路由器,很神奇吧。这就是加密算法带来的小漏洞。代码后面给出,会自动生成上面的表格。

本人小白。如有错误,欢迎批判。希望对你的密码爆破有帮助!

2.过程及实现代码:

tp-link 登录提交方式

  • POST {"method":"do","login":{"password":"WbZ6onhc9TefbwK"}}
  • 路由器加密代码:
  • short = "RDpbLfCPsJZ7fiv"
    
    # a
    Lng = 'yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW'
    
    
    # c
    #PawD = '123456@...'
    PawD = 'd52533'
    
    # b
    # ord与JS的charCodeAt方法类似,返回指定位置的字符的 Unicode 编码
    
    def encrypt_passwd(a, b, c):
        e = ''
        f, g, h, k, l = 187, 187, 187, 187, 187
        n = 187
        g = len(a)
        h = len(b)
        k = len(c)
        if g > h:
            f = g
        else:
            f = h
    
        for p in list(range(0, f)):
            n = l = 187
            if p >= g:
                n = ord(b[p])
            else:
                if p >= h:
                    l = ord(a[p])
                else:
                    l = ord(a[p])
                    n = ord(b[p])
            e += c[(l ^ n) % k]
    
        #print (e)
        return e
    
    
    
    pw=encrypt_passwd(short, PawD, Lng)

    Python代码:

  • 
    import pandas as pd
    import os
    
    
    class Getmmjh:
        short = "RDpbLfCPsJZ7fiv"
        # a
        Lng = 'yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW'
        # c
        lns = len(Lng)
        my = '012345hc9TefbwK'
    
        def __init__(self, mima):
            self.mima = mima
    
        #获取密码集合
        def get_pddata(self):  # 定义实例方法
            short=self.short
            Lng=self.Lng
            new_s = list(set(Lng))  # 转换为集合再转换为列表
            Lng = "".join(set(new_s))
    
            if os.path.exists('./mmjh.csv'):
                df = pd.read_csv('mmjh.csv', index_col=0)
                #print(df)
                return df
    
            else:
                ls=[]
                for s in short:#s为列名
                    dic ={}
                    for k in Lng:# k为行名
                        l = ord(s)
                        st = self.jisuan(l,k)
                        if st == '':
                            continue
                        dic[k]=st
                    df=pd.DataFrame(dic.values(),index=dic.keys(),columns=[s])
                    print(df,'\n','@@@@@@@@@@@@@@@@@@@@@@@@@@@')
                    ls.append(df)
                df=pd.concat(ls,axis=1,join='outer')
    
                df.to_csv('./mmjh.csv')
                return df
    
    
        def jisuan(self,l,word,n=1):
            Lng = self.Lng
            yy = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
            st = ''
            if l == 187:
                gg = (l ^ n) % self.lns
                for y in yy:
                    if Lng[gg] == word:
                        st += y
    
            else:
                for y in yy:
                    n = ord(y)
                    gg = (l ^ n) % self.lns
                    if Lng[gg] == word:
                        st += y
    
            return st
    
        def getpd(self,miwen,ml):
            df = self.get_pddata()
            short =self.short
            ls = []
            cj = 1
            if ml >15:
                ml=15
    
            for i in range(ml):
                n = short[i]
                m = miwen[i]
                st = df.loc[m, n]
    
    
                ls.append(st)
                cj *= len(st)
    
            return cj,ls
    
        # 计算比它长度还大的集合
        def dachang(self,miwen,ml,cj,ls):
            df = self.get_pddata()
            dcj = 1
            dls = []
            sm =0
            for k in range(15 - ml, 0, -1):
                m = miwen[-k]
                n = self.short[-k]
                st = df.loc[m, n]
                dcj *= len(st)
                dls.append(st)
                ls += dls
                cj *= dcj
                sm += cj
    
                print(16 - k, '位长度的密文的密码有:', cj, '个集合为:', '\n', ls)
    
                return sm
    
    
    
        # 计算比它长度还小的集合
        def xchang(self,miwen,ml,cj,ls):
            df = self.get_pddata()
            dcj = 1
            dls = ls
            sm = cj
            for i in range(ml - 17, -11, -1):
                m = miwen[i]
                if m == self.my[i]:
                    st = df.loc[m, self.short[i]]
                    dcj *= len(st)
                    dls.append(st)
                    dls += ls
                    cj *= dcj
                    sm += cj
    
                    print(16 + i, '位长度的密文的密码有:', sm, '个集合为:', '\n', dls)
                else:
    
                    print('此密码没有比', 16 + i, '位长度还短的密码!总共有', sm, '个密码.' ,'集合为:', '\n', ls, '结束!')
                    break
                if i == -10:
    
                    cj6,ls6 = self.getpd(miwen,6)
                    dls += ls6
                    sm += cj6
    
                    print('6位长度的密文的密码有:', sm, '个,总共有', sum, '个密码.','集合为:', '\n', ls, '结束!')
    
    
    
        # 加密方法
        def encrypt_passwd(self, b):#加密方法
            a=self.short
            c=self.Lng
            e = ''
            f, g, h, k, l = 187, 187, 187, 187, 187
            n = 187
            g = len(a)
            h = len(b)
            k = len(c)
            if g > h:
                f = g
            else:
                f = h
    
            for p in list(range(0, f)):
                n = l = 187
                if p >= g:#15
                    n = ord(b[p])
                else:
                    if p >= h:
                        l = ord(a[p])
                    else:
                        l = ord(a[p])
                        n = ord(b[p])
                e += c[(l ^ n) % k]
            # print (e)
            return e
    
        def mwei(self):
            mima = self.mima
            '''
            if not re.fullmatch(r'[a-z0-9]+', mima):
                print('密码不是数字或小字母,请重新输入密码!')
                return
            '''
            my = self.my
            miwen = self.encrypt_passwd(mima)
            ml = len(mima)
            print('此密码',mima,'的密文为:', miwen, '长度为', ml, '位')
    
            cj, ls = self.getpd(miwen, ml)
    
            if ml > 15:
                dcj = 1
                dls=[]
    
                for s in range(ml-15,0):
                    word = miwen[-s]
                    n = ord(word)
                    l = 187
                    st= self.jisuan(l,word,n)
                    dls.append(st)
                    dcj *=len(st)
    
                ls +=dls
                cj *= dcj
    
    
                print('此密码位数大于15,没有其它长度的密码。其中相同', ml, '位长度的密文的密码有:', cj, '个','集合为:', '\n', ls, '结束!')
    
    
            elif ml < 6:
                print('您的密码小于6位,请重新输入')
            else:
                while True:
                    nn = miwen[ml - 16]
    
                    #计算比它长度还大的集合
                    if ml >= 13:
                        sm = self.dachang(miwen, ml, cj, ls)
                    else:
                        print('此密码长度小于13位,没有比它长的密码。')
    
                    if ml == 6:
                        print('此密码长度等于', ml, '位长度的密文的密码有:', cj, '个,总共有', cj, '个密码.', '集合为:', '\n', ls, '结束!')
                        break
    
                    if nn != my[ml - 16]:
                        if ml <13:
                            print('此密码长度等于', ml, '没有比它还短的密码了。有相同长度密文的密码有', cj, '个密码.', '集合为:', '\n', ls, '结束!')
                        else:
                            print('此密码长度等于', ml, '没有比它还短的密码了。有相同长度密文的密码有', cj + sm, '个密码.','集合为:', '\n', ls, '结束!')
    
    
                        break
    
                    else:
                        print('此密码长度等于', ml, '有相同长度密文的密码有',  cj, '个密码.', '集合为:', '\n', ls)
                        if ml >=13:
                            cj +=sm
                        # 计算比它长度还小的集合
                        self.xchang(miwen, ml, cj, ls)
    
    
    
    
    if __name__ == "__main__":
    
        #数字或小写字母,不然会报错,除非您改进,修改yy = '0123456789abcdefghijklmnopqrstuvwxyz'
        PWD = '66ULYn'
        Getmmjh(PWD).mwei()
    
    '''
    #计算9-15位hc9TefbwK有没有数字或小写字母,只有长度为13-15时才有可能有
    yy = '0123456789abcdefghijklmnopqrstuvwxyz'
    Lng = 'yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW'
    yy2 = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz~!@#$%^&*()_+-=[]{}|;':\,.<>/?"
    short = "RDpbLfCPsJZ7fiv"
    ss = 'vUJLv7hc9TefbwK'
    for i in range(-9,0):
        e1=ss[i]
        s=''
        for k in yy:
            n = ord(k)
            l = ord(short[i])
            gg = (l ^ n) % 187
            e =Lng[gg]
    
            if e == e1:
                s +=k
        print('在',i,'位上有:',s)'''

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值