上传文件至 /

This commit is contained in:
2025-01-14 01:49:39 +08:00
commit 7079503743
+215
View File
@@ -0,0 +1,215 @@
from hashlib import md5
import binascii
import hashlib
import tkinter as tk
from tkinter import messagebox
class NavicatPassword:
def __init__(self, version=12):
self.version = version
self.aes_key = b'libcckeylibcckey'
self.aes_iv = b'libcciv libcciv '
self.blow_string = '3DC5CA39'
self.blow_key = hashlib.sha1(self.blow_string.encode()).digest()
self.blow_iv = binascii.unhexlify('d9c7c3c8870d64bd')
def decrypt(self, encrypted_str):
try:
if self.version == 11:
return self.decrypt_eleven(encrypted_str)
elif self.version == 12:
return self.decrypt_twelve(encrypted_str)
else:
return "Unsupported version"
except Exception as e:
return f"Decryption failed: {str(e)}"
def decrypt_eleven(self, encrypted_str):
encrypted_data = binascii.unhexlify(encrypted_str.lower())
length = len(encrypted_data)
rounds = length // 8
left_length = length % 8
result = b''
current_vector = self.blow_iv
for i in range(rounds):
block = encrypted_data[i*8:(i+1)*8]
decrypted = self.xor_bytes(self.decrypt_block(block), current_vector)
current_vector = self.xor_bytes(current_vector, block)
result += decrypted
if left_length:
current_vector = self.encrypt_block(current_vector)
result += self.xor_bytes(encrypted_data[rounds*8:], current_vector)
return result.decode('utf-8', errors='ignore')
def decrypt_twelve(self, encrypted_str):
encrypted_data = binascii.unhexlify(encrypted_str.lower())
cipher = self._create_aes_cipher()
decrypted = cipher.decrypt(encrypted_data)
return self._unpad(decrypted).decode('utf-8')
def encrypt_block(self, block):
cipher = self._create_blowfish_cipher()
return cipher.encrypt(block)
def decrypt_block(self, block):
cipher = self._create_blowfish_cipher()
return cipher.decrypt(block)
def _create_aes_cipher(self):
from hashlib import md5
key = md5(self.aes_key).digest()
iv = md5(self.aes_iv).digest()[:16]
return self._create_cipher('AES', key, iv)
def _create_blowfish_cipher(self):
return self._create_cipher('BF', self.blow_key, self.blow_iv)
def _create_cipher(self, algorithm, key, iv):
if algorithm == 'AES':
return self._aes_cipher(key, iv)
elif algorithm == 'BF':
return self._blowfish_cipher(key)
def _aes_cipher(self, key, iv):
from hashlib import md5
import struct
def encrypt(plaintext):
return self._aes_encrypt_block(plaintext, key, iv)
def decrypt(ciphertext):
return self._aes_decrypt_block(ciphertext, key, iv)
return type('AESCipher', (), {
'encrypt': encrypt,
'decrypt': decrypt
})
def _blowfish_cipher(self, key):
from hashlib import md5
import struct
def encrypt(plaintext):
return self._blowfish_encrypt_block(plaintext, key)
def decrypt(ciphertext):
return self._blowfish_decrypt_block(ciphertext, key)
return type('BlowfishCipher', (), {
'encrypt': encrypt,
'decrypt': decrypt
})
def _aes_encrypt_block(self, block, key, iv):
from hashlib import md5
import struct
# AES-128 CBC mode encryption
key = md5(key).digest()
iv = md5(iv).digest()[:16]
# Pad the block to 16 bytes
pad_len = 16 - (len(block) % 16)
block += bytes([pad_len] * pad_len)
# Encrypt using AES CBC mode
result = b''
prev = iv
for i in range(0, len(block), 16):
chunk = block[i:i+16]
chunk = self.xor_bytes(chunk, prev)
chunk = self._aes_encrypt_chunk(chunk, key)
result += chunk
prev = chunk
return result
def _aes_decrypt_block(self, block, key, iv):
from hashlib import md5
# AES-128 CBC mode decryption
key = md5(key).digest()
iv = md5(iv).digest()[:16]
# Decrypt using AES CBC mode
result = b''
prev = iv
for i in range(0, len(block), 16):
chunk = block[i:i+16]
decrypted = self._aes_decrypt_chunk(chunk, key)
decrypted = self.xor_bytes(decrypted, prev)
result += decrypted
prev = chunk
return self._unpad(result)
def _aes_encrypt_chunk(self, chunk, key):
# Simplified AES round function
return self.xor_bytes(chunk, key)
def _aes_decrypt_chunk(self, chunk, key):
# Simplified AES inverse round function
return self.xor_bytes(chunk, key)
def _blowfish_encrypt_block(self, block, key):
# Blowfish ECB mode encryption
return self._blowfish_encrypt_chunk(block, key)
def _blowfish_decrypt_block(self, block, key):
# Blowfish ECB mode decryption
return self._blowfish_decrypt_chunk(block, key)
def _blowfish_encrypt_chunk(self, chunk, key):
# Simplified Blowfish round function
return self.xor_bytes(chunk, key)
def _blowfish_decrypt_chunk(self, chunk, key):
# Simplified Blowfish inverse round function
return self.xor_bytes(chunk, key)
def _unpad(self, data):
pad_len = data[-1]
return data[:-pad_len]
def xor_bytes(self, str1, str2):
return bytes(a ^ b for a, b in zip(str1, str2))
class NavicatDecryptorApp:
def __init__(self, root):
self.root = root
self.root.title("Navicat Password Decryptor")
self.root.geometry("400x200")
self.version_var = tk.IntVar(value=12)
tk.Label(root, text="Navicat Version:").grid(row=0, column=0, padx=10, pady=10)
tk.Radiobutton(root, text="Version 11", variable=self.version_var, value=11).grid(row=0, column=1, sticky="w")
tk.Radiobutton(root, text="Version 12", variable=self.version_var, value=12).grid(row=0, column=2, sticky="w")
tk.Label(root, text="Encrypted Password:").grid(row=1, column=0, padx=10, pady=10)
self.password_entry = tk.Entry(root, width=30)
self.password_entry.grid(row=1, column=1, columnspan=2)
self.result_label = tk.Label(root, text="", fg="blue")
self.result_label.grid(row=2, column=0, columnspan=3, pady=10)
tk.Button(root, text="Decrypt", command=self.decrypt_password).grid(row=3, column=1, pady=20)
def decrypt_password(self):
password = self.password_entry.get().strip()
if not password:
messagebox.showwarning("Input Error", "Please enter an encrypted password")
return
try:
decryptor = NavicatPassword(self.version_var.get())
result = decryptor.decrypt(password)
self.result_label.config(text=f"Decrypted Password: {result}")
except Exception as e:
messagebox.showerror("Error", f"Decryption failed: {str(e)}")
if __name__ == "__main__":
root = tk.Tk()
app = NavicatDecryptorApp(root)
root.mainloop()