diff --git a/rainbowTable.py b/rainbowTable.py new file mode 100644 index 0000000..290e95a --- /dev/null +++ b/rainbowTable.py @@ -0,0 +1,199 @@ +import hashlib,binascii +import tkinter as tk +import tkinter.messagebox +import tkinter.ttk +import sys +import keyboard +import time +from multiprocessing import Pool +g = ['!','@','#','$','%','^','&','*','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'] +Z=10**8 +l1=20 +checkPointHeavy=[0.0416,0.0855,0.1316,0.2318,0.2870,0.4117,0.5684,0.7381] +checkpoint=[] +for i in checkPointHeavy: + if int(i*l1) not in checkpoint: + checkpoint.append(int(i*l1)) +rainbowTableSum=20 +rainbowTable= {} +rainbowTables=[] +coefficient=[] +coefficientCheckPoint='' + +win=tk.Tk() +win.title('彩虹表破解程序') +win.geometry('400x400') +entry=tk.Entry(win,width=50) +entry.place(x=20,y=100) +cobox=tkinter.ttk.Combobox(win) +cobox.place() +cobox['value']=('NTLM','sha256') +cobox.place(x=20,y=20) +def NTLMOrSha256(str,mode): + if mode==0: + return binascii.hexlify(hashlib.new('md4', str.encode('utf-16le')).digest()) + elif mode==1: + return binascii.hexlify(hashlib.new('sha256',str.encode('utf-8')).digest()) +def R(x,i,r,l2): + x=int(x.decode(),16) + x+=i + x=str(hex(x))[2:] + str1='' + for j in range(l2): + x1=(int(x[j%len(x)],16)+int(x[(j+l2)%len(x)],16)+Z//(i+1)+r)%len(g) + str1+=g[x1] + return str1 +def select(lenth): + f=open('rockyou1.txt','r') + list1=list(f.read().split('\n')) + f.close() + coefficient=[] + for i in list1: + if len(i)==lenth: + coefficient.append(i) + return coefficient +def createRainbowTableProcess(*cRTP): + dic=cRTP[0][0] + st=cRTP[0][1] + r=cRTP[0][2] + rs=cRTP[0][3] + mode=cRTP[0][4] + for t in st: + dic[t] = '' + x = t + j = 0 + coefficientCheckPoint = '' + for i in range(l1): + x = NTLMOrSha256(x,mode) + if i == int(checkpoint[j]): + coefficientCheckPoint += str(int(x.decode(), 16) & 1) + j = (j + 1) % len(checkpoint) + x = R(x, i + 1, r, rs) + c = int(coefficientCheckPoint, 2) + if c <= 15: + x = x[:-2] + '0' + hex(c)[2:] + else: + x = x[:-2] + hex(int(coefficientCheckPoint, 2))[2:] + dic[t] = x + dic_key=list(dic.keys()) + dic_value=list(dic.values()) + return dic_key,dic_value +def createRainbowTable(): + if cobox.get()!='NTLM': + mode=1 + else: + mode=0 + pool = Pool() + global coefficientCheckPoint + rs=5 + #表头输入 + st=select(rs) + while st!=[]: + rainbowTable={} + for r in range(rainbowTableSum): + dic = {} + if r!=0: + st=list(rainbowTable[r-1].values()) + args=([dic,st,r,rs,mode],) + returnDic=pool.map(createRainbowTableProcess,args) + returnDic=dict(zip(returnDic[0][0],returnDic[0][1])) + rainbowTable[r]=returnDic + rainbowTables.append(rainbowTable) + rs+=1 + st = select(rs) + pool.close() + pool.join() + returnDict[0]=rainbowTables + returnDict[1]=mode +def useRainbowTableProcess(*uRTP): + key=uRTP[0][0] + value=uRTP[0][1] + inputValue=uRTP[0][2] + mode=uRTP[0][3] + returntutle=[] + for k_value, v_value in value.items(): + for i in range(l1, 0, -1): + coefficientCheckPoint = '' + + for execR in range(l1 + 1 - i): + if execR == 0: + inputValue1 = R(inputValue, i + execR, key, len(k_value)) + if i + execR - 1 in checkpoint: + coefficientCheckPoint += str(int(inputValue.decode(), 16) & 1) + else: + inputValue1 = NTLMOrSha256(inputValue1,mode) + if i + execR - 1 in checkpoint: + coefficientCheckPoint += str(int(inputValue1.decode(), 16) & 1) + inputValue1 = R(inputValue1, i + execR, key, len(k_value)) + if i==1 and len(k_value)==6: + pass + if inputValue1[:-2] == v_value[:-2]: + if len(coefficientCheckPoint) and int(bin(int(v_value[-2:], 16))[2:].zfill(8)[0-len(coefficientCheckPoint):],2) != int(coefficientCheckPoint, 2): + continue + returntutle.append((k_value, i - 1, key)) + return returntutle + +def useRainbowTable(rainbowTables,mode): + inputValue = entry.get().rstrip() + inputValue = inputValue.encode() + returnValues=[] + returnValue=[] + pool=Pool() + global coefficientCheckPoint + for table in rainbowTables: + for key,value in table.items(): + args = ([key, value, inputValue,mode],) + returnValues.append(pool.map(useRainbowTableProcess,args)) + for i in returnValues: + if i[0]!=[]: + for j in i: + returnValue.append(j) + pool.close() + pool.join() + if returnValue != []: + t = 1 + for i in returnValue: + rainbowtop,location,judgetable = i[0][0], i[0][1], i[0][2] + length = len(rainbowtop) + for i in range(location): + rainbowtop = NTLMOrSha256(rainbowtop, mode) + rainbowtop = R(rainbowtop, i + 1, judgetable, length) + decyptstr=rainbowtop + decyptstr_NTLM=str(NTLMOrSha256(rainbowtop, mode))[2:-1] + if decyptstr_NTLM == inputValue: + tkinter.messagebox.showinfo(title='提示信息', message=decyptstr) + t = 0 + if t: + print("破解失败!这可能是由于输入的hash值不一致导致的") + else: + print("破解失败!") +returnDict = {} +def main(): + + btn1 = tk.Button(win, text='创建彩虹表', command=lambda: createRainbowTable()) + btn1.place(x=260, y=98) + # rainbowTableFile=open('rainbowtable.txt','w') + # count=0 + # for i in returnDict[0]: + # for j in i: + # for k in i[j]: + # rainbowTableFile.write(str(k)+':'+str(i[j][k])+'\t') + # count = (count+1)%5 + # if count==4: + # rainbowTableFile.write('\n') + + btn=tk.Button(win,text='破解',command=lambda :useRainbowTable(returnDict[0],returnDict[1])) + btn.place(x=360,y=98) + win.mainloop() +if __name__=='__main__': + main() + + + + + + + + + +