From 92019c76bcaef6f781c6202f059a4fe6c42b89f2 Mon Sep 17 00:00:00 2001 From: qianxiao996 <1919010193@qq.com> Date: Thu, 21 Jul 2022 16:40:01 +0800 Subject: [PATCH] v1.3.7 --- CTF-Tools.py | 3547 +++-------------- GUI/Binary.py | 48 - GUI/Cipher.py | 82 + GUI/KEY_2.py | 8 +- GUI/Xiandaimima.py | 38 +- GUI/__pycache__/Cipher.cpython-37.pyc | Bin 0 -> 2422 bytes GUI/__pycache__/KEY_2.cpython-37.pyc | Bin 1666 -> 1665 bytes GUI/__pycache__/Xiandaimima.cpython-37.pyc | Bin 4657 -> 4965 bytes GUI/__pycache__/main.cpython-37.pyc | Bin 20514 -> 23264 bytes GUI/main.py | 231 +- Plugins/__pycache__/filename.cpython-37.pyc | Bin 236 -> 404 bytes Plugins/filename.py | 27 +- QWidget_XiandaiMima.py | 57 + README.md | 40 +- .../QWidget_XiandaiMima.cpython-37.pyc | Bin 0 -> 2407 bytes __pycache__/frozen_dir.cpython-37.pyc | Bin 408 -> 408 bytes config.ini | 5 +- module/AutoGetFlag.py | 185 + module/Buddha.py | 83 + module/CipherAnalyse.py | 71 + module/__pycache__/AutoGetFlag.cpython-37.pyc | Bin 0 -> 4122 bytes .../__pycache__/CipherAnalyse.cpython-37.pyc | Bin 0 -> 2181 bytes module/__pycache__/aes_func.cpython-37.pyc | Bin 0 -> 3903 bytes module/__pycache__/binary_func.cpython-37.pyc | Bin 0 -> 4969 bytes module/__pycache__/decode_func.cpython-37.pyc | Bin 0 -> 32424 bytes .../__pycache__/decrypt_func.cpython-37.pyc | Bin 0 -> 11823 bytes module/__pycache__/encode.cpython-37.pyc | Bin 0 -> 22987 bytes module/__pycache__/encode_func.cpython-37.pyc | Bin 0 -> 22457 bytes .../__pycache__/encrypt_func.cpython-37.pyc | Bin 0 -> 10448 bytes module/__pycache__/func_aes.cpython-37.pyc | Bin 0 -> 4166 bytes module/__pycache__/func_binary.cpython-37.pyc | Bin 0 -> 5379 bytes module/__pycache__/func_decode.cpython-37.pyc | Bin 0 -> 36519 bytes .../__pycache__/func_decrypt.cpython-37.pyc | Bin 0 -> 22720 bytes module/__pycache__/func_encode.cpython-37.pyc | Bin 0 -> 26154 bytes .../__pycache__/func_encrypt.cpython-37.pyc | Bin 0 -> 11965 bytes module/__pycache__/func_tools.cpython-37.pyc | Bin 0 -> 2795 bytes module/__pycache__/jother.cpython-37.pyc | Bin 0 -> 4633 bytes module/__pycache__/tools_func.cpython-37.pyc | Bin 0 -> 2592 bytes module/crypto-js.min.js | 1 + module/func_aes.py | 188 + module/func_binary.py | 152 + module/func_decode.py | 866 ++++ module/func_decrypt.py | 598 +++ module/func_encode.py | 704 ++++ module/func_encrypt.py | 437 ++ module/func_tools.py | 70 + module/jjdecode.py | 313 ++ module/jjencode.py | 123 + module/jother.py | 142 + module/yufoluntan_main.js | 202 + 50 files changed, 4999 insertions(+), 3219 deletions(-) delete mode 100644 GUI/Binary.py create mode 100644 GUI/Cipher.py create mode 100644 GUI/__pycache__/Cipher.cpython-37.pyc create mode 100644 QWidget_XiandaiMima.py create mode 100644 __pycache__/QWidget_XiandaiMima.cpython-37.pyc create mode 100644 module/AutoGetFlag.py create mode 100644 module/Buddha.py create mode 100644 module/CipherAnalyse.py create mode 100644 module/__pycache__/AutoGetFlag.cpython-37.pyc create mode 100644 module/__pycache__/CipherAnalyse.cpython-37.pyc create mode 100644 module/__pycache__/aes_func.cpython-37.pyc create mode 100644 module/__pycache__/binary_func.cpython-37.pyc create mode 100644 module/__pycache__/decode_func.cpython-37.pyc create mode 100644 module/__pycache__/decrypt_func.cpython-37.pyc create mode 100644 module/__pycache__/encode.cpython-37.pyc create mode 100644 module/__pycache__/encode_func.cpython-37.pyc create mode 100644 module/__pycache__/encrypt_func.cpython-37.pyc create mode 100644 module/__pycache__/func_aes.cpython-37.pyc create mode 100644 module/__pycache__/func_binary.cpython-37.pyc create mode 100644 module/__pycache__/func_decode.cpython-37.pyc create mode 100644 module/__pycache__/func_decrypt.cpython-37.pyc create mode 100644 module/__pycache__/func_encode.cpython-37.pyc create mode 100644 module/__pycache__/func_encrypt.cpython-37.pyc create mode 100644 module/__pycache__/func_tools.cpython-37.pyc create mode 100644 module/__pycache__/jother.cpython-37.pyc create mode 100644 module/__pycache__/tools_func.cpython-37.pyc create mode 100644 module/crypto-js.min.js create mode 100644 module/func_aes.py create mode 100644 module/func_binary.py create mode 100644 module/func_decode.py create mode 100644 module/func_decrypt.py create mode 100644 module/func_encode.py create mode 100644 module/func_encrypt.py create mode 100644 module/func_tools.py create mode 100644 module/jjdecode.py create mode 100644 module/jjencode.py create mode 100644 module/jother.py create mode 100644 module/yufoluntan_main.js diff --git a/CTF-Tools.py b/CTF-Tools.py index 1f88f0b..e124e75 100644 --- a/CTF-Tools.py +++ b/CTF-Tools.py @@ -1,16 +1,21 @@ # coding=utf-8 +import base64 import binascii -import html, base64, sys, string, os, urllib.parse, random, collections, re, base36, base58, base91, py3base92, base62 -import importlib.machinery -import webbrowser import configparser -import execjs -import Crypto.Util.Counter -import requests, js2py -from PyQt5.QtCore import QTranslator, QCoreApplication, QEvent +import importlib.machinery +import os +import random +import sys if hasattr(sys, 'frozen'): os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH'] +import webbrowser +import qdarkstyle +import requests +from PyQt5.QtCore import QTranslator, QCoreApplication, QEvent +from qdarkstyle import LightPalette +from module.CipherAnalyse import Cipher_Thread +from module.AutoGetFlag import AutoGetFlag from PyQt5 import QtWidgets, QtCore, QtGui from PyQt5.QtWidgets import * from PyQt5.QtGui import * @@ -18,16 +23,21 @@ import json from GUI.main import Ui_MainWindow from GUI.KEY_1 import Ui_KEY1 -from GUI.Binary import Ui_Binary from GUI.KEY_2 import Ui_KEY2 -from GUI.Xiandaimima import Ui_Form_Xiandaimima +from GUI.Cipher import Ui_Cipher import frozen_dir -from Crypto.Cipher import AES +from module.func_binary import Class_Binary +from module.func_decode import Class_Decode +from module.func_encrypt import Class_Encrypt +from module.func_encode import Class_Encode +from module.func_tools import Class_Tools +from module.func_decrypt import Class_Decrypt +from QWidget_XiandaiMima import QWidget_XiandaiMima SETUP_DIR = frozen_dir.app_path() sys.path.append(SETUP_DIR) -version = '1.3.6' -update_time = '20220119' +version = '1.3.7' +update_time = '20220721' class MainWindows(QtWidgets.QMainWindow, Ui_MainWindow): @@ -48,165 +58,164 @@ def __init__(self, parent=None): self.Ui.Source_Paste_Button.clicked.connect(lambda: self.paste('Source')) # paste_Source self.Ui.zhuanyuan.clicked.connect(self.zhuan_yuanwenben) # paste_result # encode - self.Ui.actionURL_encode.triggered.connect(lambda: self.encode(self.Ui.actionURL_encode.objectName())) - self.Ui.actionUnicode_encode.triggered.connect(lambda: self.encode(self.Ui.actionUnicode_encode.objectName())) - self.Ui.actionEscape_U_encode.triggered.connect(lambda: self.encode(self.Ui.actionEscape_U_encode.objectName())) - self.Ui.actionHtmlEncode_encode.triggered.connect( - lambda: self.encode(self.Ui.actionHtmlEncode_encode.objectName())) - self.Ui.actionASCII_2_encode.triggered.connect(lambda: self.encode(self.Ui.actionASCII_2_encode.objectName())) - self.Ui.actionASCII_8_encode.triggered.connect(lambda: self.encode(self.Ui.actionASCII_8_encode.objectName())) - self.Ui.actionASCII_10_encode.triggered.connect(lambda: self.encode(self.Ui.actionASCII_10_encode.objectName())) - self.Ui.actionASCII_16_encode.triggered.connect(lambda: self.encode(self.Ui.actionASCII_16_encode.objectName())) - self.Ui.actionBase16_encode.triggered.connect(lambda: self.encode(self.Ui.actionBase16_encode.objectName())) - self.Ui.actionBase32_encode.triggered.connect(lambda: self.encode(self.Ui.actionBase32_encode.objectName())) - self.Ui.actionBase36_encode.triggered.connect(lambda: self.encode(self.Ui.actionBase36_encode.objectName())) - self.Ui.actionBase58_encode.triggered.connect(lambda: self.encode(self.Ui.actionBase58_encode.objectName())) - self.Ui.actionBase62_encode.triggered.connect(lambda: self.encode(self.Ui.actionBase62_encode.objectName())) - self.Ui.actionBase64_encode.triggered.connect(lambda: self.encode(self.Ui.actionBase64_encode.objectName())) - self.Ui.actionBase64_2_encode.triggered.connect(lambda: self.encode(self.Ui.actionBase64_2_encode.objectName())) - self.Ui.actionBase85_ASCII85_encode.triggered.connect( - lambda: self.encode(self.Ui.actionBase85_ASCII85_encode.objectName())) - self.Ui.actionBase85_RFC1924_encode.triggered.connect( - lambda: self.encode(self.Ui.actionBase85_RFC1924_encode.objectName())) - self.Ui.actionBase91_encode.triggered.connect(lambda: self.encode(self.Ui.actionBase91_encode.objectName())) - self.Ui.actionBase92_encode.triggered.connect(lambda: self.encode(self.Ui.actionBase92_encode.objectName())) - self.Ui.actionStr_Hex_encode.triggered.connect(lambda: self.encode(self.Ui.actionStr_Hex_encode.objectName())) - self.Ui.actionShellcode_encode.triggered.connect( - lambda: self.encode(self.Ui.actionShellcode_encode.objectName())) - self.Ui.actionQwerty_encode.triggered.connect(lambda: self.encode(self.Ui.actionQwerty_encode.objectName())) - self.Ui.actiontupian_base64_encode.triggered.connect( - lambda: self.encode(self.Ui.actiontupian_base64_encode.objectName())) - - self.Ui.actionJsFuck_encode.triggered.connect( - lambda: self.encode(self.Ui.actionJsFuck_encode.objectName())) - self.Ui.actionJJEncode_encode.triggered.connect( - lambda: self.encode(self.Ui.actionJJEncode_encode.objectName())) - self.Ui.actionAAEncode_encode.triggered.connect( - lambda: self.encode(self.Ui.actionAAEncode_encode.objectName())) - self.Ui.actiontupian_hex_encode.triggered.connect( - lambda: self.encode(self.Ui.actiontupian_hex_encode.objectName())) + self.Ui.actionURL_encode.triggered.connect(lambda: self.gogogo('url')) + self.Ui.actionUnicode_encode.triggered.connect(lambda: self.gogogo('unicode')) + self.Ui.actionEscape_U_encode.triggered.connect(lambda: self.gogogo('escape_u')) + self.Ui.actionHtmlEncode_encode.triggered.connect(lambda: self.gogogo('html')) + self.Ui.actionASCII_2_encode.triggered.connect(lambda: self.gogogo('ASCII_2')) + self.Ui.actionASCII_8_encode.triggered.connect(lambda: self.gogogo('ASCII_8')) + self.Ui.actionASCII_10_encode.triggered.connect(lambda: self.gogogo('ASCII_10')) + self.Ui.actionASCII_16_encode.triggered.connect(lambda: self.gogogo('ASCII_16')) + self.Ui.actionBase16_encode.triggered.connect(lambda: self.gogogo('base16')) + self.Ui.actionBase32_encode.triggered.connect(lambda: self.gogogo('base32')) + self.Ui.actionBase36_encode.triggered.connect(lambda: self.gogogo('base36')) + self.Ui.actionBase58_encode.triggered.connect(lambda: self.gogogo('base58')) + self.Ui.actionBase62_encode.triggered.connect(lambda: self.gogogo('base62')) + self.Ui.actionBase64_encode.triggered.connect(lambda: self.gogogo('base64')) + self.Ui.actionBase64_2_encode.triggered.connect( + lambda: self.UI_KEY1('base64_zidingyi', 'Encode', "base64自定义", "请输入编码表:")) + self.Ui.actionBase85_ASCII85_encode.triggered.connect(lambda: self.gogogo('bae85_ASCII85')) + self.Ui.actionBase85_RFC1924_encode.triggered.connect(lambda: self.gogogo('bae85_RFC1924')) + self.Ui.actionBase91_encode.triggered.connect(lambda: self.gogogo('base91')) + self.Ui.actionBase92_encode.triggered.connect(lambda: self.gogogo('base92')) + self.Ui.actionStr_Hex_encode.triggered.connect(lambda: self.gogogo('Str_Hex')) + self.Ui.actionShellcode_encode.triggered.connect(lambda: self.gogogo('shellcode')) + self.Ui.actionQwerty_encode.triggered.connect(lambda: self.gogogo('qwerty')) + self.Ui.actiontupian_base64_encode.triggered.connect(self.img_base64_encode) + self.Ui.actiontupian_hex_encode.triggered.connect(self.img_hex_encode) + self.Ui.actionJsFuck_encode.triggered.connect(lambda: self.gogogo('jsfuck')) + self.Ui.actionJJEncode_encode.triggered.connect(lambda: self.gogogo('jjencode')) + self.Ui.actionAAEncode_encode.triggered.connect(lambda: self.gogogo('aaencode')) + self.Ui.actionSocialism_encode.triggered.connect(lambda: self.gogogo('Socialism')) + self.Ui.actionjother_encode.triggered.connect(lambda: self.gogogo('jother')) + self.Ui.actionbaijiaxing_encode.triggered.connect(lambda: self.gogogo('baijiaxing')) + # decode - self.Ui.actionURL_decode.triggered.connect(lambda: self.decode(self.Ui.actionURL_decode.objectName())) - self.Ui.actionUnicode_decode.triggered.connect(lambda: self.decode(self.Ui.actionUnicode_decode.objectName())) - self.Ui.actionEscape_U_decode.triggered.connect(lambda: self.decode(self.Ui.actionEscape_U_decode.objectName())) - self.Ui.actionHtmlEncode_decode.triggered.connect( - lambda: self.decode(self.Ui.actionHtmlEncode_decode.objectName())) - self.Ui.actionASCII_2_decode.triggered.connect(lambda: self.decode(self.Ui.actionASCII_2_decode.objectName())) - self.Ui.actionASCII_8_decode.triggered.connect(lambda: self.decode(self.Ui.actionASCII_8_decode.objectName())) - self.Ui.actionASCII_10_decode.triggered.connect(lambda: self.decode(self.Ui.actionASCII_10_decode.objectName())) - self.Ui.actionASCII_16_decode.triggered.connect(lambda: self.decode(self.Ui.actionASCII_16_decode.objectName())) - self.Ui.actionJsFuck_decode.triggered.connect(lambda: self.decode(self.Ui.actionJsFuck_decode.objectName())) - self.Ui.actionJJEncode_decode.triggered.connect(lambda: self.decode(self.Ui.actionJJEncode_decode.objectName())) - self.Ui.actionAAEncode_decode.triggered.connect(lambda: self.decode(self.Ui.actionAAEncode_decode.objectName())) - - self.Ui.actionBase16_decode.triggered.connect(lambda: self.decode(self.Ui.actionBase16_decode.objectName())) - self.Ui.actionBase32_decode.triggered.connect(lambda: self.decode(self.Ui.actionBase32_decode.objectName())) - self.Ui.actionBase36_decode.triggered.connect(lambda: self.decode(self.Ui.actionBase36_decode.objectName())) - self.Ui.actionBase58_decode.triggered.connect(lambda: self.decode(self.Ui.actionBase58_decode.objectName())) - self.Ui.actionBase62_decode.triggered.connect(lambda: self.decode(self.Ui.actionBase62_decode.objectName())) - self.Ui.actionBase64_decode.triggered.connect(lambda: self.decode(self.Ui.actionBase64_decode.objectName())) - self.Ui.actionBase64_2_decode.triggered.connect(lambda: self.decode(self.Ui.actionBase64_2_decode.objectName())) - self.Ui.actionBase85_ASCII85_decode.triggered.connect( - lambda: self.decode(self.Ui.actionBase85_ASCII85_decode.objectName())) - self.Ui.actionBase85_RFC1924_decode.triggered.connect( - lambda: self.decode(self.Ui.actionBase85_RFC1924_decode.objectName())) - self.Ui.actionBase91_decode.triggered.connect(lambda: self.decode(self.Ui.actionBase91_decode.objectName())) - self.Ui.actionBase92_decode.triggered.connect(lambda: self.decode(self.Ui.actionBase92_decode.objectName())) - self.Ui.actionHex_Str_decode.triggered.connect(lambda: self.decode(self.Ui.actionHex_Str_decode.objectName())) - self.Ui.actionShellcode_decode.triggered.connect( - lambda: self.decode(self.Ui.actionShellcode_decode.objectName())) - self.Ui.actionQwerty_decode.triggered.connect(lambda: self.decode(self.Ui.actionQwerty_decode.objectName())) - self.Ui.actionbase64_tupian_decode.triggered.connect( - lambda: self.decode(self.Ui.actionbase64_tupian_decode.objectName())) - self.Ui.actionhex_tupian_decode.triggered.connect( - lambda: self.decode(self.Ui.actionhex_tupian_decode.objectName())) + self.Ui.actionURL_decode.triggered.connect(lambda: self.gogogo('url', 'Decode')) + self.Ui.actionUnicode_decode.triggered.connect(lambda: self.gogogo('unicode', 'Decode')) + self.Ui.actionEscape_U_decode.triggered.connect(lambda: self.gogogo('escape_u', 'Decode')) + self.Ui.actionHtmlEncode_decode.triggered.connect(lambda: self.gogogo('html', 'Decode')) + self.Ui.actionASCII_2_decode.triggered.connect(lambda: self.gogogo('ASCII_2', 'Decode')) + self.Ui.actionASCII_8_decode.triggered.connect(lambda: self.gogogo('ASCII_8', 'Decode')) + self.Ui.actionASCII_10_decode.triggered.connect(lambda: self.gogogo('ASCII_10', 'Decode')) + self.Ui.actionASCII_16_decode.triggered.connect(lambda: self.gogogo('ASCII_16', 'Decode')) + self.Ui.actionJsFuck_decode.triggered.connect(lambda: self.gogogo('jsfuck', 'Decode')) + self.Ui.actionJJEncode_decode.triggered.connect(lambda: self.gogogo('jjencode', 'Decode')) + self.Ui.actionAAEncode_decode.triggered.connect(lambda: self.gogogo('aaencode', 'Decode')) + self.Ui.actionBase16_decode.triggered.connect(lambda: self.gogogo('base16', 'Decode')) + self.Ui.actionBase32_decode.triggered.connect(lambda: self.gogogo('base32', 'Decode')) + self.Ui.actionBase36_decode.triggered.connect(lambda: self.gogogo('base36', 'Decode')) + self.Ui.actionBase58_decode.triggered.connect(lambda: self.gogogo('base58', 'Decode')) + self.Ui.actionBase62_decode.triggered.connect(lambda: self.gogogo('base62', 'Decode')) + self.Ui.actionBase64_decode.triggered.connect(lambda: self.gogogo('base64', 'Decode')) + self.Ui.actionBase64_2_decode.triggered.connect( + lambda: self.UI_KEY1('base64_zidingyi', 'Decode', "base64自定义", "请输入编码表:")) + self.Ui.actionBase85_ASCII85_decode.triggered.connect(lambda: self.gogogo('bae85_ASCII85', 'Decode')) + self.Ui.actionBase85_RFC1924_decode.triggered.connect(lambda: self.gogogo('bae85_RFC1924', 'Decode')) + self.Ui.actionBase91_decode.triggered.connect(lambda: self.gogogo('base91', 'Decode')) + self.Ui.actionBase92_decode.triggered.connect(lambda: self.gogogo('base92', 'Decode')) + self.Ui.actionHex_Str_decode.triggered.connect(lambda: self.gogogo('Hex_Str', 'Decode')) + self.Ui.actionShellcode_decode.triggered.connect(lambda: self.gogogo('shellcode', 'Decode')) + self.Ui.actionQwerty_decode.triggered.connect(lambda: self.gogogo('qwerty', 'Decode')) + self.Ui.actionbase64_tupian_decode.triggered.connect(self.base64_img_decode) + self.Ui.actionhex_tupian_decode.triggered.connect(self.hex_img_decode) + self.Ui.actionSocialism_decode.triggered.connect(lambda: self.gogogo('Socialism', 'Decode')) + self.Ui.actionjother_decode.triggered.connect(lambda: self.gogogo('jother', 'Decode')) + self.Ui.actionbaijiaxing_decode.triggered.connect(lambda: self.gogogo('baijiaxing', 'Decode')) + # encrypt - self.Ui.actionRot13_encrypt.triggered.connect(lambda: self.encrypt(self.Ui.actionRot13_encrypt.objectName())) - self.Ui.action_kaisa_encrypt.triggered.connect(lambda: self.encrypt(self.Ui.action_kaisa_encrypt.objectName())) - self.Ui.action_zhalan_encrypt.triggered.connect( - lambda: self.encrypt(self.Ui.action_zhalan_encrypt.objectName())) + self.Ui.actionRot13_encrypt.triggered.connect(lambda: self.gogogo('rot13', 'Encrypt')) + self.Ui.action_kaisa_encrypt.triggered.connect(lambda: self.gogogo('kaisa', 'Encrypt')) + self.Ui.action_zhalan_encrypt.triggered.connect(lambda: self.UI_KEY1('zhalan', 'Encrypt', "栅栏密码", "请输入栏数:")) self.Ui.action_zhalan_w_encrypt.triggered.connect( - lambda: self.encrypt(self.Ui.action_zhalan_w_encrypt.objectName())) - self.Ui.action_peigen_encrypt.triggered.connect( - lambda: self.encrypt(self.Ui.action_peigen_encrypt.objectName())) - self.Ui.action_mosi_encrypt.triggered.connect(lambda: self.encrypt(self.Ui.action_mosi_encrypt.objectName())) - self.Ui.action_yunying_encrypt.triggered.connect( - lambda: self.encrypt(self.Ui.action_yunying_encrypt.objectName())) - self.Ui.action_dangpu_encrypt.triggered.connect( - lambda: self.encrypt(self.Ui.action_dangpu_encrypt.objectName())) + lambda: self.UI_KEY1('zhalan_w', 'Encrypt', "栅栏密码(W型)", "请输入栏数:")) + self.Ui.action_peigen_encrypt.triggered.connect(lambda: self.gogogo('peigen', 'Encrypt')) + self.Ui.action_mosi_encrypt.triggered.connect(lambda: self.gogogo('mosi', 'Encrypt')) + self.Ui.action_yunying_encrypt.triggered.connect(lambda: self.gogogo('yunying', 'Encrypt')) + self.Ui.action_dangpu_encrypt.triggered.connect(lambda: self.gogogo('dangpu', 'Encrypt')) self.Ui.action_sifang_encrypt.triggered.connect( - lambda: self.encrypt(self.Ui.action_sifang_encrypt.objectName())) + lambda: self.UI_KEY2('sifang', 'Encrypt', "四方密码", "Key square 1:", "Key square 2:")) self.Ui.action_weinijiya_encrypt.triggered.connect( - lambda: self.encrypt(self.Ui.action_weinijiya_encrypt.objectName())) - self.Ui.action_Atbash_encrypt.triggered.connect( - lambda: self.encrypt(self.Ui.action_Atbash_encrypt.objectName())) - self.Ui.action_fangshe_encrypt.triggered.connect( - lambda: self.encrypt(self.Ui.action_fangshe_encrypt.objectName())) - - self.Ui.action_xiandaimima.triggered.connect(self.open_xiandaimima) + lambda: self.UI_KEY1('vigenere', 'Encrypt', "维吉尼亚密码", "Keyword:")) + self.Ui.action_Atbash_encrypt.triggered.connect(lambda: self.gogogo('atbash', 'Encrypt')) + self.Ui.action_fangshe_encrypt.triggered.connect(lambda: self.UI_KEY2('fangshe', 'Encrypt', "仿射密码", "a:", "b:")) + self.Ui.action_yufolunchan_v2_encrypt.triggered.connect( + lambda: self.UI_KEY1('yufolunchan_v2', 'Encrypt', "与佛论禅 v2.0", "箴言:")) + self.Ui.actionADFGX_encrypt.triggered.connect(lambda: self.gogogo('Polybius', 'Encrypt')) + self.Ui.actiona1z26_encrypt.triggered.connect(lambda: self.gogogo('a1z26', 'Encrypt')) # decrypt - self.Ui.actionRot13_decrypt.triggered.connect(lambda: self.decrypt(self.Ui.actionRot13_decrypt.objectName())) - self.Ui.action_kaisa_decrypt.triggered.connect(lambda: self.decrypt(self.Ui.action_kaisa_decrypt.objectName())) - self.Ui.action_zhalan_decrypt.triggered.connect( - lambda: self.decrypt(self.Ui.action_zhalan_decrypt.objectName())) - self.Ui.action_zhalan_w_decrypt.triggered.connect( - lambda: self.decrypt(self.Ui.action_zhalan_w_decrypt.objectName())) - self.Ui.action_peihen_decrypt.triggered.connect( - lambda: self.decrypt(self.Ui.action_peihen_decrypt.objectName())) - self.Ui.action_mosi_decrypt.triggered.connect(lambda: self.decrypt(self.Ui.action_mosi_decrypt.objectName())) - self.Ui.action_yiwei_decrypt.triggered.connect(lambda: self.decrypt(self.Ui.action_yiwei_decrypt.objectName())) - self.Ui.action_yunxing_decrypt.triggered.connect( - lambda: self.decrypt(self.Ui.action_yunxing_decrypt.objectName())) - self.Ui.action_dangpu_decry.triggered.connect(lambda: self.decrypt(self.Ui.action_dangpu_decry.objectName())) + self.Ui.actionRot5_decrypt.triggered.connect(lambda: self.gogogo('rot5', 'Decrypt')) + self.Ui.actionRot13_decrypt.triggered.connect(lambda: self.gogogo('rot13', 'Decrypt')) + self.Ui.actionRot18_decrypt.triggered.connect(lambda: self.gogogo('rot18', 'Decrypt')) + self.Ui.actionRot47_decrypt.triggered.connect(lambda: self.gogogo('rot47', 'Decrypt')) + self.Ui.action_kaisa_decrypt.triggered.connect(lambda: self.gogogo('kaisa', 'Decrypt')) + self.Ui.action_zhalan_decrypt.triggered.connect(lambda: self.gogogo('zhalan', 'Decrypt')) + self.Ui.action_zhalan_w_decrypt.triggered.connect(lambda: self.gogogo('zhalan_w', 'Decrypt')) + self.Ui.action_peihen_decrypt.triggered.connect(lambda: self.gogogo('peigen', 'Decrypt')) + self.Ui.action_mosi_decrypt.triggered.connect(lambda: self.gogogo('mosi', 'Decrypt')) + self.Ui.action_yiwei_decrypt.triggered.connect(lambda: self.gogogo('yiwei', 'Decrypt')) + self.Ui.action_yunxing_decrypt.triggered.connect(lambda: self.gogogo('yunying', 'Decrypt')) + self.Ui.action_dangpu_decry.triggered.connect(lambda: self.gogogo('dangpu', 'Decrypt')) self.Ui.action_sifang_decrypt.triggered.connect( - lambda: self.decrypt(self.Ui.action_sifang_decrypt.objectName())) + lambda: self.UI_KEY2('sifang', 'Decrypt', "四方密码", "Key square 1:", "Key square 2:")) self.Ui.action_weinijiya_decrypt.triggered.connect( - lambda: self.decrypt(self.Ui.action_weinijiya_decrypt.objectName())) - self.Ui.action_Atbash_decrypt.triggered.connect( - lambda: self.decrypt(self.Ui.action_Atbash_decrypt.objectName())) - self.Ui.action_fangshe_decrypt.triggered.connect( - lambda: self.decrypt(self.Ui.action_fangshe_decrypt.objectName())) + lambda: self.UI_KEY1('vigenere', 'Decrypt', "维吉尼亚密码", "Keyword:")) + self.Ui.action_Atbash_decrypt.triggered.connect(lambda: self.gogogo('atbash', 'Decrypt')) + self.Ui.action_fangshe_decrypt.triggered.connect(lambda: self.UI_KEY2('fangshe', 'Decrypt', "仿射密码", "a:", "b:")) + self.Ui.action_yufolunchan_v1_decrypt.triggered.connect(lambda: self.gogogo('yufolunchan_v1', 'Decrypt')) + self.Ui.action_yufolunchan_v2_decrypt.triggered.connect( + lambda: self.UI_KEY1('yufolunchan_v2', 'Decrypt', "与佛论禅 v2.0", "箴言:")) + self.Ui.action_ADFGX_decrypt.triggered.connect(lambda: self.gogogo('Polybius', 'Decrypt')) + self.Ui.actiona1z26_decrypt.triggered.connect(lambda: self.gogogo('a1z26', 'Decrypt')) # 进制转换 - self.Ui.action2_8.triggered.connect(lambda: self.Binary(self.Ui.action2_8.objectName())) - self.Ui.action2_10.triggered.connect(lambda: self.Binary(self.Ui.action2_10.objectName())) - self.Ui.action2_16.triggered.connect(lambda: self.Binary(self.Ui.action2_16.objectName())) - self.Ui.action8_2.triggered.connect(lambda: self.Binary(self.Ui.action8_2.objectName())) - self.Ui.action8_10.triggered.connect(lambda: self.Binary(self.Ui.action8_10.objectName())) - self.Ui.action8_16.triggered.connect(lambda: self.Binary(self.Ui.action8_16.objectName())) - self.Ui.action10_2.triggered.connect(lambda: self.Binary(self.Ui.action10_2.objectName())) - self.Ui.action10_8.triggered.connect(lambda: self.Binary(self.Ui.action10_8.objectName())) - self.Ui.action10_16.triggered.connect(lambda: self.Binary(self.Ui.action10_16.objectName())) - self.Ui.action16_2.triggered.connect(lambda: self.Binary(self.Ui.action16_2.objectName())) - self.Ui.action16_8.triggered.connect(lambda: self.Binary(self.Ui.action16_8.objectName())) - self.Ui.action16_10.triggered.connect(lambda: self.Binary(self.Ui.action16_10.objectName())) - self.Ui.action_others.triggered.connect(lambda: self.Binary(self.Ui.action_others.objectName())) + self.Ui.action2_8.triggered.connect(lambda: self.Binary_gogogo('2_8')) + self.Ui.action2_10.triggered.connect(lambda: self.Binary_gogogo('2_10')) + self.Ui.action2_16.triggered.connect(lambda: self.Binary_gogogo('2_16')) + self.Ui.action8_2.triggered.connect(lambda: self.Binary_gogogo('8_2')) + self.Ui.action8_10.triggered.connect(lambda: self.Binary_gogogo('8_10')) + self.Ui.action8_16.triggered.connect(lambda: self.Binary_gogogo('8_16')) + self.Ui.action10_2.triggered.connect(lambda: self.Binary_gogogo('10_2')) + self.Ui.action10_8.triggered.connect(lambda: self.Binary_gogogo('10_8')) + self.Ui.action10_16.triggered.connect(lambda: self.Binary_gogogo('10_16')) + self.Ui.action16_2.triggered.connect(lambda: self.Binary_gogogo('16_2')) + self.Ui.action16_8.triggered.connect(lambda: self.Binary_gogogo('16_8')) + self.Ui.action16_10.triggered.connect(lambda: self.Binary_gogogo('16_10')) + self.Ui.action_others.triggered.connect( + lambda: self.UI_KEY2('renyijinzhi_zhuanhuan', 'Binary', "任意进制转换", "转换前进制:", "转换后进制:")) self.Ui.actionAbout.triggered.connect(self.about) self.Ui.actionAuthor.triggered.connect(self.author) self.Ui.actionUpdate_2.triggered.connect(self.Update) - self.Ui.yijian_decode.clicked.connect(self.yijian_decode) # 一键解码 - self.Ui.yijian_base.clicked.connect(self.yijian_base) # 一键base - self.Ui.yijian_decrypto.clicked.connect(self.yijian_decrypto) # 一键解密 - self.Ui.yijian_jinzhi.clicked.connect(self.yijian_jinzhi) # 一键进制 + self.Ui.miwenfenxi.clicked.connect(self.miwenfenxi) # 一键解码 + self.Ui.auto_get_flag.clicked.connect(self.auto_get_flag) # 一键解码 + + # self.Ui.yijian_decode.clicked.connect(self.yijian_decode) # 一键解码 + # self.Ui.yijian_base.clicked.connect(self.yijian_base) # 一键base + # self.Ui.yijian_decrypto.clicked.connect(self.yijian_decrypto) # 一键解密 + # self.Ui.yijian_jinzhi.clicked.connect(self.yijian_jinzhi) # 一键进制 self.Ui.action_str_replace.triggered.connect(self.str_place) # 字符串替换 - self.Ui.action_str_split.triggered.connect(self.str_split) # 字符串分割 - self.Ui.action_str_chaifen.triggered.connect(self.str_chaifen) # 字符串拆分 - self.Ui.action_str_tongji.triggered.connect(self.str_tongji) # 字符串统计 - self.Ui.action_str_re.triggered.connect(self.str_re) # 字符串拆分 + self.Ui.action_str_split.triggered.connect( + lambda: self.UI_KEY1('str_split', 'Tools', "字符串分割", "请输入分隔符号:")) # 字符串分割 + self.Ui.action_str_chaifen.triggered.connect( + lambda: self.UI_KEY1('str_chaifen', 'Tools', "字符串长度拆分", "请输入字符串长度:")) # 字符串拆分 + self.Ui.action_str_tongji.triggered.connect(lambda: self.gogogo('str_tongji', 'Tools')) # 字符串统计 + self.Ui.action_str_re.triggered.connect(lambda: self.gogogo('str_re', 'Tools')) # 字符串拆分 self.Ui.action_str_xiaoxie.triggered.connect( lambda: self.Ui.Result_text.setPlainText(self.Ui.Source_text.toPlainText().lower())) # 字符串全小写 self.Ui.action_str_daxie.triggered.connect( lambda: self.Ui.Result_text.setPlainText(self.Ui.Source_text.toPlainText().upper())) # 字符串全小写 - + # self.Ui.tab_add.clicked.connect(self.add_Tab) # 添加tab self.Ui.tabWidget.tabCloseRequested.connect(self.closeTab) self.Ui.tabWidget.currentChanged.connect(self.onCurrentChanged) self.Ui.tabWidget.tabBar().installEventFilter(self) self.Ui.tabWidget.tabBar().previousMiddleIndex = -1 + self.Ui.xiandaimima.clicked.connect(self.open_xiandaimima) + self.readfile() # Website websitemenubar = self.menuBar() # 获取窗体的菜单栏 @@ -234,91 +243,23 @@ def __init__(self, parent=None): sub_action = QAction(QIcon(''), j, self) others.addAction(sub_action) impMenu = QMenu("皮肤", self) - for z in config_setup.options('QSS_List'): + pifu_list = ['默认皮肤', '明亮风格', '暗黑风格'] + # for z in config_setup.options('QSS_List'): + for z in pifu_list: sub_action = QAction(QIcon(''), z, self) impMenu.addAction(sub_action) others.addMenu(impMenu) others.triggered[QAction].connect(self.show_others) + # 编码 - def yijian_decode(self): - self.Ui.Result_text.clear() - text = self.Ui.Source_text.toPlainText() - text_list = [] - if self.Ui.checkBox_line.isChecked(): - text_list = text.splitlines() - else: - text_list.append(text) - methods_dicts = {"URL":"actionURL_decode","Unicode":"actionUnicode_decode","Escape(%U)":"actionEscape_U_decode","HtmlEncode":"actionHtmlEncode_decode","ASCII(10)":"actionASCII_10_decode","Shellcode":"actionShellcode_decode","Qwerty":"actionQwerty_decode","Hex->Str":"actionHex_Str_decode"} - for methods_name, methods in methods_dicts.items(): - self.Ui.Result_text.appendPlainText(methods_name) - for text in text_list: - if text == '': - self.Ui.Result_text.appendPlainText('请输入一个源字符串!') - return 0 - else: - result_text = getattr(self, methods)(text) - self.Ui.Result_text.appendPlainText(str(result_text)) - self.Ui.Result_text.appendPlainText('\n') - - def yijian_base(self): - self.Ui.Result_text.clear() - text = self.Ui.Source_text.toPlainText().strip() - text_list = [] - if self.Ui.checkBox_line.isChecked(): - text_list = text.splitlines() - else: - text_list.append(text) - methods_dicts = {"Base16":"actionBase16_decode","Base32":"actionBase32_decode","Base36":"actionBase36_decode","Base58":"actionBase58_decode","Base62":"actionBase62_decode","Base64":"actionBase64_decode","Base85(ASCII85)":"actionBase85_ASCII85_decode","Base85(RFC1924)":"actionBase85_RFC1924_decode","Base91":"actionBase91_decode","Base92":"actionBase91_decode"} - for methods_name, methods in methods_dicts.items(): - self.Ui.Result_text.appendPlainText(methods_name) - for text in text_list: - if text == '': - self.Ui.Result_text.appendPlainText('请输入一个源字符串!') - return 0 - else: - result_text = getattr(self, methods)(text) - self.Ui.Result_text.appendPlainText(str(result_text)) - - self.Ui.Result_text.appendPlainText('\n') - def yijian_decrypto(self): - self.Ui.Result_text.clear() - text = self.Ui.Source_text.toPlainText() + def get_text_list(self, text): text_list = [] if self.Ui.checkBox_line.isChecked(): text_list = text.splitlines() else: text_list.append(text) - methods_dicts = {"Rot13":"actionRot13_decrypt","凯撒密码":"action_kaisa_decrypt","栅栏密码":"action_zhalan_decrypt","栅栏密码(W型)":"action_zhalan_w_decrypt","培根密码":"action_peihen_decrypt","摩斯密码":"action_mosi_decrypt","移位密码":"action_yiwei_decrypt","云影密码":"action_yunxing_decrypt","当铺密码":"action_dangpu_decry","埃特巴什码":"action_Atbash_decrypt"} - for methods_name, methods in methods_dicts.items(): - self.Ui.Result_text.appendPlainText(methods_name) - for text in text_list: - if text == '': - self.Ui.Result_text.appendPlainText('请输入一个源字符串!') - return 0 - else: - result_text = getattr(self, methods)(text) - self.Ui.Result_text.appendPlainText(str(result_text)) - self.Ui.Result_text.appendPlainText('\n') + return text_list - def yijian_jinzhi(self): - text = self.Ui.Source_text.toPlainText().strip() - if text == '': - self.Ui.Result_text.appendPlainText('请输入一个源字符串!') - return 0 - else: - self.Ui.Result_text.clear() - self.out_result("2->8:\n" + self.action2_8(text)) - self.out_result("2->10:\n" + self.action2_10(text)) - self.out_result("2->16:\n" + self.action2_16(text)) - self.out_result("8->2:\n" + self.action8_2(text)) - self.out_result("8->10:\n" + str(self.action8_10(text))) - self.out_result("8->16:\n" + self.action8_16(text)) - self.out_result("10->2:\n" + self.action10_2(text)) - self.out_result("10->8:\n" + self.action10_8(text)) - self.out_result("10->16:\n" + self.action10_16(text)) - self.out_result("16->2:\n" + self.action16_2(text)) - self.out_result("16->8:\n" + self.action16_8(text)) - self.out_result("16->10:\n" + self.action16_10(text)) def out_result(self, text): self.Ui.Result_text.appendPlainText(text + '\n') @@ -326,68 +267,132 @@ def out_result(self, text): def load_config(self): try: global config_setup - global qss_style + # global qss_style # 实例化configParser对象 config_setup = configparser.ConfigParser() # -read读取ini文件 config_setup.read('config.ini', encoding='utf-8') - if 'QSS_Setup' not in config_setup: # 如果分组type不存在则插入type分组 - config_setup.add_section('QSS_Setup') - config_setup.set("QSS_Setup", "QSS", 'default.qss') - config_setup.write(open('config.ini', "r+", encoding="utf-8")) # r+模式 - qss_Setup = 'default.qss' + if 'Skin' not in config_setup: # 如果分组type不存在则插入type分组 + config_setup.add_section('Skin') + config_setup.set("Skin", "default", '明亮风格') + qss_Setup = '明亮风格' else: - qss_Setup = config_setup.get('QSS_Setup', 'QSS') - with open("QSS/" + qss_Setup, 'r', encoding='utf-8') as f: - qss_style = f.read() - f.close() - - MainWindows.setStyleSheet(self, qss_style) - f.close() + qss_Setup = config_setup.get('Skin', 'default') + self.change_pifu(qss_Setup) + # if 'QSS_Setup' not in config_setup: # 如果分组type不存在则插入type分组 + # config_setup.add_section('QSS_Setup') + # config_setup.set("QSS_Setup", "QSS", 'default.qss') + # config_setup.write(open('config.ini', "r+", encoding="utf-8")) # r+模式 + # qss_Setup = 'default.qss' + # else: + # qss_Setup = config_setup.get('QSS_Setup', 'QSS') + # with open("QSS/" + qss_Setup, 'r', encoding='utf-8') as f: + # qss_style = f.read() + # f.close() + + # MainWindows.setStyleSheet(self, qss_style) + # f.close() except Exception as e: QMessageBox.critical(self, 'Error', str(e)) pass def show_others(self, q): + if q.text() == "关于": self.about() return - if q.text() == "作者": + elif q.text() == "作者": self.author() return - if q.text() == "更新": + elif q.text() == "更新": self.Update() return else: - try: - filename = config_setup.get('QSS_List', q.text()) - with open("QSS/" + filename, 'r', encoding='utf-8') as f: - qss_style = f.read() - f.close() - MainWindows.setStyleSheet(self, qss_style) - config_setup.set("QSS_Setup", "QSS", filename) - f.close() - # python = sys.executable - # os.execl(python, python, *sys.argv) - except Exception as e: - QMessageBox.critical(self, 'Error', str(e)) - pass + self.change_pifu(q.text()) + + # try: + # print(q.text()) + # filename = config_setup.get('QSS_List', q.text()) + # with open("QSS/" + filename, 'r', encoding='utf-8') as f: + # qss_style = f.read() + # f.close() + # MainWindows.setStyleSheet(self, qss_style) + # config_setup.set("QSS_Setup", "QSS", filename) + # f.close() + # python = sys.executable + # os.execl(python, python, *sys.argv) + # except Exception as e: + # QMessageBox.critical(self, 'Error', str(e)) + # pass + + def change_pifu(self, q): + config_setup.set("Skin", "default", q) + if q == "默认皮肤": + app.setStyleSheet('') + elif q == "明亮风格": + app.setStyleSheet(qdarkstyle.load_stylesheet(qt_api='pyqt5', palette=LightPalette())) + elif q == "暗黑风格": + app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) def show_plugins(self, q): try: - plugins_methods = "Plugins/" + plugins_data[q.text()][:-3] - filename = "Plugins/" + plugins_data[q.text()] + self.plugins_methods = "Plugins/" + plugins_data[q.text()][:-3] + self.plugins_filename = "Plugins/" + plugins_data[q.text()] text = self.Ui.Source_text.toPlainText() if text == '': self.Ui.Result_text.appendPlainText('请输入一个源字符串!') return 0 - nnnnnnnnnnnn1 = importlib.machinery.SourceFileLoader(plugins_methods, filename).load_module() - result = nnnnnnnnnnnn1.run(text) - self.Ui.Result_text.appendPlainText(str(result)) + self.Ui.Result_text.clear() + nnnnnnnnnnnn1 = importlib.machinery.SourceFileLoader(self.plugins_methods, self.plugins_filename).load_module() + result = nnnnnnnnnnnn1.run(text,self.PLUGINS_UI_KEY1,self.PLUGINS_UI_KEY2) + if result: + self.Ui.Result_text.appendPlainText(str(result[1])) except Exception as e: QMessageBox.critical(self, 'Error', str(e)) - pass + def PLUGINS_UI_KEY1(self, func_name, title, label_text): + text = self.Ui.Source_text.toPlainText() + if len(text) <= 0: + self.Ui.Result_text.appendPlainText('请输入一个源字符串!') + return 0 + self.WChild = Ui_KEY1() + self.dialog = QtWidgets.QDialog(self) + self.WChild.setupUi(self.dialog) + self.dialog.setWindowTitle(title) + self.WChild.label.setText(label_text) + self.dialog.show() + self.WChild.keyenter.clicked.connect(lambda:self.colse_key1(func_name)) + + + def colse_key1(self,func_name): + self.dialog.close() + self.Ui.Result_text.clear() + text = self.Ui.Source_text.toPlainText() + key1 = self.WChild.key.text().strip() + nnnnnnnnnnnn1 = importlib.machinery.SourceFileLoader(self.plugins_methods, self.plugins_filename).load_module() + Function = getattr(nnnnnnnnnnnn1, func_name) # 以字符串的形式执行函数 + result = Function(text,key1) + self.Ui.Result_text.appendPlainText(str(result)) + def PLUGINS_UI_KEY2(self, func_name,title, label_text1, label_text2): + text = self.Ui.Source_text.toPlainText() + self.WChild = Ui_KEY2() + self.dialog = QtWidgets.QDialog(self) + self.WChild.setupUi(self.dialog) + self.dialog.setWindowTitle(title) + self.WChild.key_1.setText(label_text1) + self.WChild.key_2.setText(label_text2) + self.dialog.show() + self.WChild.enter.clicked.connect(lambda: self.colse_key2(func_name)) + def colse_key2(self,func_name): + self.dialog.close() + self.Ui.Result_text.clear() + text = self.Ui.Source_text.toPlainText() + key1 = self.WChild.Key1.text().strip() + key2 = self.WChild.Key2.text().strip() + nnnnnnnnnnnn1 = importlib.machinery.SourceFileLoader(self.plugins_methods, self.plugins_filename).load_module() + Function = getattr(nnnnnnnnnnnn1, func_name) # 以字符串的形式执行函数 + result = Function(text,key1,key2) + self.Ui.Result_text.appendPlainText(str(result)) def show_json(self, q): try: othersmenubar = self.menuBar() # 获取窗体的菜单栏 @@ -447,14 +452,14 @@ def readfile(self): json_data = json.load(f) # print(json_data) f.close() - qss_Setup = config_setup.get('QSS_Setup', 'QSS') - - with open("QSS/" + qss_Setup, 'r', encoding='utf-8') as f: - qss_style = f.read() - f.close() - MainWindows.setStyleSheet(self, qss_style) + # qss_Setup = config_setup.get('QSS_Setup', 'QSS') + # + # with open("QSS/" + qss_Setup, 'r', encoding='utf-8') as f: + # qss_style = f.read() + # f.close() + # MainWindows.setStyleSheet(self, qss_style) # print(json_data) - f.close() + # f.close() global plugins_data f = open('Plugins/Plugins.json', 'r', encoding='utf-8') plugins_data = json.load(f) @@ -465,8 +470,9 @@ def readfile(self): pass # 图片转base64 - def actiontupian_base64_encode(self, text): + def img_base64_encode(self): try: + self.Ui.Result_text.clear() filename = self.file_open(r"Text Files (*.jpg);;All files(*.*)") with open(filename, 'rb') as f: base64_data = base64.b64encode(f.read()) @@ -477,8 +483,9 @@ def actiontupian_base64_encode(self, text): return ('转换失败!') # 图片转hex - def actiontupian_hex_encode(self, text): + def img_hex_encode(self): try: + self.Ui.Result_text.clear() encode_type = self.Ui.encode_type.currentText() filename = self.file_open(r"Text Files (*.jpg);;All files(*.*)") with open(filename, 'rb') as f: @@ -490,1544 +497,99 @@ def actiontupian_hex_encode(self, text): except: return ('转换失败!') - # 编码 + def UI_KEY2(self, encode_name, encode_type, title, label_text1, label_text2): + text = self.Ui.Source_text.toPlainText() + if len(text) <= 0: + self.Ui.Result_text.appendPlainText('请输入一个源字符串!') + return 0 + self.WChild = Ui_KEY2() + self.dialog = QtWidgets.QDialog(self) + self.WChild.setupUi(self.dialog) + self.dialog.setWindowTitle(title) + self.WChild.key_1.setText(label_text1) + self.WChild.key_2.setText(label_text2) + self.dialog.show() + self.WChild.enter.clicked.connect(lambda: self.UI_KEY2_click_func(encode_name, encode_type)) - def encode(self, encode_type): + def UI_KEY2_click_func(self, func_name, class_name): + self.dialog.close() try: self.Ui.Result_text.clear() text = self.Ui.Source_text.toPlainText() - text_list = [] - if self.Ui.checkBox_line.isChecked(): - if encode_type in ["actionBase64_2_encode"]: - self.Ui.Result_text.appendPlainText("base64自定义暂不支持按行处理!") - return - text_list = text.splitlines() - else: - text_list.append(text) + text_list = self.get_text_list(text) + encode_type = self.Ui.encode_type.currentText() + key1 = self.WChild.Key1.text().strip() + key2 = self.WChild.Key2.text().strip() + obj = eval('Class_' + class_name + '()') for text in text_list: - if encode_type in ["actiontupian_hex_encode", "actiontupian_base64_encode"]: - getattr(self, encode_type)(text) - else: - if text == '': - self.Ui.Result_text.appendPlainText('请输入一个源字符串!') - return 0 - else: - result_text = getattr(self, encode_type)(text) - if result_text == "exit": - pass - elif result_text != "": - self.Ui.Result_text.appendPlainText(str(result_text)) - else: - self.Ui.Result_text.appendPlainText("编码失败!") + status,result_text,type__ = getattr(obj, 'func_'+func_name)(encode_type, text, key1, key2) + self.Ui.Result_text.appendPlainText(str(result_text).strip()) except Exception as e: self.Ui.Result_text.appendPlainText(str(e)) - pass - - def actionURL_encode(self, text): - encode_type = self.Ui.encode_type.currentText() - text = text.encode(encode_type) - result_text = urllib.parse.quote(text) - return result_text - - def actionUnicode_encode(self, text): - encode_type = self.Ui.encode_type.currentText() - text = text.encode('unicode_escape') - result_text = str(text, encoding=encode_type) - return result_text - - def actionEscape_U_encode(self, text): - encode_type = self.Ui.encode_type.currentText() - text = text.encode('unicode_escape') - result_text = str(text, encoding=encode_type).replace('\\u', '%u') - return result_text - - def actionHtmlEncode_encode(self, text): - result_text = html.escape(text) - return result_text - - def actionASCII_2_encode(self, text): - result = '' - for i in text: - s = int(ord(str(i))) - re = str(bin(s)).replace('0b', '') - result += str(re) + ' ' - result_text = str(result) - return result_text.strip() - - def actionASCII_8_encode(self, text): - result = '' - for i in text: - s = int(ord(str(i))) - re = str(oct(s)).replace('0o', '') - result += str(re) + ' ' - result_text = str(result) - return result_text.strip() - - def actionASCII_10_encode(self, text): - result = '' - for i in text: - result = str(result) + str(ord(str(i))) + ' ' - result_text = str(result) - return result_text.strip() - - def actionASCII_16_encode(self, text): - result = '' - for i in text: - s = int(ord(str(i))) - re = str(hex(s)).replace('0x', '') - result += str(re) + ' ' - result_text = str(result) - return result_text.strip() - - def actionBase16_encode(self, text): - encode_type = self.Ui.encode_type.currentText() - text = text.lower() - text = base64.b16encode(text.encode(encode_type)) - result_text = str(text, encoding=encode_type) - return result_text - - def actionBase32_encode(self, text): - encode_type = self.Ui.encode_type.currentText() - text = base64.b32encode(text.encode(encode_type)) - result_text = str(text, encoding=encode_type) - return result_text - def actionBase36_encode(self, text): - result_text = str(base36.loads(text)) - return result_text - - def actionBase58_encode(self, text): - encode_type = self.Ui.encode_type.currentText() - result_text = base58.b58encode(text.encode(encode_type)).decode() # 加密 - return result_text - - def actionBase62_encode(self, text): - try: - text = base62.encode(int(text)) - except: - text = 'base62只能对数字编码!' - # print(text) - # result_text = str(text, encoding='utf-8') - return text - - def actionBase64_encode(self, text): - encode_type = self.Ui.encode_type.currentText() - text = base64.b64encode(text.encode(encode_type)) - result_text = str(text, encoding=encode_type) - return result_text - - def actionBase64_2_encode(self, text): - self.WChild_base64 = Ui_KEY1() + def UI_KEY1(self, encode_name, encode_type, title, label_text): + text = self.Ui.Source_text.toPlainText() + if len(text) <= 0: + self.Ui.Result_text.appendPlainText('请输入一个源字符串!') + return 0 + self.WChild = Ui_KEY1() self.dialog = QtWidgets.QDialog(self) - self.WChild_base64.setupUi(self.dialog) - self.dialog.setWindowTitle("base64自定义") - self.WChild_base64.label.setText("请输入编码表:") + self.WChild.setupUi(self.dialog) + self.dialog.setWindowTitle(title) + self.WChild.label.setText(label_text) self.dialog.show() - self.WChild_base64.keyenter.clicked.connect(self.base64_zidingyi) - return 'exit' + self.WChild.keyenter.clicked.connect(lambda: self.UI_KEY1_click_func(encode_name, encode_type)) - def base64_zidingyi(self): + def UI_KEY1_click_func(self, func_name, class_name): self.dialog.close() try: - plain = self.Ui.Source_text.toPlainText().strip() - n = self.WChild_base64.key.text().strip() - STANDARD_ALPHABET = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - CUSTOM_ALPHABET = n.encode() - ENCODE_TRANS = bytes.maketrans(STANDARD_ALPHABET, CUSTOM_ALPHABET) - result_text = base64.b64encode(plain.encode()).translate(ENCODE_TRANS).decode() - self.Ui.Result_text.appendPlainText(result_text) + self.Ui.Result_text.clear() + text = self.Ui.Source_text.toPlainText() + text_list = self.get_text_list(text) + encode_type = self.Ui.encode_type.currentText() + n = self.WChild.key.text().strip() + obj = eval('Class_' + class_name + '()') + for text in text_list: + status,result_text,type__ = getattr(obj, 'func_'+func_name)(encode_type, text, n) + self.Ui.Result_text.appendPlainText(str(result_text).strip()) except Exception as e: self.Ui.Result_text.appendPlainText(str(e)) - def actionBase85_ASCII85_encode(self, text): - encode_type = self.Ui.encode_type.currentText() - result_text = base64.a85encode(text.encode(encode_type)).decode() # 加密 - return result_text - - def actionBase85_RFC1924_encode(self, text): - encode_type = self.Ui.encode_type.currentText() - result_text = base64.b85encode(text.encode(encode_type)).decode() # 加密 - return result_text - - def actionBase91_encode(self, text): - encode_type = self.Ui.encode_type.currentText() - result_text = base91.encode(text.encode(encode_type)) # - return result_text - - def actionBase92_encode(self, text): - result_text = py3base92.encode(text) - return result_text - - def actionStr_Hex_encode(self, text): - result = '' - for i in text: - single = str(hex(ord(str(i)))) - result = result + single - result_text = (str(result)).replace('0x', '') - return result_text - - def actionShellcode_encode(self, text): - result = '' - for i in text: - single = str(hex(ord(str(i)))) - result = result + single - result_text = (str(result)).replace('0x', '\\x') - return result_text - - def actionQwerty_encode(self, text): - str1 = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" - str2 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - result_text = "" - for s in text: - if s in str1: - if s != ' ': - result_text = result_text + str1[str2.index(s)] - else: - result_text = result_text + ' ' - else: - result_text = 'Qwerty只能对字母加密!' - return result_text - # print(str(e)) - - def actionJsFuck_encode(self, text): - - ctx = execjs.compile(""" -/*! JSFuck 0.4.0 - http://jsfuck.com */ - -function JSFuck(code){ - - var USE_CHAR_CODE = "USE_CHAR_CODE"; - - var MIN = 32, MAX = 126; - - var SIMPLE = { - 'false': '![]', - 'true': '!![]', - 'undefined': '[][[]]', - 'NaN': '+[![]]', - 'Infinity': '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])' // +"1e1000" - }; - - var CONSTRUCTORS = { - 'Array': '[]', - 'Number': '(+[])', - 'String': '([]+[])', - 'Boolean': '(![])', - 'Function': '[]["fill"]', - 'RegExp': 'Function("return/"+false+"/")()' - }; - - var MAPPING = { - 'a': '(false+"")[1]', - 'b': '([]["entries"]()+"")[2]', - 'c': '([]["fill"]+"")[3]', - 'd': '(undefined+"")[2]', - 'e': '(true+"")[3]', - 'f': '(false+"")[0]', - 'g': '(false+[0]+String)[20]', - 'h': '(+(101))["to"+String["name"]](21)[1]', - 'i': '([false]+undefined)[10]', - 'j': '([]["entries"]()+"")[3]', - 'k': '(+(20))["to"+String["name"]](21)', - 'l': '(false+"")[2]', - 'm': '(Number+"")[11]', - 'n': '(undefined+"")[1]', - 'o': '(true+[]["fill"])[10]', - 'p': '(+(211))["to"+String["name"]](31)[1]', - 'q': '(+(212))["to"+String["name"]](31)[1]', - 'r': '(true+"")[1]', - 's': '(false+"")[3]', - 't': '(true+"")[0]', - 'u': '(undefined+"")[0]', - 'v': '(+(31))["to"+String["name"]](32)', - 'w': '(+(32))["to"+String["name"]](33)', - 'x': '(+(101))["to"+String["name"]](34)[1]', - 'y': '(NaN+[Infinity])[10]', - 'z': '(+(35))["to"+String["name"]](36)', - - 'A': '(+[]+Array)[10]', - 'B': '(+[]+Boolean)[10]', - 'C': 'Function("return escape")()(("")["italics"]())[2]', - 'D': 'Function("return escape")()([]["fill"])["slice"]("-1")', - 'E': '(RegExp+"")[12]', - 'F': '(+[]+Function)[10]', - 'G': '(false+Function("return Date")()())[30]', - 'H': USE_CHAR_CODE, - 'I': '(Infinity+"")[0]', - 'J': USE_CHAR_CODE, - 'K': USE_CHAR_CODE, - 'L': USE_CHAR_CODE, - 'M': '(true+Function("return Date")()())[30]', - 'N': '(NaN+"")[0]', - 'O': '(NaN+Function("return{}")())[11]', - 'P': USE_CHAR_CODE, - 'Q': USE_CHAR_CODE, - 'R': '(+[]+RegExp)[10]', - 'S': '(+[]+String)[10]', - 'T': '(NaN+Function("return Date")()())[30]', - 'U': '(NaN+Function("return{}")()["to"+String["name"]]["call"]())[11]', - 'V': USE_CHAR_CODE, - 'W': USE_CHAR_CODE, - 'X': USE_CHAR_CODE, - 'Y': USE_CHAR_CODE, - 'Z': USE_CHAR_CODE, - - ' ': '(NaN+[]["fill"])[11]', - '!': USE_CHAR_CODE, - '"': '("")["fontcolor"]()[12]', - '#': USE_CHAR_CODE, - '$': USE_CHAR_CODE, - '%': 'Function("return escape")()([]["fill"])[21]', - '&': '("")["link"](0+")[10]', - '\\'': USE_CHAR_CODE, - '(': '(undefined+[]["fill"])[22]', - ')': '([0]+false+[]["fill"])[20]', - '*': USE_CHAR_CODE, - '+': '(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]', - ',': '([]["slice"]["call"](false+"")+"")[1]', - '-': '(+(.+[0000000001])+"")[2]', - '.': '(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]', - '/': '(false+[0])["italics"]()[10]', - ':': '(RegExp()+"")[3]', - ';': '("")["link"](")[14]', - '<': '("")["italics"]()[0]', - '=': '("")["fontcolor"]()[11]', - '>': '("")["italics"]()[2]', - '?': '(RegExp()+"")[2]', - '@': USE_CHAR_CODE, - '[': '([]["entries"]()+"")[0]', - '\\\\': USE_CHAR_CODE, - ']': '([]["entries"]()+"")[22]', - '^': USE_CHAR_CODE, - '_': USE_CHAR_CODE, - '`': USE_CHAR_CODE, - '{': '(true+[]["fill"])[20]', - '|': USE_CHAR_CODE, - '}': '([]["fill"]+"")["slice"]("-1")', - '~': USE_CHAR_CODE - }; - - var GLOBAL = 'Function("return this")()'; - - function fillMissingChars(){ - for (var key in MAPPING){ - if (MAPPING[key] === USE_CHAR_CODE){ - MAPPING[key] = 'Function("return unescape")()("%"'+ key.charCodeAt(0).toString(16).replace(/(\\d+)/g, "+($1)+\\"") + '")'; - } - } - } - - function fillMissingDigits(){ - var output, number, i; - - for (number = 0; number < 10; number++){ - - output = "+[]"; - - if (number > 0){ output = "+!" + output; } - for (i = 1; i < number; i++){ output = "+!+[]" + output; } - if (number > 1){ output = output.substr(1); } - - MAPPING[number] = "[" + output + "]"; - } - } - - function replaceMap(){ - var character = "", value, original, i, key; - - function replace(pattern, replacement){ - value = value.replace( - new RegExp(pattern, "gi"), - replacement - ); - } - - function digitReplacer(_,x) { return MAPPING[x]; } - - function numberReplacer(_,y) { - var values = y.split(""); - var head = +(values.shift()); - var output = "+[]"; - - if (head > 0){ output = "+!" + output; } - for (i = 1; i < head; i++){ output = "+!+[]" + output; } - if (head > 1){ output = output.substr(1); } - - return [output].concat(values).join("+").replace(/(\\d)/g, digitReplacer); - } - - for (i = MIN; i <= MAX; i++){ - character = String.fromCharCode(i); - value = MAPPING[character]; - if(!value) {continue;} - original = value; - - for (key in CONSTRUCTORS){ - replace("\\\\b" + key, CONSTRUCTORS[key] + '["constructor"]'); - } - - for (key in SIMPLE){ - replace(key, SIMPLE[key]); - } - - replace('(\\\\d\\\\d+)', numberReplacer); - replace('\\\\((\\\\d)\\\\)', digitReplacer); - replace('\\\\[(\\\\d)\\\\]', digitReplacer); - - replace("GLOBAL", GLOBAL); - replace('\\\\+""', "+[]"); - replace('""', "[]+[]"); - - MAPPING[character] = value; - } - } - - function replaceStrings(){ - var regEx = /[^\\[\\]\\(\\)\\!\\+]{1}/g, - all, value, missing, - count = MAX - MIN; - - function findMissing(){ - var all, value, done = false; - - missing = {}; - - for (all in MAPPING){ - - value = MAPPING[all]; - - if (value.match(regEx)){ - missing[all] = value; - done = true; - } - } - - return done; - } - - function mappingReplacer(a, b) { - return b.split("").join("+"); - } - - function valueReplacer(c) { - return missing[c] ? c : MAPPING[c]; - } - - for (all in MAPPING){ - MAPPING[all] = MAPPING[all].replace(/\\"([^\\"]+)\\"/gi, mappingReplacer); - } - - while (findMissing()){ - for (all in missing){ - value = MAPPING[all]; - value = value.replace(regEx, valueReplacer); - - MAPPING[all] = value; - missing[all] = value; - } - - if (count-- === 0){ - console.error("Could not compile the following chars:", missing); - } - } - } - - function encode(input, wrapWithEval, runInParentScope){ - var output = []; - - if (!input){ - return ""; - } - - var r = ""; - for (var i in SIMPLE) { - r += i + "|"; - } - r+="."; - - input.replace(new RegExp(r, 'g'), function(c) { - var replacement = SIMPLE[c]; - if (replacement) { - output.push("[" + replacement + "]+[]"); - } else { - replacement = MAPPING[c]; - if (replacement){ - output.push(replacement); - } else { - replacement = - "([]+[])[" + encode("constructor") + "]" + - "[" + encode("fromCharCode") + "]" + - "(" + encode(c.charCodeAt(0) + "") + ")"; - - output.push(replacement); - MAPPING[c] = replacement; - } - } - }); - - output = output.join("+"); - - if (/^\\d$/.test(input)){ - output += "+[]"; - } - - if (wrapWithEval){ - if (runInParentScope){ - output = "[][" + encode("fill") + "]" + - "[" + encode("constructor") + "]" + - "(" + encode("return eval") + ")()" + - "(" + output + ")"; - } else { - output = "[][" + encode("fill") + "]" + - "[" + encode("constructor") + "]" + - "(" + output + ")()"; - } - } - - return output; - } - - fillMissingDigits(); - fillMissingChars(); - replaceMap(); - replaceStrings(); - - var js_fuck_payload = encode(code,1); - return js_fuck_payload; - }; - """) # 获取代码编译完成后的对象 - return ctx.call("JSFuck", text, '1') - # f = open('./module/jsfuck.js', 'r') - # jsf_code = f.read() - # js = execjs.get() - # # print(jsf_code) - # # print "Using Engine %s" % js.name - # jsf_int = js.compile(jsf_code) - # return_text = jsf_int.call("JSFuck", text, '1') - # return(return_text) - - def actionJJEncode_encode(self, text): - js = """ - function keyup( t ) - { - var _prev; - var v = "$"; - var p = false; - var r; - - if( _prev != ( t + "\\0" + v + "\\0" + p ) || true ){ - r = jjencode( v, t ); - if( p ){ - r = r.replace( /[,;]$/, "" ); - r = "\\"\\'\\\\\\"+\\'+\\"," + r + ",\\'," + r.split("").reverse().join("") +",\\"+\\'+\\"\\\\\\'\\""; - } - return r - - } - - } - function jjencode( gv, text ) - { - var r=""; - var n; - var t; - var b=[ "___", "__$", "_$_", "_$$", "$__", "$_$", "$$_", "$$$", "$___", "$__$", "$_$_", "$_$$", "$$__", "$$_$", "$$$_", "$$$$", ]; - var s = ""; - for( var i = 0; i < text.length; i++ ){ - n = text.charCodeAt( i ); - if( n == 0x22 || n == 0x5c ){ - s += "\\\\\\\\\\\\" + text.charAt( i ).toString(16); - }else if( (0x21 <= n && n <= 0x2f) || (0x3A <= n && n <= 0x40) || ( 0x5b <= n && n <= 0x60 ) || ( 0x7b <= n && n <= 0x7f ) ){ - //}else if( (0x20 <= n && n <= 0x2f) || (0x3A <= n == 0x40) || ( 0x5b <= n && n <= 0x60 ) || ( 0x7b <= n && n <= 0x7f ) ){ - s += text.charAt( i ); - }else if( (0x30 <= n && n <= 0x39 ) || (0x61 <= n && n <= 0x66 ) ){ - if( s ) r += "\\"" + s +"\\"+"; - r += gv + "." + b[ n < 0x40 ? n - 0x30 : n - 0x57 ] + "+"; - s=""; - }else if( n == 0x6c ){ // 'l' - if( s ) r += "\\"" + s + "\\"+"; - r += "(![]+\\"\\")[" + gv + "._$_]+"; - s = ""; - }else if( n == 0x6f ){ // 'o' - if( s ) r += "\\"" + s + "\\"+"; - r += gv + "._$+"; - s = ""; - }else if( n == 0x74 ){ // 'u' - if( s ) r += "\\"" + s + "\\"+"; - r += gv + ".__+"; - s = ""; - }else if( n == 0x75 ){ // 'u' - if( s ) r += "\\"" + s + "\\"+"; - r += gv + "._+"; - s = ""; - }else if( n < 128 ){ - if( s ) r += "\\"" + s; - else r += "\\""; - r += "\\\\\\\\\\"+" + n.toString( 8 ).replace( /[0-7]/g, function(c){ return gv + "."+b[ c ]+"+" } ); - s = ""; - }else{ - if( s ) r += "\\"" + s; - else r += "\\""; - r += "\\\\\\\\\\"+" + gv + "._+" + n.toString(16).replace( /[0-9a-f]/gi, function(c){ return gv + "."+b[parseInt(c,16)]+"+"} ); - s = ""; - } - } - if( s ) r += "\\"" + s + "\\"+"; - - r = - gv + "=~[];" + - gv + "={___:++" + gv +",$$$$:(![]+\\"\\")["+gv+"],__$:++"+gv+",$_$_:(![]+\\"\\")["+gv+"],_$_:++"+ - gv+",$_$$:({}+\\"\\")["+gv+"],$$_$:("+gv+"["+gv+"]+\\"\\")["+gv+"],_$$:++"+gv+",$$$_:(!\\"\\"+\\"\\")["+ - gv+"],$__:++"+gv+",$_$:++"+gv+",$$__:({}+\\"\\")["+gv+"],$$_:++"+gv+",$$$:++"+gv+",$___:++"+gv+",$__$:++"+gv+"};"+ - gv+".$_="+ - "("+gv+".$_="+gv+"+\\"\\")["+gv+".$_$]+"+ - "("+gv+"._$="+gv+".$_["+gv+".__$])+"+ - "("+gv+".$$=("+gv+".$+\\"\\")["+gv+".__$])+"+ - "((!"+gv+")+\\"\\")["+gv+"._$$]+"+ - "("+gv+".__="+gv+".$_["+gv+".$$_])+"+ - "("+gv+".$=(!\\"\\"+\\"\\")["+gv+".__$])+"+ - "("+gv+"._=(!\\"\\"+\\"\\")["+gv+"._$_])+"+ - gv+".$_["+gv+".$_$]+"+ - gv+".__+"+ - gv+"._$+"+ - gv+".$;"+ - gv+".$$="+ - gv+".$+"+ - "(!\\"\\"+\\"\\")["+gv+"._$$]+"+ - gv+".__+"+ - gv+"._+"+ - gv+".$+"+ - gv+".$$;"+ - gv+".$=("+gv+".___)["+gv+".$_]["+gv+".$_];"+ - gv+".$("+gv+".$("+gv+".$$+\\"\\\\\\"\\"+" + r + "\\"\\\\\\"\\")())();"; - - return r; - }""" # 获取代码编译完成后的对象 - js_dr = js2py.EvalJs() - # 执行js代码 - js_dr.execute(js) - result = js_dr.keyup(text) - return result - - def actionAAEncode_encode(self, text): - js = """ - function aaencode( text ) - { - var t; - var b = [ - "(c^_^o)", - "(゚Θ゚)", - "((o^_^o) - (゚Θ゚))", - "(o^_^o)", - "(゚ー゚)", - "((゚ー゚) + (゚Θ゚))", - "((o^_^o) +(o^_^o))", - "((゚ー゚) + (o^_^o))", - "((゚ー゚) + (゚ー゚))", - "((゚ー゚) + (゚ー゚) + (゚Θ゚))", - "(゚Д゚) .゚ω゚ノ", - "(゚Д゚) .゚Θ゚ノ", - "(゚Д゚) ['c']", - "(゚Д゚) .゚ー゚ノ", - "(゚Д゚) .゚Д゚ノ", - "(゚Д゚) [゚Θ゚]" - ]; - var r = "゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); "; - - if( /ひだまりスケッチ×(365|356)\\s*来週も見てくださいね[!!]/.test( text ) ){ - r += "X=_=3; "; - r += "\\r\\n\\r\\n X / _ / X < \\"来週も見てくださいね!\\";\\r\\n\\r\\n"; - } - r += "(゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);"+ - "(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] "+ - ",゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] "+ - ",゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];"+ - "(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];"+ - "(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];"+ - "(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + "+ - "((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+"+ - "((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+"+ - "((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+"+ - "((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];"+ - "(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+"+ - "((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+"+ - "((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; "+ - "(゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\\\\\\\'; "+ - "(゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];"+ - "(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];"+//TODO - "(゚Д゚) [゚o゚]='\\\\\\"';"+ - "(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+"; - r += "(゚Д゚)[゚o゚]+ "; - for( var i = 0; i < text.length; i++ ){ - n = text.charCodeAt( i ); - t = "(゚Д゚)[゚ε゚]+"; - if( n <= 127 ){ - t += n.toString( 8 ).replace( /[0-7]/g, function(c){ return b[ c ] + "+ "; } ); - }else{ - var m = /[0-9a-f]{4}$/.exec( "000" + n.toString(16 ) )[0]; - t += "(o゚ー゚o)+ " + m.replace( /[0-9a-f]/gi, function(c){ return b[ parseInt( c,16 ) ] + "+ "; } ); - } - r += t; - - } - r += "(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');"; - return r; - - - }""" - js_dr = js2py.EvalJs() - # 执行js代码 - js_dr.execute(js) - result = js_dr.aaencode(text) - return result - - # 解码 - def decode(self, decode_type): + def Binary_gogogo(self, Binary_type): try: - result_text = '' - # print(decode_type) self.Ui.Result_text.clear() - text = self.Ui.Source_text.toPlainText().strip() - text_list = [] - if self.Ui.checkBox_line.isChecked(): - if decode_type in ["actionBase64_2_decode"]: - self.Ui.Result_text.appendPlainText("base64自定义暂不支持按行处理!") - return - text_list = text.splitlines() + text = self.Ui.Source_text.toPlainText() + if len(text) <= 0: + self.Ui.Result_text.appendPlainText('请输入一个源字符串!') + return 0 else: - text_list.append(text) + text_list = self.get_text_list(text) for text in text_list: - if text == '': - self.Ui.Result_text.appendPlainText('请输入一个源字符串!') - return 0 - else: - result_text = getattr(self, decode_type)(text) - if result_text == "exit": - return - elif result_text != "": - self.Ui.Result_text.appendPlainText(str(result_text)) - else: - self.Ui.Result_text.appendPlainText('解码失败!') + status,result_text,type__ = getattr(Class_Binary(), 'exec_Binary')(text, Binary_type) + self.Ui.Result_text.appendPlainText(str(result_text)) except Exception as e: self.Ui.Result_text.appendPlainText(str(e)) - # print(e) - pass - - def actionURL_decode(self, text): - try: - encode_type = self.Ui.encode_type.currentText() - result_text = str(urllib.parse.unquote(text, encode_type)) - except Exception as e: - result_text = '解码失败' - return result_text - - def actionUnicode_decode(self, text): - try: - encode_type = self.Ui.encode_type.currentText() - result_text = bytes(text, encoding=encode_type).decode('unicode_escape') - except Exception as e: - result_text = '解码失败' - - return result_text - - def actionEscape_U_decode(self, text): - try: - encode_type = self.Ui.encode_type.currentText() - text = text.replace('%u', '\\u').replace('%U', '\\u') - result_text = bytes(text, encoding=encode_type).decode('unicode_escape') - except Exception as e: - result_text = '解码失败' - - return result_text - - def actionHtmlEncode_decode(self, text): - try: - result_text = html.unescape(text) - except Exception as e: - result_text = '解码失败' - return result_text - - def actionASCII_2_decode(self, text): - try: - text = self.get_split_data(text) - # print(text) - result = '' - for i in text: - if i != '': - # print(i) - # print(chr(int(i))) - result = result + chr(int(i, 2)) - result_text = result - except Exception as e: - result_text = '解码失败' - return result_text - - def actionASCII_8_decode(self, text): - try: - text = self.get_split_data(text) - # print(text) - result = '' - for i in text: - if i != '': - # print(i) - # print(chr(int(i))) - result = result + chr(int(i, 8)) - result_text = result - except Exception as e: - result_text = '解码失败' - return result_text - - def actionASCII_10_decode(self, text): - try: - text = self.get_split_data(text) - # print(text) - result = '' - for i in text: - if i != '': - # print(i) - # print(chr(int(i))) - result = result + chr(int(i)) - result_text = result - except Exception as e: - result_text = '解码失败' - return result_text - def actionASCII_16_decode(self, text): - try: - text = self.get_split_data(text) - # print(text) - result = '' - for i in text: - if i != '': - # print(i) - # print(chr(int(i))) - result = result + chr(int(i, 16)) - result_text = result - except Exception as e: - result_text = '解码失败' - return result_text - - def actionJsFuck_decode(self, text): - ctx = execjs.compile(""" - function decode(source) { - output = '' - if (source.length > 0) - { - l = '' - - if (source.length > 3 && source.slice(source.length-3) == ')()') - { - //eval-ed - s = source.slice(0, source.length - 2) - i = s.length - - //first try---------------------------- - while (i--) { - //if ((l = s.slice(i)).split(')').length == l.split('(').length) break - l = s.slice(i) - if (l.split(')').length == l.split('(').length) { - break; - } - } - //------------------------------------- - } - else - { - l = source; - } - - txtResult = eval(l) - return txtResult - - } - } - """) # 获取代码编译完成后的对象 - return ctx.call("decode", text) - - def actionJJEncode_decode(self, text): - js = """ - - var result ='' - function jjdecode(t) - { - //get string from src - - - //clean it - t.replace(/^\\s+|\\s+$/g, ""); - - var startpos; - var endpos; - var gv; - var gvl; - - if (t.indexOf("\\"\\'\\\\\\"+\\'+\\",") == 0) //palindrome check - { - //locate jjcode - startpos = t.indexOf('$$+"\\\\""+') + 8; - endpos = t.indexOf('"\\\\"")())()'); - - //get gv - gv = t.substring((t.indexOf('"\\'\\\\"+\\'+",')+9), t.indexOf("=~[]")); - gvl = gv.length; - } - else - { - //get gv - gv = t.substr(0, t.indexOf("=")); - gvl = gv.length; - - //locate jjcode - startpos = t.indexOf('"\\\\""+') + 5; - endpos = t.indexOf('"\\\\"")())()'); - } - - if (startpos == endpos) - { - alert("No data !"); - return; - } - - //start decoding - var data = t.substring(startpos, endpos); - - //hex decode string - var b=[ "___+", "__$+", "_$_+", "_$$+", "$__+", "$_$+", "$$_+", "$$$+", "$___+", "$__$+", "$_$_+", "$_$$+", "$$__+", "$$_$+", "$$$_+", "$$$$+" ]; - - //lotu - var str_l = "(![]+\\"\\")[" + gv + "._$_]+"; - var str_o = gv + "._$+"; - var str_t = gv + ".__+"; - var str_u = gv + "._+"; - - //0123456789abcdef - var str_hex = gv + "."; - - //s - var str_s = '"'; - var gvsig = gv + "."; - - var str_quote = '\\\\\\\\\\\\"'; - var str_slash = '\\\\\\\\\\\\\\\\'; - - var str_lower = "\\\\\\\\\\"+"; - var str_upper = "\\\\\\\\\\"+" + gv + "._+"; - - var str_end = '"+'; //end of s loop - - - - while(data != "") - { - //l o t u - if (0 == data.indexOf(str_l)) - { - data = data.substr(str_l.length); - out("l"); - continue; - } - else if (0 == data.indexOf(str_o)) - { - data = data.substr(str_o.length); - out("o"); - continue; - } - else if (0 == data.indexOf(str_t)) - { - data = data.substr(str_t.length); - out("t"); - continue; - } - else if (0 == data.indexOf(str_u)) - { - data = data.substr(str_u.length); - out("u"); - continue; - } - - //0123456789abcdef - if (0 == data.indexOf(str_hex)) - { - data = data.substr(str_hex.length); - - //check every element of hex decode string for a match - var i = 0; - for (i = 0; i < b.length; i++) - { - if (0 == data.indexOf(b[i])) - { - data = data.substr( (b[i]).length ); - out(i.toString(16)); - break; - } - } - continue; - } - - //start of s block - if (0 == data.indexOf(str_s)) - { - data = data.substr(str_s.length); - - //check if "R - if (0 == data.indexOf(str_upper)) // r4 n >= 128 - { - data = data.substr(str_upper.length); //skip sig - - var ch_str = ""; - for (j = 0; j < 2; j++) //shouldn't be more than 2 hex chars - { - //gv + "."+b[ c ] - if (0 == data.indexOf(gvsig)) - { - data = data.substr(gvsig.length); //skip gvsig - - for (k = 0; k < b.length; k++) //for every entry in b - { - if (0 == data.indexOf(b[k])) - { - data = data.substr(b[k].length); - ch_str += k.toString(16) + ""; - break; - } - } - } - else - { - break; //done - } - } - - out(String.fromCharCode(parseInt(ch_str,16))); - continue; - } - else if (0 == data.indexOf(str_lower)) //r3 check if "R // n < 128 - { - data = data.substr(str_lower.length); //skip sig - - var ch_str = ""; - var ch_lotux = "" - var temp = ""; - var b_checkR1 = 0; - for (j = 0; j < 3; j++) //shouldn't be more than 3 octal chars - { - - if (j > 1) //lotu check - { - if (0 == data.indexOf(str_l)) - { - data = data.substr(str_l.length); - ch_lotux = "l"; - break; - } - else if (0 == data.indexOf(str_o)) - { - data = data.substr(str_o.length); - ch_lotux = "o"; - break; - } - else if (0 == data.indexOf(str_t)) - { - data = data.substr(str_t.length); - ch_lotux = "t"; - break; - } - else if (0 == data.indexOf(str_u)) - { - data = data.substr(str_u.length); - ch_lotux = "u"; - break; - } - } - - //gv + "."+b[ c ] - if (0 == data.indexOf(gvsig)) - { - temp = data.substr(gvsig.length); - for (k = 0; k < 8; k++) //for every entry in b octal - { - if (0 == temp.indexOf(b[k])) - { - if (parseInt(ch_str + k + "",8) > 128) - { - b_checkR1 = 1; - break; - } - - ch_str += k + ""; - data = data.substr(gvsig.length); //skip gvsig - data = data.substr(b[k].length); - break; - } - } - - if (1 == b_checkR1) - { - if (0 == data.indexOf(str_hex)) //0123456789abcdef - { - data = data.substr(str_hex.length); - - //check every element of hex decode string for a match - var i = 0; - for (i = 0; i < b.length; i++) - { - if (0 == data.indexOf(b[i])) - { - data = data.substr( (b[i]).length ); - ch_lotux = i.toString(16); - break; - } - } - - break; - } - } - } - else - { - break; //done - } - } - - out(String.fromCharCode(parseInt(ch_str,8)) + ch_lotux); - continue; //step out of the while loop - } - else //"S ----> "SR or "S+ - { - - // if there is, loop s until R 0r + - // if there is no matching s block, throw error - - var match = 0; - var n; - - //searching for mathcing pure s block - while(true) - { - n = data.charCodeAt( 0 ); - if (0 == data.indexOf(str_quote)) - { - data = data.substr(str_quote.length); - out('"'); - match += 1; - continue; - } - else if (0 == data.indexOf(str_slash)) - { - data = data.substr(str_slash.length); - out('\\\\'); - match += 1; - continue; - } - else if (0 == data.indexOf(str_end)) //reached end off S block ? + - { - if (match == 0) - { - return("+ no match S block: "+data); - return; - } - data = data.substr(str_end.length); - - break; //step out of the while loop - } - else if (0 == data.indexOf(str_upper)) //r4 reached end off S block ? - check if "R n >= 128 - { - if (match == 0) - { - return("no match S block n>128: "+data); - return; - } - - data = data.substr(str_upper.length); //skip sig - - var ch_str = ""; - var ch_lotux = ""; - for (j = 0; j < 10; j++) //shouldn't be more than 10 hex chars - { - - if (j > 1) //lotu check - { - if (0 == data.indexOf(str_l)) - { - data = data.substr(str_l.length); - ch_lotux = "l"; - break; - } - else if (0 == data.indexOf(str_o)) - { - data = data.substr(str_o.length); - ch_lotux = "o"; - break; - } - else if (0 == data.indexOf(str_t)) - { - data = data.substr(str_t.length); - ch_lotux = "t"; - break; - } - else if (0 == data.indexOf(str_u)) - { - data = data.substr(str_u.length); - ch_lotux = "u"; - break; - } - } - - //gv + "."+b[ c ] - if (0 == data.indexOf(gvsig)) - { - data = data.substr(gvsig.length); //skip gvsig - - for (k = 0; k < b.length; k++) //for every entry in b - { - if (0 == data.indexOf(b[k])) - { - data = data.substr(b[k].length); - ch_str += k.toString(16) + ""; - break; - } - } - } - else - { - break; //done - } - } - - out(String.fromCharCode(parseInt(ch_str,16))); - break; //step out of the while loop - } - else if (0 == data.indexOf(str_lower)) //r3 check if "R // n < 128 - { - if (match == 0) - { - return("no match S block n<128: "+data); - return; - } - - data = data.substr(str_lower.length); //skip sig - - var ch_str = ""; - var ch_lotux = "" - var temp = ""; - var b_checkR1 = 0; - for (j = 0; j < 3; j++) //shouldn't be more than 3 octal chars - { - - if (j > 1) //lotu check - { - if (0 == data.indexOf(str_l)) - { - data = data.substr(str_l.length); - ch_lotux = "l"; - break; - } - else if (0 == data.indexOf(str_o)) - { - data = data.substr(str_o.length); - ch_lotux = "o"; - break; - } - else if (0 == data.indexOf(str_t)) - { - data = data.substr(str_t.length); - ch_lotux = "t"; - break; - } - else if (0 == data.indexOf(str_u)) - { - data = data.substr(str_u.length); - ch_lotux = "u"; - break; - } - } - - //gv + "."+b[ c ] - if (0 == data.indexOf(gvsig)) - { - temp = data.substr(gvsig.length); - for (k = 0; k < 8; k++) //for every entry in b octal - { - if (0 == temp.indexOf(b[k])) - { - if (parseInt(ch_str + k + "",8) > 128) - { - b_checkR1 = 1; - break; - } - - ch_str += k + ""; - data = data.substr(gvsig.length); //skip gvsig - data = data.substr(b[k].length); - break; - } - } - - if (1 == b_checkR1) - { - if (0 == data.indexOf(str_hex)) //0123456789abcdef - { - data = data.substr(str_hex.length); - - //check every element of hex decode string for a match - var i = 0; - for (i = 0; i < b.length; i++) - { - if (0 == data.indexOf(b[i])) - { - data = data.substr( (b[i]).length ); - ch_lotux = i.toString(16); - break; - } - } - } - } - } - else - { - break; //done - } - } - - out(String.fromCharCode(parseInt(ch_str,8)) + ch_lotux); - break; //step out of the while loop - } - else if( (0x21 <= n && n <= 0x2f) || (0x3A <= n && n <= 0x40) || ( 0x5b <= n && n <= 0x60 ) || ( 0x7b <= n && n <= 0x7f ) ) - { - out(data.charAt( 0 )); - data = data.substr( 1 ); - match += 1; - } - - } - continue; - } - } - - return("no match : "+data); - break; - } - return result - - } - - function out(s) - { - result+=s; - - }""" # 获取代码编译完成后的对象 - js_dr = js2py.EvalJs() - # 执行js代码 - js_dr.execute(js) - result = js_dr.jjdecode(text) - return result - - def actionAAEncode_decode(self, text): - js = """ - function aadecode( text ) - { - var evalPreamble = "(\uFF9F\u0414\uFF9F) ['_'] ( (\uFF9F\u0414\uFF9F) ['_'] ("; - var decodePreamble = "( (\uFF9F\u0414\uFF9F) ['_'] ("; - var evalPostamble = ") (\uFF9F\u0398\uFF9F)) ('_');"; - var decodePostamble = ") ());"; - - // strip beginning/ending space. - text = text.replace(/^\s*/, "").replace(/\s*$/, ""); - - // returns empty text for empty input. - if (/^\s*$/.test(text)) { - return ""; - } - // check if it is encoded. - if (text.lastIndexOf(evalPreamble) < 0) { - throw new Error("Given code is not encoded as aaencode."); - } - if (text.lastIndexOf(evalPostamble) != text.length - evalPostamble.length) { - throw new Error("Given code is not encoded as aaencode."); - } - - var decodingScript = text.replace(evalPreamble, decodePreamble).replace(evalPostamble, decodePostamble); - return eval(decodingScript); - }""" # 获取代码编译完成后的对象 - js_dr = js2py.EvalJs() - # 执行js代码 - js_dr.execute(js) - result = js_dr.aadecode(text) - return result - - # 得到分割数据 返回list - def get_split_data(self, text): - if ':' in text: - text = text.split(":") - elif ' ' in text: - text = text.split(" ") - elif ';' in text: - text = text.split(";") - elif ',' in text: - text = text.split(",") - else: - list22 = [] - list22.append(text) - text = list22 - return text - - def actionBase16_decode(self, text): - try: - encode_type = self.Ui.encode_type.currentText() - text = text.upper() - text = base64.b16decode(text.encode(encode_type)) - result_text = str(text, encoding=encode_type) - except Exception as e: - result_text = '解码失败' - return result_text - - def actionBase32_decode(self, text): - try: - encode_type = self.Ui.encode_type.currentText() - text = base64.b32decode(text.encode(encode_type)) - result_text = str(text, encoding=encode_type) - except Exception as e: - result_text = '解码失败' - return result_text - - def actionBase36_decode(self, text): - try: - text = base36.dumps(int(text)) # 解密 - result_text = str(text) - except Exception as e: - result_text = '解码失败' - return result_text - - def actionBase58_decode(self, text): - try: - encode_type = self.Ui.encode_type.currentText() - result_text = base58.b58decode(text).decode(encode_type) # 解密 - except Exception as e: - result_text = '解码失败' - return result_text - - def actionBase62_decode(self, text): - try: - result_text = base62.decode(text) - except: - result_text = '解码失败' - return result_text - - def actionBase64_decode(self, text): + def gogogo(self, func_name, class_name="Encode"): try: + self.Ui.Result_text.clear() + text = self.Ui.Source_text.toPlainText().strip() + if len(text) <= 0: + self.Ui.Result_text.appendPlainText('请输入一个源字符串!') + return 0 + else: + text_list = self.get_text_list(text) encode_type = self.Ui.encode_type.currentText() - text = base64.b64decode(text.encode(encode_type)) - result_text = str(text, encoding=encode_type) - except Exception as e: - result_text = '解码失败' - return result_text - - def actionBase64_2_decode(self, text): - self.WChild_base64 = Ui_KEY1() - self.dialog = QtWidgets.QDialog(self) - self.WChild_base64.setupUi(self.dialog) - self.dialog.setWindowTitle("base64自定义") - self.WChild_base64.label.setText("请输入编码表:") - self.dialog.show() - self.WChild_base64.keyenter.clicked.connect(self.base64_zidingyi_decode) - return 'exit' - - def base64_zidingyi_decode(self): - self.dialog.close() - try: - plain = self.Ui.Source_text.toPlainText().strip() - n = self.WChild_base64.key.text().strip() - STANDARD_ALPHABET = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - CUSTOM_ALPHABET = n.encode() - DECODE_TRANS = bytes.maketrans(CUSTOM_ALPHABET, STANDARD_ALPHABET) - result_text = base64.b64decode((plain.encode()).translate(DECODE_TRANS)).decode() - self.Ui.Result_text.appendPlainText(result_text) + obj = eval('Class_' + class_name + '()') + for text in text_list: + status,result_text,type__ = getattr(obj, 'func_'+func_name)(encode_type, text) + self.Ui.Result_text.appendPlainText(str(result_text)) except Exception as e: self.Ui.Result_text.appendPlainText(str(e)) - def actionBase85_ASCII85_decode(self, text): - try: - encode_type = self.Ui.encode_type.currentText() - result_text = base64.a85decode(text).decode(encode_type) # 解密 - except Exception as e: - result_text = '解码失败' - return result_text - - def actionBase85_RFC1924_decode(self, text): - try: - encode_type = self.Ui.encode_type.currentText() - result_text = base64.b85decode(text).decode(encode_type) # 解密 - except Exception as e: - result_text = '解码失败' - return result_text - - def actionBase91_decode(self, text): - try: - encode_type = self.Ui.encode_type.currentText() - result_text = base91.decode(text).decode(encode_type) - except Exception as e: - result_text = '解码失败' - return result_text - - def actionBase92_decode(self, text): - try: - result_text = py3base92.decode(text) # 解密 - except Exception as e: - result_text = '解码失败' - return result_text - - def actionHex_Str_decode(self, text): - try: - encode_type = self.Ui.encode_type.currentText() - text = text.replace('0x', '').replace('0X', '') - result_text = str(bytes.fromhex(text), encoding=encode_type) - except Exception as e: - result_text = '解码失败' - return result_text - - def actionShellcode_decode(self, text): - try: - text = text.lower() - if "0x" in text and "\\x" not in text: - text = text.split('0x') - elif "\\x" in text and "0x" not in text: - text = text.split('\\x') - else: - result_text = "请输入正确的格式,如:\n\\x61\\x00\\x62\\x00\\x63\n0x610x000x620x000x63" - return result_text - result = '' - for i in text: - if i != '': - result = result + chr(int(i, 16)) - result_text = result - except Exception as e: - result_text = '解码失败' - return result_text - - def actionQwerty_decode(self, text): - try: - letter = { - 'q': 'a', 'w': 'b', 'e': 'c', 'r': 'd', 't': 'e', 'y': 'f', 'u': 'g', - 'i': 'h', 'o': 'i', 'p': 'j', 'a': 'k', 's': 'l', 'd': 'm', 'f': 'n', - 'g': 'o', 'h': 'p', 'j': 'q', 'k': 'r', 'l': 's', 'z': 't', - 'x': 'u', 'c': 'v', 'v': 'w', 'b': 'x', 'n': 'y', 'm': 'z', - 'Q': 'A', 'W': 'B', 'E': 'C', 'R': 'D', 'T': 'E', 'Y': 'F', 'U': 'G', - 'I': 'H', 'O': 'I', 'P': 'J', 'A': 'K', 'S': 'L', 'D': 'M', 'F': 'N', - 'G': 'O', 'H': 'P', 'J': 'Q', 'K': 'R', 'L': 'S', 'Z': 'T', - 'X': 'U', 'C': 'V', 'V': 'W', 'B': 'X', 'N': 'Y', 'M': 'Z', - } - result_text = '' - for i in range(0, len(text)): - if text[i] != ' ': - result_text = result_text + letter.get(text[i]) - else: - result_text = result_text + ' ' - except Exception as e: - result_text = '解码失败' - return result_text - - def actionbase64_tupian_decode(self, text): + def base64_img_decode(self): try: + text = self.Ui.Source_text.toPlainText().strip() file_name = self.file_save('tupian.jpg') # print(file_name) str2 = base64.b64decode( @@ -2042,8 +604,9 @@ def actionbase64_tupian_decode(self, text): result_text = "转换失败!" return result_text - def actionhex_tupian_decode(self, text): + def hex_img_decode(self): try: + text = self.Ui.Source_text.toPlainText().strip() file_name = self.file_save('hextupian.jpg') # print(file_name) file1 = open(file_name, 'wb') @@ -2057,1012 +620,17 @@ def actionhex_tupian_decode(self, text): pass return result_text - # encrypt - def encrypt(self, encrypt_type): + def Copy_text(self, text): try: - result_text = '' - # print(encrypt_type) - self.Ui.Result_text.clear() - text = self.Ui.Source_text.toPlainText().strip() - text_list = [] - if self.Ui.checkBox_line.isChecked(): - if encrypt_type in ["action_zhalan_encrypt", "action_zhalan_w_encrypt", "action_sifang_encrypt", - "action_fangshe_encrypt", "action_weinijiya_encrypt"]: - self.Ui.Result_text.appendPlainText("此加密暂不支持按行处理!") - return - text_list = text.splitlines() - else: - text_list.append(text) - for text in text_list: - if text == '': - self.Ui.Result_text.appendPlainText('请输入一个源字符串!') - return - else: - result_text = getattr(self, encrypt_type)(text) - if result_text == "exit": - return - elif result_text != "": - self.Ui.Result_text.appendPlainText(result_text) - else: - self.Ui.Result_text.appendPlainText('加密失败!') - except: - self.Ui.Result_text.appendPlainText('加密失败!') - - def actionRot13_encrypt(self, text): - d = {chr(i + c): chr((i + 13) % 26 + c) for i in range(26) for c in (65, 97)} - result_text = ''.join([d.get(c, c) for c in text]) - return result_text - - def action_kaisa_encrypt(self, text): - - t = "" - for c in text: - if 'a' <= c <= 'z': # str是可以直接比较的 - t += chr(ord('a') + ((ord(c) - ord('a')) + 3) % 26) - elif 'A' <= c <= 'Z': - t += chr(ord('A') + ((ord(c) - ord('A')) + 3) % 26) - else: - t += c - result_text = t - return result_text - - def action_zhalan_encrypt(self, text): - self.WChild_zhalan = Ui_KEY1() - self.dialog = QtWidgets.QDialog(self) - self.WChild_zhalan.setupUi(self.dialog) - self.dialog.setWindowTitle("栅栏密码") - self.WChild_zhalan.label.setText("请输入栏数:") - self.dialog.show() - self.WChild_zhalan.keyenter.clicked.connect(self.zhalanEncrypto) - return "exit" - - def action_zhalan_w_encrypt(self, text): - - self.WChild_zhalan = Ui_KEY1() - self.dialog = QtWidgets.QDialog(self) - self.WChild_zhalan.setupUi(self.dialog) - self.dialog.setWindowTitle("栅栏密码(W型)") - self.WChild_zhalan.label.setText("请输入栏数:") - self.dialog.show() - self.WChild_zhalan.keyenter.clicked.connect(self.zhalan_w_Encrypto) - return "exit" - - def action_peigen_encrypt(self, text): - CODE_TABLE = { # 培根字典 - 'aaaaa': 'a', 'aaaab': 'b', 'aaaba': 'c', 'aaabb': 'd', 'aabaa': 'e', 'aabab': 'f', 'aabba': 'g', - 'aabbb': 'h', 'abaaa': 'i', 'abaab': 'j', 'ababa': 'k', 'ababb': 'l', 'abbaa': 'm', 'abbab': 'n', - 'abbba': 'o', 'abbbb': 'p', 'baaaa': 'q', 'baaab': 'r', 'baaba': 's', 'baabb': 't', 'babaa': 'u', - 'babab': 'v', 'babba': 'w', 'babbb': 'x', 'bbaaa': 'y', 'bbaab': 'z' - } - str = text.lower() - listStr = '' - for i in str: - if i in CODE_TABLE.values(): - # 将键、值各化为一个列表,取出i在value的位置后根据下标找到对应的键 - listStr += list(CODE_TABLE.keys())[list(CODE_TABLE.values()).index(i)] - result_text = listStr.upper() # 大写输出 - return result_text - - def action_mosi_encrypt(self, text): - - CODE = {'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': '--..', - '0': '-----', '1': '.----', '2': '..---', - '3': '...--', '4': '....-', '5': '.....', - '6': '-....', '7': '--...', '8': '---..', - '9': '----.', '?': '..--..', '/': '-..-.', - '()': '-.--.-', '-': '-....-', '.': '.-.-.-' - } - msg = '' - for char in text.upper(): - if char in CODE: - if char == ' ': - pass - else: - msg += (CODE[char.upper()] + ' ') - else: - msg = '文本中含有不能识别的字符!' - result_text = msg - - return result_text - - def action_yunying_encrypt(self, text): - charList = [chr(i) for i in range(ord('A'), ord('Z') + 1)] - cipher = [i for i in text.upper()] - tmp = [] - ret = [] - for i in range(len(cipher)): - for j in range(len(charList)): - if charList[j] == cipher[i]: - tmp.append(j + 1) - for i in tmp: - res = '' - if i >= 8: - for j in range(0, int(i / 8)): - res += '8' - if i % 8 >= 4: - for j in range(0, int(i % 8 / 4)): - res += '4' - if i % 4 >= 2: - for j in range(0, int(i % 4 / 2)): - res += '2' - if i % 2 >= 1: - for j in range(0, int(i % 2 / 1)): - res += '1' - ret.append(res + '0') - result_text = ''.join(ret)[:-1] - return result_text - - def action_sifang_encrypt(self, text): - self.WChild = Ui_KEY2() - self.dialog = QtWidgets.QDialog(self) - self.WChild.setupUi(self.dialog) - self.dialog.setWindowTitle("四方密码") - self.WChild.key_1.setText("Key square 1:") - self.WChild.keyl_2.setText("Key square 2:") - self.dialog.show() - self.WChild.enter.clicked.connect(self.sifang_encrypt) - return 'exit' - - def action_dangpu_encrypt(self, text): - mapping_data = [['田'], ['由'], ['中'], ['人'], ['工'], ['大'], ['王'], ['夫'], ['井'], ['羊']] - try: - result = [] - for c in text: - c_list = mapping_data[int(c)] - c_index = random.randint(0, len(c_list) - 1) - result.append(c_list[c_index]) - result_text = ''.join(result) - except: - result_text = '未找到该字符串对应的中文!' - return result_text - - def action_fangshe_encrypt(self, text): - self.WChild = Ui_KEY2() - self.dialog = QtWidgets.QDialog(self) - self.WChild.setupUi(self.dialog) - self.dialog.setWindowTitle("仿射密码") - self.WChild.key_1.setText("a:") - self.WChild.keyl_2.setText("b:") - self.dialog.show() - self.WChild.enter.clicked.connect(self.fangshe_encrypt) - return 'exit' - - def action_weinijiya_encrypt(self, text): - self.WChild = Ui_KEY1() - self.dialog = QtWidgets.QDialog(self) - self.WChild.setupUi(self.dialog) - self.dialog.setWindowTitle("维吉尼亚密码") - self.WChild.label.setText("Keyword:") - self.dialog.show() - self.WChild.keyenter.clicked.connect(self.VigenereEncrypto) - return 'exit' - - def action_Atbash_encrypt(self, text): - str1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - str2 = "zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA" - result_text = "" - for s in text: - if s in str1: - if s != ' ': - result_text = result_text + str2[str1.index(s)] - else: - result_text = result_text + ' ' - else: - result_text = '埃特巴什码只能对英文字母加密!' - return result_text - - def zhalan_w_encode(self, string, n): - '''加密''' - array = self.generate_w(string, n) - msg = [] - for row in range(n): # 将每行的字符连起来 - for col in range(len(string)): - if array[row][col] != '.': - msg.append(array[row][col]) - return array, msg - - def generate_w(self, string, n): - '''将字符排列成w型''' - array = [['.'] * len(string) for i in range(n)] # 生成初始矩阵 - row = 0 - upflag = False - for col in range(len(string)): # 在矩阵上按w型画出string - array[row][col] = string[col] - if row == n - 1: - upflag = True - if row == 0: - upflag = False - if upflag: - row -= 1 - else: - row += 1 - return array - - def VigenereEncrypto(self): - try: - self.dialog.close() - text = self.Ui.Source_text.toPlainText().strip().lower() - key = self.WChild.key.text() - ptLen = len(text) - keyLen = len(key) - if keyLen == 0: - self.Ui.Result_text.appendPlainText('请输入一个合法的key!') - return - quotient = ptLen // keyLen # 商 - remainder = ptLen % keyLen # 余 - out = "" - for i in range(0, quotient): - for j in range(0, keyLen): - c = int((ord(text[i * keyLen + j]) - ord('a') + ord(key[j]) - ord('a')) % 26 + ord('a')) - # global output - out += chr(c) - - for i in range(0, remainder): - c = int((ord(text[quotient * keyLen + i]) - ord('a') + ord(key[i]) - ord('a')) % 26 + ord('a')) - # global output - out += chr(c) - - if out != '': - self.Ui.Result_text.appendPlainText(out) - return - else: - self.Ui.Result_text.appendPlainText('加密失败!') - except Exception as e: - self.Ui.Result_text.appendPlainText(str(e)) - - def sifang_encrypt(self): - self.dialog.close() - try: - text = (self.Ui.Source_text.toPlainText().strip()).lower() - key1 = self.WChild.Key1.text().upper() - key2 = self.WChild.Key2.text().upper() - matrix = "ABCDEFGHIJKLMNOPRSTUVWXYZ" - pla = "abcdefghijklmnoprstuvwxyz" - key1 = '[' + key1 + "]" - key2 = '[' + key2 + "]" - key1 = ''.join(collections.OrderedDict.fromkeys(key1)) - key2 = ''.join(collections.OrderedDict.fromkeys(key2)) - matrix1 = re.sub('[\[\]]', '', key1) + re.sub(key1, '', matrix) - matrix2 = re.sub('[\[\]]', '', key2) + re.sub(key2, '', matrix) - matrix_list1 = [] - matrix_list2 = [] - pla_list = [] - for i in range(0, len(matrix1), 5): - matrix_list1.append(list(matrix1[i:i + 5])) - for i in range(0, len(matrix2), 5): - matrix_list2.append(list(matrix2[i:i + 5])) - for i in range(0, len(pla), 5): - pla_list.append(list(pla[i:i + 5])) - pla = text.replace(' ', '') - if len(pla) % 2 != 0: - pla += 'x' - cip = "" - for i in range(0, len(pla), 2): - data = pla[i:i + 2] - # 两个子母中第一个字母位置 - first = self.find_index(data[0], pla_list) - # 两个子母中第二个字母位置 - second = self.find_index(data[1], pla_list) - return_cip = "" - return_cip += matrix_list1[first[0]][second[1]] - return_cip += matrix_list2[second[0]][first[1]] - cip += return_cip - if cip != '': - self.Ui.Result_text.appendPlainText(cip) - else: - # return "加密失败!" - self.Ui.Result_text.appendPlainText('加密失败!') - - except Exception as e: - self.Ui.Result_text.appendPlainText(str(e)) - # print(str(e)) - - def gcd(self, a, b): - if (a < b): - t = a - a = b - b = t - - while (0 != b): - t = a - a = b - b = t % b - return a - - def fangshe_encrypt(self): - self.dialog.close() - try: - letter_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 字母表 - text = (self.Ui.Source_text.toPlainText().strip()) - key1 = self.WChild.Key1.text() - key2 = self.WChild.Key2.text() - # print(text,key2,key1) - try: - if (0 == int(key1.isdigit()) or 0 == int(key2.isdigit())): - self.Ui.Result_text.appendPlainText('输入有误! 密钥为数字!') - return - if (self.gcd(int(key1), 26) != 1): - self.Ui.Result_text.appendPlainText('输入有误! key1和26必须互素!') - return - except: - self.Ui.Result_text.appendPlainText('输入有误!') - return - else: - ciphertext = "" - for ch in text: # 遍历明文 - if ch.isalpha(): # 明文是否为字母,如果是,则判断大小写,分别进行加密 - if ch.isupper(): - ciphertext += letter_list[(int(key1) * (ord(ch) - 65) + int(key2)) % 26] - else: - ciphertext += letter_list[(int(key1) * (ord(ch) - 97) + int(key2)) % 26].lower() - else: # 如果密文不为字母,直接添加到密文字符串里 - ciphertext += ch - self.Ui.Result_text.appendPlainText(ciphertext) - return - except Exception as e: - self.Ui.Result_text.appendPlainText('加密失败!') - return - - # 查询明文字母位置 - def find_index(self, x, pla_list): - for i in range(len(pla_list)): - for j in range(len(pla_list[i])): - if pla_list[i][j] == x: - return i, j - - def zhalan_w_Encrypto(self): - msg = '' - self.dialog.close() - plain = self.Ui.Source_text.toPlainText().strip() - try: - array, msg = self.zhalan_w_encode(plain, int(self.WChild_zhalan.key.text())) - except Exception as e: - self.Ui.Result_text.appendPlainText(str(e)) - self.Ui.Result_text.appendPlainText(str(''.join(msg))) - return - - def zhalanEncrypto(self): - self.dialog.close() - plain = self.Ui.Source_text.toPlainText().strip() - try: - n = int(self.WChild_zhalan.key.text()) - ans = '' - for i in range(n): - for j in range(int(plain.__len__() / n + 0.5)): - try: - ans += plain[j * n + i] - except: - pass - except: - ans = "请输入正确的分组!" - if ans != '': - self.Ui.Result_text.appendPlainText(ans) - return - else: - self.Ui.Result_text.appendPlainText("加密失败!") - return - - # decrypt - def decrypt(self, decrypt_type): - try: - self.Ui.Result_text.clear() - text = self.Ui.Source_text.toPlainText().strip() - text_list = [] - if self.Ui.checkBox_line.isChecked(): - if decrypt_type in ["action_zhalan_decrypt", "action_zhalan_w_decrypt", "action_sifang_decrypt", - "action_fangshe_decrypt", "action_weinijiya_decrypt"]: - self.Ui.Result_text.appendPlainText("此加密暂不支持按行处理!") - return - text_list = text.splitlines() - else: - text_list.append(text) - for text in text_list: - # print(decrypt_type) - if text == '': - self.Ui.Result_text.appendPlainText('请输入一个源字符串!') - return 0 - else: - result_text = getattr(self, decrypt_type)(text) - if result_text == 'exit': - pass - else: - self.Ui.Result_text.appendPlainText(result_text) - except Exception as e: - self.Ui.Result_text.appendPlainText(str(e)) - - def actionRot13_decrypt(self, text): - try: - PAIRS = { - "a": "n", "b": "o", "c": "p", "d": "q", "e": "r", - "f": "s", "g": "t", "h": "u", "i": "v", "j": "w", - "k": "x", "l": "y", "m": "z", "n": "a", "o": "b", - "p": "c", "q": "d", "r": "e", "s": "f", "t": "g", - "u": "h", "v": "i", "w": "j", "x": "k", "y": "l", - "z": "m", "A": "N", "B": "O", "C": "P", "D": "Q", - "E": "R", "F": "S", "G": "T", "H": "U", "I": "V", - "J": "W", "K": "X", "L": "Y", "M": "Z", "N": "A", - "O": "B", "P": "C", "Q": "D", "R": "E", "S": "F", - "T": "G", "U": "H", "V": "I", "W": "J", "X": "K", - "Y": "L", "Z": "M" - } - result_text = "".join(PAIRS.get(c, c) for c in text) - except Exception as e: - result_text = '解密失败' - return result_text - - def action_kaisa_decrypt(self, text): - try: - t = "" - for c in text: - if 'a' <= c <= 'z': # str是可以直接比较的 - t += chr(ord('a') + ((ord(c) - ord('a')) - 3) % 26) - elif 'A' <= c <= 'Z': - t += chr(ord('A') + ((ord(c) - ord('A')) - 3) % 26) - else: - t += c - result_text = t - except Exception as e: - result_text = '解密失败' - return result_text - - def action_zhalan_decrypt(self, text): - try: - result_text = '' - factors = [fac for fac in range(2, len(text)) if len(text) % fac == 0] # 取得密文长度的所有因数 - for fac in factors: - flag = '' - for i in range(fac): # 按一定的步长取几组字符,并连接起来,这里组数就等于步长数 - flag += text[i::fac] - result_text += "分为%s栏,解密结果为:%s\n" % (fac, flag) - except Exception as e: - result_text = '解密失败' - return result_text - - def action_zhalan_w_decrypt(self, text): - try: - result_text = '' - for n in range(2, len(text)): # 遍历所有可能的栏数 - # print(str(n) + '栏:' + ''.join(self.zhanlan_w_decode(text, n)[1])) - result_text += "分为%s栏,解密结果为:%s\n" % (str(n), ''.join(self.zhanlan_w_decode(text, n)[1])) - except Exception as e: - result_text = '解密失败' - return result_text - - def action_peihen_decrypt(self, text): - try: - return_str = '' - dicts = {'aabbb': 'H', 'aabba': 'G', 'baaab': 'R', 'baaaa': 'Q', 'bbaab': 'Z', 'bbaaa': 'Y', - 'abbab': 'N', - 'abbaa': 'M', 'babaa': 'U', 'babab': 'V', 'abaaa': 'I', 'abaab': 'J', 'aabab': 'F', - 'aabaa': 'E', - 'aaaaa': 'A', 'aaaab': 'B', 'baabb': 'T', 'baaba': 'S', 'aaaba': 'C', 'aaabb': 'D', - 'abbbb': 'P', - 'abbba': 'O', 'ababa': 'K', 'ababb': 'L', 'babba': 'W', 'babbb': 'X'} - sums = len(text) - j = 5 ##每5个为一组 - for i in range(int(sums / j)): - result = text[j * i:j * (i + 1)].lower() - return_str += str(dicts[result], ) - result_text = return_str - except Exception as e: - result_text = '解密失败' - return result_text - - def action_mosi_decrypt(self, text): - try: - dict = {'.-': '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', '.----': '1', '..---': '2', - '...--': '3', '....-': '4', '.....': '5', '-....': '6', - '--...': '7', '---..': '8', '----.': '9', '-----': '0', - '..--..': '?', '-..-.': '/', '-.--.-': '()', '-....-': '-', - '.-.-.-': '.', '..--.-': '_' - } - msg = '' - if ' ' in text: - split_str = ' ' - elif '/' in text: - split_str = '/' - else: - split_str = text.replace('.', '').replace('-', '')[0:1] - s = text.split(split_str) - for item in s: - if item != '' and item != ' ': - if item in dict.keys(): - msg += (dict[item]) - else: - msg += ("(部分解密失败:" + item + ")") - result_text = msg - except Exception as e: - result_text = '解密失败' - return result_text - - def action_yiwei_decrypt(self, text): - try: - inputStr = text - # - result = '' - for j in range(26): - result_list = [] - for i, num in zip(inputStr, range(len(inputStr))): - # print(i) - if i.islower: - caseS1 = string.ascii_lowercase * 2 - if i in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": - caseS1 = string.ascii_uppercase * 2 - status = caseS1.find(i) - if status != -1: - result_list.append(caseS1[status + j]) - else: - result_list.append(inputStr[num]) - text2 = ("".join(result_list), "向右偏移了{}位".format(j)) - result += text2[0] + ' ' + text2[1] + '\n' - result_text = result - except Exception as e: - result_text = '解密失败' - return result_text - - def action_yunxing_decrypt(self, text): - try: - other_letters = [] - for s in text: - if not ['0', '1', '2', '4', '8'].count(s): - other_letters.append(s) - if other_letters: - result_text = '加密字符串内只能包含0、1、2、4、8' - else: - result_text = '' - charList = [chr(i) for i in range(ord('A'), ord('Z') + 1)] - ret = [] - plaintext = [i for i in text.split('0')] - for i in plaintext: - tmp = 0 - for j in range(len(i)): - tmp += int(i[j]) - ret.append(charList[tmp - 1]) - result_text = ''.join(ret) - except Exception as e: - result_text = '解密失败' - return result_text - - def action_dangpu_decry(self, text): - try: - result_text = '' - mapping_data = {'田': 0, '由': 1, '中': 2, '人': 3, '工': 4, '大': 5, '王': 6, '夫': 7, '井': 8, '羊': 9} - for i in text: - if i in mapping_data.keys(): - result_text += str(mapping_data[i]) - else: - result_text += str(i) - except Exception as e: - result_text = '解密失败' - return result_text - - def action_sifang_decrypt(self, text): - self.WChild = Ui_KEY2() - self.dialog = QtWidgets.QDialog(self) - self.WChild.setupUi(self.dialog) - self.dialog.setWindowTitle("四方密码") - self.WChild.key_1.setText("Key square 1:") - self.WChild.keyl_2.setText("Key square 2:") - self.dialog.show() - self.WChild.enter.clicked.connect(self.sifang_decrypt) - return 'exit' - - def action_fangshe_decrypt(self, text): - self.WChild = Ui_KEY2() - self.dialog = QtWidgets.QDialog(self) - self.WChild.setupUi(self.dialog) - self.dialog.setWindowTitle("仿射密码") - self.WChild.key_1.setText("a:") - self.WChild.keyl_2.setText("b:") - self.dialog.show() - self.WChild.enter.clicked.connect(self.fangshe_decrypt) - return 'exit' - - def action_weinijiya_decrypt(self, text): - self.WChild = Ui_KEY1() - self.dialog = QtWidgets.QDialog(self) - self.WChild.setupUi(self.dialog) - self.dialog.setWindowTitle("维吉尼亚密码") - self.WChild.label.setText("Keyword:") - self.dialog.show() - self.WChild.keyenter.clicked.connect(self.VigenereDecrypto) - return 'exit' - - def action_Atbash_decrypt(self, text): - try: - str1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - str2 = "zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA" - result_text = "" - for s in text: - if s in str1: - if s != ' ': - result_text = result_text + str1[str2.index(s)] - else: - result_text = result_text + ' ' - else: - result_text = result_text + s - except Exception as e: - result_text = '解密失败' - return result_text - - def VigenereDecrypto(self): - try: - self.dialog.close() - letter_list = string.ascii_uppercase - letter_list2 = string.ascii_lowercase - message = self.Ui.Source_text.toPlainText().strip() - key = self.WChild.key.text() - if len(key) == 0: - self.Ui.Result_text.appendPlainText('请输入一个合法的key!') - return - key_list = [] - for i in key: - key_list.append(ord(i.upper()) - 65) - plaintext = "" - flag = 0 - for cipher in message: - if flag % len(key_list) == 0: - flag = 0 - if cipher.isalpha(): - if cipher.isupper(): - plaintext += letter_list[(ord(cipher) - 65 - key_list[flag]) % 26] - flag += 1 - if cipher.islower(): - plaintext += letter_list2[(ord(cipher) - 97 - key_list[flag]) % 26] - flag += 1 - else: - plaintext += cipher - if plaintext != '': - # return plaintext - self.Ui.Result_text.appendPlainText(plaintext) - else: - # return '解密失败!' - self.Ui.Result_text.appendPlainText('解密失败!') - except Exception as e: - # return str(e) - self.Ui.Result_text.appendPlainText(str(e)) - - def sifang_decrypt(self): - self.dialog.close() - try: - text = (self.Ui.Source_text.toPlainText().strip()).upper() - key1 = self.WChild.Key1.text().upper() - key2 = self.WChild.Key2.text().upper() - matrix = "ABCDEFGHIJKLMNOPRSTUVWXYZ" - pla = "abcdefghijklmnoprstuvwxyz" - key1 = '[' + key1 + "]" - key2 = '[' + key2 + "]" - key1 = ''.join(collections.OrderedDict.fromkeys(key1)) - key2 = ''.join(collections.OrderedDict.fromkeys(key2)) - matrix1 = re.sub('[\[\]]', '', key1) + re.sub(key1, '', matrix) - matrix2 = re.sub('[\[\]]', '', key2) + re.sub(key2, '', matrix) - matrix_list1 = [] - matrix_list2 = [] - pla_list = [] - # print(matrix1) - for i in range(0, len(matrix1), 5): - matrix_list1.append(list(matrix1[i:i + 5])) - for i in range(0, len(matrix2), 5): - matrix_list2.append(list(matrix2[i:i + 5])) - for i in range(0, len(pla), 5): - pla_list.append(list(pla[i:i + 5])) - cip = text.replace(' ', '') - result = '' - for i in range(0, len(cip), 2): - letter = cip[i:i + 2] - # 两个子母中第一个字母位置 - first = self.find_index1(letter[0], matrix_list1) - - # 两个子母中第二个字母位置 - second = self.find_index2(letter[1], matrix_list2) - - return_pla = "" - return_pla += pla_list[first[0]][second[1]] - return_pla += pla_list[second[0]][first[1]] - result += return_pla - if result != '': - self.Ui.Result_text.appendPlainText(result) - else: - self.Ui.Result_text.appendPlainText('解密失败!') - - except Exception as e: - self.Ui.Result_text.appendPlainText(str(e)) - # print(str(e)) - pass - - # 求逆元函数 - def GetInverse(self, a, m): - for i in range(m): - if (1 == (a * i) % m): - return i - return a - - def fangshe_decrypt(self): - self.dialog.close() - try: - key1 = self.WChild.Key1.text() - key2 = self.WChild.Key2.text() - try: - if (0 == int(key1.isdigit()) or 0 == int(key2.isdigit())): - self.Ui.Result_text.appendPlainText('输入有误! 密钥为数字。') - return - if (self.gcd(int(key1), 26) != 1): - key1_list = [] - result = '' - for i in range(0, int(key1)): - if self.gcd(i, 26) == 1: - key1_list.append(i) - for z in key1_list: - result += 'key1:%s' % z + ' 明文:' + self.fangshe_getdecrypt(int(z), int(key2)) + '\n' - - self.Ui.Result_text.appendPlainText('输入有误! key1和26必须互素。以下为爆破key1的结果\n' + result) - return - except: - self.Ui.Result_text.appendPlainText('输入有误!') - return - # self.Ui.Result_text.appendPlainText('输入有误!') - else: - self.Ui.Result_text.appendPlainText(self.fangshe_getdecrypt(int(key1), int(key2))) - except Exception as e: - self.Ui.Result_text.appendPlainText('解密失败。') - # print(str(e)) - pass - - def fangshe_getdecrypt(self, key1, key2): - try: - text = (self.Ui.Source_text.toPlainText().strip()) - letter_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 字母表 - plaintext = "" - for ch in text: # 遍历密文 - if ch.isalpha(): # 密文为否为字母,如果是,则判断大小写,分别进行解密 - if ch.isupper(): - plaintext += letter_list[self.GetInverse(key1, 26) * (ord(ch) - 65 - key2) % 26] - else: - plaintext += letter_list[self.GetInverse(key1, 26) * (ord(ch) - 97 - key2) % 26].lower() - else: # 如果密文不为字母,直接添加到明文字符串里 - plaintext += ch - return plaintext - except: - return - - # 查询两个密文字母位置 - def find_index1(self, x, matrix_list1): - for i in range(len(matrix_list1)): - for j in range(len(matrix_list1[i])): - if matrix_list1[i][j] == x: - return i, j - - def find_index2(self, y, matrix_list2): - for k in range(len(matrix_list2)): - for l in range(len(matrix_list2[k])): - if matrix_list2[k][l] == y: - return k, l - - # Binary - def Binary(self, Binary_type): - try: - result_text = '' - self.Ui.Result_text.clear() - text = self.Ui.Source_text.toPlainText().strip() - text_list = [] - if self.Ui.checkBox_line.isChecked(): - # if Binary_type in ["action_others"]: - # self.Ui.Result_text.appendPlainText("自定义进制暂不支持按行处理!") - # return - text_list = text.splitlines() - else: - text_list.append(text) - if Binary_type == 'action_others': - self.action_get_others(text_list, Binary_type) - else: - self.exec_Binary(text_list, Binary_type) - except Exception as e: - self.Ui.Result_text.appendPlainText(str(e)) - - def exec_Binary(self, text_list, Binary_type): - for text in text_list: - if text == '': - self.Ui.Result_text.appendPlainText('请输入一个源字符串!') - return 0 - else: - all_result = '' - all_n = text.split("\n") - for i in all_n: - all_text = i.split(" ") - for text in all_text: - result_text = getattr(self, Binary_type)(text) - if result_text == 'exit': - pass - else: - all_result += str(result_text).replace('0o', '').replace('0x', '').replace('0b', '') + ' ' - all_result += '\n' - if all_result != "": - self.Ui.Result_text.appendPlainText(all_result.strip()) - else: - self.Ui.Result_text.appendPlainText('转换失败') - - def action2_8(self, text): - try: - result = int(text, 2) - result_text = str(oct(result)) - except Exception as e: - result_text = '您输入的不是2进制' - return result_text - - def action2_10(self, text): - try: - result = int(text, 2) - result_text = str(result) - except Exception as e: - result_text = '您输入的不是2进制' - return result_text - - def action2_16(self, text): - try: - result_text = str(hex(int(text, 2))) - except Exception as e: - result_text = '您输入的不是2进制' - return result_text - - def action8_2(self, text): - try: - result = int(text, 8) - result_text = str(bin(result)) - except Exception as e: - result_text = '您输入的不是8进制' - return result_text - - def action8_10(self, text): - try: - result = int(text, 8) - result_text = str(result) - except Exception as e: - result_text = '您输入的不是8进制' - return result_text - - def action8_16(self, text): - try: - result = int(text, 8) - result_text = str(hex(result)) - except Exception as e: - result_text = '您输入的不是8进制' - return result_text - - def action10_2(self, text): - try: - s = int(text) - result_text = str(bin(s)) - except Exception as e: - result_text = '您输入的不是10进制' - return result_text - - def action10_8(self, text): - try: - s = int(text) - result_text = str(oct(s)) - except Exception as e: - result_text = '您输入的不是10进制' - return result_text - - def action10_16(self, text): - try: - s = int(text) - result_text = str(hex(s)) - except Exception as e: - result_text = '您输入的不是10进制' - return result_text - - def action16_2(self, text): - try: - result_text = str(bin(int(text, 16))) - except Exception as e: - result_text = '您输入的不是16进制' - return result_text - - def action16_8(self, text): - try: - result = int(text, 16) - result_text = str(oct(result)) - except Exception as e: - result_text = '您输入的不是16进制' - return result_text - - def action16_10(self, text): - try: - result = int(text, 16) - result_text = str(result) - except Exception as e: - result_text = '您输入的不是16进制' - return result_text - - def action_get_others(self, textlist, Binary_type): - self.Binary_dialog = Ui_Binary() - self.dialog = QtWidgets.QDialog(self) - self.dialog.setWindowTitle("自定义转换") - self.Binary_dialog.setupUi(self.dialog) - self.dialog.show() - self.Binary_dialog.enter.clicked.connect(lambda: self.Binary_return_zidingyi_result(textlist, Binary_type)) - - def Binary_return_zidingyi_result(self, text_list, Binary_type): - global Binary_others_source, Binary_others_result - Binary_others_source = self.Binary_dialog.Source.text() - Binary_others_result = self.Binary_dialog.result.text() - self.dialog.close() - self.exec_Binary(text_list, Binary_type) - - def action_others(self, text): - try: - return_Data = '' - if Binary_others_source != '' and Binary_others_result != '': - all_text = text.split(" ") - all_result = '' - for text in all_text: - # # print(text) - from_ = int(Binary_others_source) - to_ = int(Binary_others_result) - # from_进制转换为十进制 - ten_num = sum([int(i) * from_ ** n for n, i in enumerate(text[::-1])]) - # print(ten_num) - # 十进制转换为to_进制 - a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'b', 'C', 'D', 'E', 'F'] - b = [] - while True: - s = ten_num // to_ # 商 - y = ten_num % to_ # 余数 - b = b + [y] - if s == 0: - break - ten_num = s - b.reverse() - for i in b: - return_Data += str(a[i]) - all_result += return_Data + ' ' - return all_result - # self.Ui.Result_text.appendPlainText(all_result) - except Exception as e: - print(str(e)) - pass - - def Copy_text(self, text): - try: - if text == 'Source': - data = self.Ui.Source_text.toPlainText().strip() - if text == 'result': - data = self.Ui.Result_text.toPlainText() - # 访问剪切板,存入值 - pyperclip.copy(data) - except Exception as e: - pass - - def zhanlan_w_decode(self, string, n): - '''解密''' - array = self.generate_w(string, n) - sub = 0 - for row in range(n): # 将w型字符按行的顺序依次替换为string - for col in range(len(string)): - if array[row][col] != '.': - array[row][col] = string[sub] - sub += 1 - msg = [] - for col in range(len(string)): # 以列的顺序依次连接各字符 - for row in range(n): - if array[row][col] != '.': - msg.append(array[row][col]) - return array, msg + data = '' + if text == 'Source': + data = self.Ui.Source_text.toPlainText().strip() + if text == 'result': + data = self.Ui.Result_text.toPlainText() + # 访问剪切板,存入值 + pyperclip.copy(data) + except Exception as e: + pass def paste(self, text): try: @@ -3097,7 +665,7 @@ def Update(self): # 文件打开对话框 def file_open(self, type): - fileName, selectedFilter = QFileDialog.getOpenFileName(self, (r"上传文件"), (r"C:\windows"), type) + fileName, selectedFilter = QFileDialog.getOpenFileName(self, (r"上传文件"), (r""), type) return (fileName) # 返回文件路径 # 保存文件对话框 @@ -3117,95 +685,6 @@ def closeEvent(self, event): except: QMessageBox.critical(self, 'False', "配置文件保存失败!") - def str_place(self): - self.WChild_replace = Ui_KEY2() - self.dialog = QtWidgets.QDialog(self) - self.WChild_replace.setupUi(self.dialog) - self.dialog.setWindowTitle("替换") - self.WChild_replace.key_1.setText("查找内容:") - self.WChild_replace.keyl_2.setText("替换内容:") - self.WChild_replace.enter.setText("替换输入文本") - self.WChild_replace.quxiao.setText("替换输出文本") - self.dialog.show() - self.WChild_replace.enter.clicked.connect(lambda: self.str_replace("Source")) - self.WChild_replace.quxiao.clicked.connect(lambda: self.str_replace("Result")) - - def str_chaifen(self): - self.WChild_chaifen = Ui_KEY1() - self.dialog = QtWidgets.QDialog(self) - self.WChild_chaifen.setupUi(self.dialog) - self.dialog.setWindowTitle("字符串长度拆分") - self.WChild_chaifen.label.setText("请输入字符串长度:") - self.dialog.show() - self.WChild_chaifen.keyenter.clicked.connect(self.str_chaifen_chuli) - - def str_chaifen_chuli(self): - text = self.Ui.Source_text.toPlainText().strip() - try: - changdu = int(self.WChild_chaifen.key.text()) - except: - return_text = '请输入一个数字。' - self.Ui.Result_text.appendPlainText(str(return_text)) - return - if changdu > len(text): - return_text = '分割长度大于字符串长度。' - else: - text = [text[i:i + changdu] for i in range(0, len(text), changdu)] - # text = re.findall(r'.{'+str(changdu)+'}', text) - return_text = ' '.join(text) - pass - self.Ui.Result_text.setPlainText(str(return_text)) - self.dialog.close() - - def str_split(self): - self.WChild_split = Ui_KEY1() - self.dialog = QtWidgets.QDialog(self) - self.WChild_split.setupUi(self.dialog) - self.dialog.setWindowTitle("字符串分割") - self.WChild_split.label.setText("请输入分隔符号:") - self.dialog.show() - self.WChild_split.keyenter.clicked.connect(self.str_split_chuli) - - def str_split_chuli(self): - text = self.Ui.Source_text.toPlainText().strip() - split_str = self.WChild_split.key.text() - text = text.split(split_str) - return_text = ' '.join(text) - self.Ui.Result_text.setPlainText(str(return_text.strip())) - self.dialog.close() - - def str_tongji(self): - data = self.Ui.Source_text.toPlainText().strip() - s = '' - l = len(data) - for x in range(0, l): - if not data[x] in s: - s += data[x] - result = {d: 0 for d in s} - for d in data: - for alpha in s: - if d == alpha: - result[alpha] = result[alpha] + 1 - - result1 = sorted(result.items(), key=lambda x: x[1], reverse=True) - return_text = '大->小:\n' - for x in result1: - return_text += str(x[1]) - return_text += '\n\n小->大:\n' - result2 = sorted(result.items(), key=lambda x: x[1], reverse=False) - for x in result2: - return_text += str(x[1]) - return_text += '\n\n' - for x in result1: - return_text += x[0] + ":" + str(x[1]) + '\n' - self.Ui.Result_text.setPlainText(return_text) - - # print(type(result)) - - def str_re(self): - text = self.Ui.Source_text.toPlainText().strip() - self.Ui.Result_text.setPlainText(str(text[::-1])) - def keyPressEvent(self, event): # print("按下:" + str(event.key())) if event.key() == QtCore.Qt.Key_H: @@ -3214,224 +693,29 @@ def keyPressEvent(self, event): # self.actionFile.save(self.action_text.toPlainText()) # self.status.showMessage("保存成功 %s" % self.file) - def str_replace(self, type): - source_text = self.WChild_replace.Key1.text() - result_text = self.WChild_replace.Key2.text() - if type == 'Source': - text = self.Ui.Source_text.toPlainText().strip() - text = text.replace(source_text, result_text) - self.Ui.Source_text.setPlainText(str(text)) - if type == 'Result': - text = self.Ui.Result_text.toPlainText() - text = text.replace(source_text, result_text) - self.Ui.Result_text.setPlainText(str(text)) - self.dialog.close() - def zhuan_yuanwenben(self): text = self.Ui.Result_text.toPlainText() if text: self.Ui.Source_text.setPlainText(text) def open_xiandaimima(self): - self.form_xiandaimima = QtWidgets.QWidget() - self.xiandaimima_widget = Ui_Form_Xiandaimima() - self.xiandaimima_widget.setupUi(self.form_xiandaimima) - self.form_xiandaimima.setStyleSheet(qss_style) - self.form_xiandaimima.setWindowIcon(QtGui.QIcon('./logo.ico')) - self.form_xiandaimima.show() - self.xiandaimima_widget.AES_Encrypto.clicked.connect(self.AES_Encrypto) - self.xiandaimima_widget.AES_Decrypto.clicked.connect(self.AES_Decrypto) - self.xiandaimima_widget.AES_Mode.activated[str].connect(self.change_aes_setting) + self.w = QWidget_XiandaiMima() + self.w.show() + # self.form_xiandaimima = QtWidgets.QWidget() + # self.xiandaimima_widget = XiandaiMima() + # self.xiandaimima_widget.setupUi(self.form_xiandaimima) + # # self.form_xiandaimima.setStyleSheet(qss_style) + # self.form_xiandaimima.setWindowIcon(QtGui.QIcon('./logo.ico')) + # self.form_xiandaimima.show() + # self.xiandaimima_widget.AES_Encrypto.clicked.connect(self.AES_Encrypto) + # self.xiandaimima_widget.AES_Decrypto.clicked.connect(self.AES_Decrypto) + # self.xiandaimima_widget.AES_Mode.activated[str].connect(self.change_aes_setting) # print(values) # self.WChild_xiandaimima.vuln_name.setText(values[0]['vuln_name']) # self.WChild_xiandaimima.cms_name.setText(values[0]['cms_name']) - def change_aes_setting(self): - AES_Mode = self.xiandaimima_widget.AES_Mode.currentText() - if AES_Mode == 'ECB': - self.xiandaimima_widget.AES_Pianyi.setEnabled(False) - else: - self.xiandaimima_widget.AES_Pianyi.setEnabled(True) - - def AES_Encrypto(self): - aes_mode = self.xiandaimima_widget.AES_Mode.currentText() - aes_zifuji = self.xiandaimima_widget.AES_zifuji.currentText() - aes_tianchong = self.xiandaimima_widget.AES_Tianchong.currentText() - aes_iv = self.xiandaimima_widget.AES_Pianyi.text() - aes_encode = self.xiandaimima_widget.AES_Bianma.currentText() - aes_key = self.xiandaimima_widget.AES_Miyao.text() - aes_m_text = self.xiandaimima_widget.AES_Source.toPlainText() - if not aes_key: - QMessageBox.critical(self.form_xiandaimima, 'Error', 'AES密钥不能为空') - return - else: - if len(aes_key) != 16 and len(aes_key) != 24 and len(aes_key) != 32: - QMessageBox.critical(self.form_xiandaimima, 'Error', 'AES密钥应为16、24、32位') - return - else: - aes_key = aes_key.encode(aes_zifuji) - if aes_mode not in ["ECB"]: - if len(aes_iv) != 16: - QMessageBox.critical(self.form_xiandaimima, 'Error', 'AES偏移长度必须为16位') - return - if not aes_iv: - QMessageBox.critical(self.form_xiandaimima, 'Error', '偏移不能为空!') - return - else: - aes_iv = aes_iv.encode(aes_zifuji) - - if not aes_m_text: - QMessageBox.critical(self.form_xiandaimima, 'Error', '请输入明文') - return - else: - aes_m_text = self.aes_buqi_(aes_m_text.encode(aes_zifuji), len(aes_key), aes_tianchong, aes_zifuji) - if aes_mode == "CBC": - cryptor = AES.new(aes_key, AES.MODE_CBC, aes_iv) - elif aes_mode == "ECB": - cryptor = AES.new(aes_key, AES.MODE_ECB) - elif aes_mode == "CFB": - cryptor = AES.new(aes_key, AES.MODE_CFB, aes_iv) - elif aes_mode == "CTR": - ctr = Crypto.Util.Counter.new(128, initial_value=int(binascii.hexlify(aes_iv), 16)) - cryptor = AES.new(aes_key, AES.MODE_CTR, counter=ctr) - elif aes_mode == "OFB": - cryptor = AES.new(aes_key, AES.MODE_OFB, aes_iv) - else: - QMessageBox.critical(self.form_xiandaimima, 'Error', '加密模式设置错误') - return - return_text = cryptor.encrypt(aes_m_text) - if aes_encode == 'Base64': - return_text = str(base64.encodebytes(return_text), encoding=aes_zifuji).strip() - - elif aes_encode == 'Hex': - return_text = str(binascii.b2a_hex(return_text), encoding=aes_zifuji).strip() - # print(return_text) - self.xiandaimima_widget.AES_Result.appendPlainText(return_text) - - def AES_Decrypto(self): - aes_mode = self.xiandaimima_widget.AES_Mode.currentText() - aes_zifuji = self.xiandaimima_widget.AES_zifuji.currentText() - aes_iv = self.xiandaimima_widget.AES_Pianyi.text() - aes_encode = self.xiandaimima_widget.AES_Bianma.currentText() - aes_key = self.xiandaimima_widget.AES_Miyao.text() - aes_m_text = self.xiandaimima_widget.AES_Result.toPlainText() - if not aes_key: - QMessageBox.critical(self.form_xiandaimima, 'Error', 'AES密钥不能为空') - return - else: - if len(aes_key) != 16 and len(aes_key) != 24 and len(aes_key) != 32: - QMessageBox.critical(self.form_xiandaimima, 'Error', 'AES密钥应为16、24、32位') - return - else: - aes_key = aes_key.encode(aes_zifuji) - if aes_mode not in ["ECB"]: - if len(aes_iv) != 16: - QMessageBox.critical(self.form_xiandaimima, 'Error', 'AES偏移长度必须为16位') - return - if not aes_iv: - QMessageBox.critical(self.form_xiandaimima, 'Error', '偏移不能为空!') - return - else: - aes_iv = aes_iv.encode(aes_zifuji) - - if not aes_m_text: - QMessageBox.critical(self.form_xiandaimima, 'Error', '请输入明文') - return - else: - if aes_encode == 'Base64': - aes_m_text = base64.b64decode(aes_m_text.encode(aes_zifuji)) - elif aes_encode == 'Hex': - aes_m_text = bytes.fromhex(aes_m_text) - if aes_mode == "CBC": - cryptor = AES.new(aes_key, AES.MODE_CBC, aes_iv) - elif aes_mode == "ECB": - cryptor = AES.new(aes_key, AES.MODE_ECB) - elif aes_mode == "CFB": - cryptor = AES.new(aes_key, AES.MODE_CFB, aes_iv) - elif aes_mode == "CTR": - ctr = Crypto.Util.Counter.new(128, initial_value=int(binascii.hexlify(aes_iv), 16)) - cryptor = AES.new(aes_key, AES.MODE_CTR, counter=ctr) - elif aes_mode == "OFB": - cryptor = AES.new(aes_key, AES.MODE_OFB, aes_iv) - else: - QMessageBox.critical(self.form_xiandaimima, 'Error', '加密模式设置错误') - return - try: - return_text = cryptor.decrypt(aes_m_text) - ret = self._unpad(return_text) - return_text = ret.decode(aes_zifuji) - - except: - return_text = '解密失败' - - self.xiandaimima_widget.AES_Source.appendPlainText(return_text.strip()) - - def _unpad(self, s): - return s[:-ord(s[len(s) - 1:])] - # https://baijiahao.baidu.com/s?id=1706700589435327561&wfr=spider&for =pc - def aes_buqi_(self, text, length, aes_tianchong, aes_zifuji): - if aes_tianchong == "ZeroPadding": - tianchong_str = '\0' - # length = 16 - count = len(text) - if count < length: - add = (length - count) - # \0 backspace - # text = text + ('\0' * add) - text = text + (tianchong_str * add).encode(aes_zifuji) - elif count > length: - add = (length - (count % length)) - # text = text + ('\0' * add) - text = text + (tianchong_str * add).encode(aes_zifuji) - return text - elif aes_tianchong == "Pkcs7": - bs = 16 - # length = len(text) - # bytes_length = len(text) - # padding_size = length if (bytes_length == length) else bytes_length - padding_size = len(text) - padding = bs - padding_size % bs - padding_text = chr(padding) * padding - # print(text+ padding_text.encode(aes_zifuji)) - return (text + padding_text.encode(aes_zifuji)) - elif aes_tianchong == "Iso10126": - bs = 16 - padding_size = len(text) - padding = bs - padding_size % bs - # * padding-1 - qian_Str = '' - for i in range(0, padding - 1): - qian_Str += chr(random.randint(0, 9)) - padding_text = qian_Str + chr(padding) - return (text + padding_text.encode(aes_zifuji)) - elif aes_tianchong == "AnsiX923": - bs = 16 - tianchong_str = '\0' - padding_size = len(text) - padding = bs - padding_size % bs - text = text + (tianchong_str * (padding - 1) + chr(padding)).encode(aes_zifuji) - return text - elif aes_tianchong == "No Padding": - while len(text) % 16 != 0: - text += '\0'.encode(aes_zifuji) - return text - - else: - tianchong_str = '\0' - # length = 16 - count = len(text) - if count < length: - add = (length - count) - # \0 backspace - # text = text + ('\0' * add) - text = text + (tianchong_str * add).encode(aes_zifuji) - elif count > length: - add = (length - (count % length)) - # text = text + ('\0' * add) - text = text + (tianchong_str * add).encode(aes_zifuji) - return text def add_Tab(self): self.Ui.tab = QWidget() @@ -3446,9 +730,9 @@ def add_Tab(self): self.Ui.source_text.setStyleSheet(u"") self.Ui.verticalLayout.addWidget(self.Ui.source_text) - self.Ui.Source_text = QPlainTextEdit(self.Ui.tab) self.Ui.Source_text.setObjectName(u"Source_text") + self.Ui.Source_text.setPlaceholderText('请在此处输入') self.Ui.verticalLayout.addWidget(self.Ui.Source_text) @@ -3461,6 +745,7 @@ def add_Tab(self): self.Ui.Result_text = QPlainTextEdit(self.Ui.tab) self.Ui.Result_text.setObjectName(u"Result_text") + self.Ui.Result_text.setPlaceholderText('结果会显示在此处') self.Ui.verticalLayout.addWidget(self.Ui.Result_text) self.Ui.source_text.setText(QCoreApplication.translate("MainWindow", u"Source", None)) @@ -3470,7 +755,7 @@ def add_Tab(self): "娜娜", "瑞楠", "晓满", "婉雅", "雨婷", "筱满", "雅文", "玉琪", "敖雯", "文殊", "喻喧", "海英", "舒欣", "云亿", "莨静", "雅芝", "蕴兵", "乐乐", "之恋", "小满", "悦心", "可人", "忆初", "衬心", "诠释", "尘封", "奔赴", "心鸢", "晴栀", "堇年", "青柠", "埋葬", "夏墨", "随风", "屿暖", "深邃", "途往", "迷离", "槿城", "零落", "余笙", "梦呓", "墨凉", "晨曦", "纪年", "未央", "失语", "柠栀", "梦巷", "九离", "暮雨", - "木兮", "浅歌", "沐北", "惜颜", "素笺", "锁心", "柠萌", "卿歌", "归期", "予别", "情笙", "缥缈", "轩辕", "浮光", "缠绵,碧影", "星愿", + "木兮", "浅歌", "沐北", "惜颜", "素笺", "锁心", "柠萌", "卿歌", "归期", "予别", "情笙", "缥缈", "轩辕", "浮光", "缠绵", "碧影", "星愿", "星月", "星雨", "沧澜", "醉月", "春媱", "夏露", "秋颜", "冬耀", "缱绻", "涟漪", "若溪", "微凉", "暖阳", "半夏", "崖悔", "洛尘", "矜柔", "绚烂", "矫情", "真淳", "明媚", "迷离", "隐忍", "灼热", "幻灭", "落拓", "锦瑟", "妖娆", "邪殇", "离殇", "恋夏", "梦琪", "忆柳", "之桃", "慕青", "问兰", "尔岚", "元香", "初夏", "沛菡", "傲珊", "曼文", "乐菱", "痴珊", "恨玉", "惜文", "香寒", "新柔", "语蓉", "海安", "夜蓉", @@ -3484,11 +769,11 @@ def add_Tab(self): "涵菡", "海莲", "傲蕾", "青槐", "冬儿", "易梦", "惜雪", "宛海", "之柔", "夏青", "亦瑶", "妙菡", "春竹", "痴梦", "紫蓝", "晓巧", "幻柏", "元风", "冰枫", "访蕊", "南春", "芷蕊", "凡蕾", "凡柔", "安蕾", "天荷", "含玉", "书兰", "雅琴", "书瑶", "春雁", "从安", "夏槐", "念芹", "怀萍", "代曼", "幻珊", "谷丝", "秋翠", "白晴", "海露", "代荷", "含玉", "书蕾", "听白", "访琴", "灵雁", "秋春", "雪青", "乐瑶", "含烟", - "涵双", "平蝶", "雅蕊", "傲之", "灵薇", "绿春", "含蕾", "从梦", "从蓉", "初丹。听兰", "听蓉", "语芙", "夏彤", "凌瑶", "忆翠", "幻灵", + "涵双", "平蝶", "雅蕊", "傲之", "灵薇", "绿春", "含蕾", "从梦", "从蓉", "初丹", "听兰", "听蓉", "语芙", "夏彤", "凌瑶", "忆翠", "幻灵", "怜菡", "紫南", "依珊", "妙竹", "访烟", "怜蕾", "映寒", "友绿", "冰萍", "惜霜", "凌香", "芷蕾", "雁卉", "迎梦", "元柏", "代萱", "紫真", "千青", "凌寒", "紫安", "寒安", "怀蕊", "秋荷", "涵雁", "以山", "凡梅", "盼曼", "翠彤", "谷冬", "新巧", "冷安", "千萍", "冰烟", "雅阳", "友绿", "南松", "诗云", "飞风", "寄灵", "书芹", "幼蓉", "以蓝", "笑寒", "忆寒", "秋烟", "芷巧", "水香", "映之", "醉波", "幻莲", "夜山", - "芷卉", "向彤", "小玉", "幼南", "凡梦", "尔曼", "念波", "迎松", "青寒", "笑天", "涵蕾"] + "芷卉", "向彤", "小玉", "幼南", "凡梦", "尔曼", "念波", "迎松", "青寒", "笑天", "涵蕾", "YYDS", "栓Q", "辣鸡CTF,毁我青春"] self.Ui.tabWidget.addTab(self.Ui.tab, random.choice(lisra)) self.Ui.tabWidget.setCurrentIndex(self.Ui.tabWidget.count() - 1) @@ -3519,9 +804,119 @@ def eventFilter(self, object, event): self.add_Tab() return False + def str_place(self): + self.WChild_replace = Ui_KEY2() + self.dialog = QtWidgets.QDialog(self) + self.WChild_replace.setupUi(self.dialog) + self.dialog.setWindowTitle("替换") + self.WChild_replace.key_1.setText("查找内容:") + self.WChild_replace.key_2.setText("替换内容:") + self.WChild_replace.enter.setText("替换输入文本") + self.WChild_replace.quxiao.setText("替换输出文本") + self.dialog.show() + self.WChild_replace.enter.clicked.connect(lambda: self.str_replace("Source")) + self.WChild_replace.quxiao.clicked.connect(lambda: self.str_replace("Result")) + def str_replace(self, type): + source_text = self.WChild_replace.Key1.text() + result_text = self.WChild_replace.Key2.text() + if type == 'Source': + text = self.Ui.Source_text.toPlainText().strip() + text = text.replace(source_text, result_text) + self.Ui.Source_text.setPlainText(str(text)) + if type == 'Result': + text = self.Ui.Result_text.toPlainText() + text = text.replace(source_text, result_text) + self.Ui.Result_text.setPlainText(str(text)) + self.dialog.close() + + def miwenfenxi(self): + self.WChild_Ui_Cipher = Ui_Cipher() + self.dialog_Ui_Cipher = QtWidgets.QDialog(self) + self.WChild_Ui_Cipher.setupUi(self.dialog_Ui_Cipher) + self.dialog_Ui_Cipher.setWindowTitle("密文识别") + self.WChild_Ui_Cipher.pushButton_enter.setText("密文分析") + self.WChild_Ui_Cipher.pushButton_close.setText("批量解密") + self.dialog_Ui_Cipher.show() + self.WChild_Ui_Cipher.pushButton_enter.clicked.connect(lambda:self.miwenfenxi_click(0)) + self.WChild_Ui_Cipher.pushButton_close.clicked.connect(lambda:self.miwenfenxi_click(1)) + + def miwenfenxi_click(self,out_mima): + cryptostr = self.WChild_Ui_Cipher.plainTextEdit_source.toPlainText() # 获取密文 + if not cryptostr: + QMessageBox.critical(self, 'Error', "请输入一个密文!") + return + self.WChild_Ui_Cipher.plainTextEdit_source.clear() + key1 = self.WChild_Ui_Cipher.lineEdit_key1.text() # 获取密文 + key2 = self.WChild_Ui_Cipher.lineEdit_key2.text() # 获取密文 + key3 = self.WChild_Ui_Cipher.lineEdit_key3.text() # 获取密文 + self.thread = Cipher_Thread(cryptostr, key1,key2,key3) + self.thread.signal.connect(self.Out_Cipherxxx) + self.thread.start() # 启动线程 + #解密完成输出结果 + self._decode_flag=0 + #是否输出密码 + self.out_mima = out_mima + def Out_Cipherxxx(self,result): + if result[0]: + if result[1] == "end": + if self._decode_flag: + txt = '操作完成!' + else: + txt = '很遗憾,未能分析出密文类型!' + else: + self._decode_flag=1 + if self.out_mima: + txt = str(result[1])+"\n"+'-'*len(result[1].encode('gbk'))+"\n"+str(result[2])+'\n------------------------------------------------------------------' + else: + txt = str(result[1]) + self.WChild_Ui_Cipher.plainTextEdit_source.appendPlainText(txt) + + def auto_get_flag(self): + self.WChild_Ui_Getflag = Ui_Cipher() + self.dialog_Ui_Getflag = QtWidgets.QDialog(self) + self.WChild_Ui_Getflag.setupUi(self.dialog_Ui_Getflag) + self.dialog_Ui_Getflag.setWindowTitle("自动获取FLAG") + self.WChild_Ui_Getflag.pushButton_enter.setText("获取FLAG") + self.WChild_Ui_Getflag.pushButton_close.setText("关闭窗口") + self.WChild_Ui_Getflag.lineEdit_key3.setPlaceholderText("必填") + self.WChild_Ui_Getflag.label_key3.setText("FLAG关键字:") + self.dialog_Ui_Getflag.show() + self.WChild_Ui_Getflag.pushButton_enter.clicked.connect(self.auto_get_flag_click) + self.WChild_Ui_Getflag.pushButton_close.clicked.connect(lambda:self.dialog_Ui_Getflag.close()) + + def auto_get_flag_click(self): + self.WChild_Ui_Getflag.pushButton_enter.setEnabled(False) + self.WChild_Ui_Getflag.pushButton_enter.setText("正在提取Flag...") + cryptostr = self.WChild_Ui_Getflag.plainTextEdit_source.toPlainText() + key1 = self.WChild_Ui_Getflag.lineEdit_key1.text() # 获取密文 + key2 = self.WChild_Ui_Getflag.lineEdit_key2.text() # 获取密文 + flag_guanjianzi = self.WChild_Ui_Getflag.lineEdit_key3.text() # 获取密文 + if not cryptostr: + QMessageBox.critical(self, 'Error', "密文不能为空!") + if not flag_guanjianzi: + QMessageBox.critical(self, 'Error', "关键字不能为空!") + return + self.thread = AutoGetFlag(cryptostr,key1,key2,flag_guanjianzi) + self.thread.signal.connect(self.out_flag) + self.thread.start() # 启动线程 + + def out_flag(self,result): + self.Ui.Result_text.setPlainText(result[1]) + if result[0]: + self.dialog_Ui_Getflag.close() + QMessageBox.information(self, 'Success', '恭喜!成功获取flag!') + else: + QMessageBox.information(self, 'Success', "自动提取flag失败!") + self.WChild_Ui_Getflag.pushButton_enter.setEnabled(True) + self.WChild_Ui_Getflag.pushButton_enter.setText("获取FLAG") + + # print(result) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) + # app.setStyleSheet(qdarkstyle.load_stylesheet(qt_api='pyqt5', palette=LightPalette())) + # app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) + window = MainWindows() translator = QTranslator() translator.load('./QSS/qm/qt_zh_CN.qm') # 改变中文菜单 diff --git a/GUI/Binary.py b/GUI/Binary.py deleted file mode 100644 index a54748f..0000000 --- a/GUI/Binary.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'Binary.ui' -# -# Created by: PyQt5 UI code generator 5.15.4 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Binary(object): - def setupUi(self, Binary): - Binary.setObjectName("Binary") - Binary.resize(330, 69) - self.enter = QtWidgets.QPushButton(Binary) - self.enter.setGeometry(QtCore.QRect(220, 20, 93, 31)) - self.enter.setObjectName("enter") - self.splitter_2 = QtWidgets.QSplitter(Binary) - self.splitter_2.setGeometry(QtCore.QRect(10, 20, 109, 31)) - self.splitter_2.setOrientation(QtCore.Qt.Horizontal) - self.splitter_2.setObjectName("splitter_2") - self.label = QtWidgets.QLabel(self.splitter_2) - self.label.setObjectName("label") - self.Source = QtWidgets.QLineEdit(self.splitter_2) - self.Source.setObjectName("Source") - self.splitter = QtWidgets.QSplitter(Binary) - self.splitter.setGeometry(QtCore.QRect(130, 20, 77, 31)) - self.splitter.setOrientation(QtCore.Qt.Horizontal) - self.splitter.setObjectName("splitter") - self.result_label = QtWidgets.QLabel(self.splitter) - self.result_label.setObjectName("result_label") - self.result = QtWidgets.QLineEdit(self.splitter) - self.result.setObjectName("result") - - self.retranslateUi(Binary) - QtCore.QMetaObject.connectSlotsByName(Binary) - Binary.setTabOrder(self.Source, self.result) - Binary.setTabOrder(self.result, self.enter) - - def retranslateUi(self, Binary): - _translate = QtCore.QCoreApplication.translate - Binary.setWindowTitle(_translate("Binary", "进制转换")) - self.enter.setText(_translate("Binary", "确定")) - self.label.setText(_translate("Binary", "From")) - self.result_label.setText(_translate("Binary", "To")) diff --git a/GUI/Cipher.py b/GUI/Cipher.py new file mode 100644 index 0000000..a413295 --- /dev/null +++ b/GUI/Cipher.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'Cipher.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_Cipher(object): + def setupUi(self, Cipher): + Cipher.setObjectName("Cipher") + Cipher.resize(584, 252) + self.gridLayout = QtWidgets.QGridLayout(Cipher) + self.gridLayout.setObjectName("gridLayout") + self.plainTextEdit_source = QtWidgets.QPlainTextEdit(Cipher) + self.plainTextEdit_source.setObjectName("plainTextEdit_source") + self.gridLayout.addWidget(self.plainTextEdit_source, 0, 0, 1, 2) + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.label_key1 = QtWidgets.QLabel(Cipher) + self.label_key1.setObjectName("label_key1") + self.horizontalLayout_2.addWidget(self.label_key1) + self.lineEdit_key1 = QtWidgets.QLineEdit(Cipher) + self.lineEdit_key1.setMinimumSize(QtCore.QSize(234, 0)) + self.lineEdit_key1.setObjectName("lineEdit_key1") + self.horizontalLayout_2.addWidget(self.lineEdit_key1) + self.verticalLayout_2.addLayout(self.horizontalLayout_2) + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.label_key2 = QtWidgets.QLabel(Cipher) + self.label_key2.setObjectName("label_key2") + self.horizontalLayout_3.addWidget(self.label_key2) + self.lineEdit_key2 = QtWidgets.QLineEdit(Cipher) + self.lineEdit_key2.setMinimumSize(QtCore.QSize(234, 0)) + self.lineEdit_key2.setObjectName("lineEdit_key2") + self.horizontalLayout_3.addWidget(self.lineEdit_key2) + self.verticalLayout_2.addLayout(self.horizontalLayout_3) + self.gridLayout.addLayout(self.verticalLayout_2, 1, 0, 1, 1) + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.label_key3 = QtWidgets.QLabel(Cipher) + self.label_key3.setObjectName("label_key3") + self.horizontalLayout.addWidget(self.label_key3) + self.lineEdit_key3 = QtWidgets.QLineEdit(Cipher) + self.lineEdit_key3.setObjectName("lineEdit_key3") + self.horizontalLayout.addWidget(self.lineEdit_key3) + self.verticalLayout.addLayout(self.horizontalLayout) + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.pushButton_enter = QtWidgets.QPushButton(Cipher) + self.pushButton_enter.setObjectName("pushButton_enter") + self.horizontalLayout_4.addWidget(self.pushButton_enter) + self.pushButton_close = QtWidgets.QPushButton(Cipher) + self.pushButton_close.setObjectName("pushButton_close") + self.horizontalLayout_4.addWidget(self.pushButton_close) + self.verticalLayout.addLayout(self.horizontalLayout_4) + self.gridLayout.addLayout(self.verticalLayout, 1, 1, 1, 1) + + self.retranslateUi(Cipher) + QtCore.QMetaObject.connectSlotsByName(Cipher) + + def retranslateUi(self, Cipher): + _translate = QtCore.QCoreApplication.translate + Cipher.setWindowTitle(_translate("Cipher", "KEY3")) + self.plainTextEdit_source.setPlaceholderText(_translate("Cipher", "在这里输入密文")) + self.label_key1.setText(_translate("Cipher", "Key1")) + self.lineEdit_key1.setPlaceholderText(_translate("Cipher", "可选字段")) + self.label_key2.setText(_translate("Cipher", "Key2")) + self.lineEdit_key2.setPlaceholderText(_translate("Cipher", "可选字段")) + self.label_key3.setText(_translate("Cipher", "key3")) + self.lineEdit_key3.setPlaceholderText(_translate("Cipher", "可选字段")) + self.pushButton_enter.setText(_translate("Cipher", "确定")) + self.pushButton_close.setText(_translate("Cipher", "取消")) diff --git a/GUI/KEY_2.py b/GUI/KEY_2.py index 4811a15..d555e42 100644 --- a/GUI/KEY_2.py +++ b/GUI/KEY_2.py @@ -32,9 +32,9 @@ def setupUi(self, KEY2): self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.keyl_2 = QtWidgets.QLabel(KEY2) - self.keyl_2.setObjectName("keyl_2") - self.horizontalLayout_2.addWidget(self.keyl_2) + self.key_2 = QtWidgets.QLabel(KEY2) + self.key_2.setObjectName("key_2") + self.horizontalLayout_2.addWidget(self.key_2) self.Key2 = QtWidgets.QLineEdit(KEY2) self.Key2.setObjectName("Key2") self.horizontalLayout_2.addWidget(self.Key2) @@ -52,5 +52,5 @@ def retranslateUi(self, KEY2): KEY2.setWindowTitle(_translate("KEY2", "KEY")) self.key_1.setText(_translate("KEY2", "Keys 1")) self.enter.setText(_translate("KEY2", "确定")) - self.keyl_2.setText(_translate("KEY2", "Keys 2")) + self.key_2.setText(_translate("KEY2", "Keys 2")) self.quxiao.setText(_translate("KEY2", "取消")) diff --git a/GUI/Xiandaimima.py b/GUI/Xiandaimima.py index 3aedfe8..1c893c2 100644 --- a/GUI/Xiandaimima.py +++ b/GUI/Xiandaimima.py @@ -14,7 +14,7 @@ class Ui_Form_Xiandaimima(object): def setupUi(self, Form_Xiandaimima): Form_Xiandaimima.setObjectName("Form_Xiandaimima") - Form_Xiandaimima.resize(992, 696) + Form_Xiandaimima.resize(939, 696) self.gridLayout = QtWidgets.QGridLayout(Form_Xiandaimima) self.gridLayout.setObjectName("gridLayout") self.tabWidget = QtWidgets.QTabWidget(Form_Xiandaimima) @@ -30,6 +30,15 @@ def setupUi(self, Form_Xiandaimima): self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") + self.label = QtWidgets.QLabel(self.AES) + self.label.setObjectName("label") + self.horizontalLayout.addWidget(self.label) + self.comboBox_type = QtWidgets.QComboBox(self.AES) + self.comboBox_type.setObjectName("comboBox_type") + self.comboBox_type.addItem("") + self.comboBox_type.addItem("") + self.comboBox_type.addItem("") + self.horizontalLayout.addWidget(self.comboBox_type) self.label_mode = QtWidgets.QLabel(self.AES) self.label_mode.setObjectName("label_mode") self.horizontalLayout.addWidget(self.label_mode) @@ -52,12 +61,6 @@ def setupUi(self, Form_Xiandaimima): self.AES_Tianchong.addItem("") self.AES_Tianchong.addItem("") self.horizontalLayout.addWidget(self.AES_Tianchong) - self.label_pianyi = QtWidgets.QLabel(self.AES) - self.label_pianyi.setObjectName("label_pianyi") - self.horizontalLayout.addWidget(self.label_pianyi) - self.AES_Pianyi = QtWidgets.QLineEdit(self.AES) - self.AES_Pianyi.setObjectName("AES_Pianyi") - self.horizontalLayout.addWidget(self.AES_Pianyi) self.label_zifuji = QtWidgets.QLabel(self.AES) self.label_zifuji.setObjectName("label_zifuji") self.horizontalLayout.addWidget(self.label_zifuji) @@ -86,6 +89,12 @@ def setupUi(self, Form_Xiandaimima): self.AES_Miyao = QtWidgets.QLineEdit(self.AES) self.AES_Miyao.setObjectName("AES_Miyao") self.horizontalLayout_2.addWidget(self.AES_Miyao) + self.label_pianyi = QtWidgets.QLabel(self.AES) + self.label_pianyi.setObjectName("label_pianyi") + self.horizontalLayout_2.addWidget(self.label_pianyi) + self.AES_Pianyi = QtWidgets.QLineEdit(self.AES) + self.AES_Pianyi.setObjectName("AES_Pianyi") + self.horizontalLayout_2.addWidget(self.AES_Pianyi) self.AES_Encrypto = QtWidgets.QPushButton(self.AES) self.AES_Encrypto.setMinimumSize(QtCore.QSize(90, 0)) self.AES_Encrypto.setObjectName("AES_Encrypto") @@ -123,7 +132,6 @@ def setupUi(self, Form_Xiandaimima): self.AES_Clear.clicked.connect(self.AES_Source.clear) self.AES_Clear.clicked.connect(self.AES_Result.clear) QtCore.QMetaObject.connectSlotsByName(Form_Xiandaimima) - Form_Xiandaimima.setTabOrder(self.AES_Pianyi, self.AES_Miyao) Form_Xiandaimima.setTabOrder(self.AES_Miyao, self.AES_Source) Form_Xiandaimima.setTabOrder(self.AES_Source, self.AES_Result) Form_Xiandaimima.setTabOrder(self.AES_Result, self.AES_Mode) @@ -139,30 +147,34 @@ def retranslateUi(self, Form_Xiandaimima): _translate = QtCore.QCoreApplication.translate Form_Xiandaimima.setWindowTitle(_translate("Form_Xiandaimima", "现代密码学")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.RSA), _translate("Form_Xiandaimima", "RSA")) - self.label_mode.setText(_translate("Form_Xiandaimima", "模式")) + self.label.setText(_translate("Form_Xiandaimima", "算法类型")) + self.comboBox_type.setItemText(0, _translate("Form_Xiandaimima", "AES-128")) + self.comboBox_type.setItemText(1, _translate("Form_Xiandaimima", "AES-192")) + self.comboBox_type.setItemText(2, _translate("Form_Xiandaimima", "AES-256")) + self.label_mode.setText(_translate("Form_Xiandaimima", "加密模式")) self.AES_Mode.setItemText(0, _translate("Form_Xiandaimima", "CBC")) self.AES_Mode.setItemText(1, _translate("Form_Xiandaimima", "ECB")) self.AES_Mode.setItemText(2, _translate("Form_Xiandaimima", "CFB")) self.AES_Mode.setItemText(3, _translate("Form_Xiandaimima", "CTR")) self.AES_Mode.setItemText(4, _translate("Form_Xiandaimima", "OFB")) - self.label_tianchong.setText(_translate("Form_Xiandaimima", "填充")) + self.label_tianchong.setText(_translate("Form_Xiandaimima", "填充方式")) self.AES_Tianchong.setItemText(0, _translate("Form_Xiandaimima", "Pkcs7")) self.AES_Tianchong.setItemText(1, _translate("Form_Xiandaimima", "AnsiX923")) self.AES_Tianchong.setItemText(2, _translate("Form_Xiandaimima", "Iso10126")) self.AES_Tianchong.setItemText(3, _translate("Form_Xiandaimima", "ZeroPadding")) self.AES_Tianchong.setItemText(4, _translate("Form_Xiandaimima", "No Padding")) - self.label_pianyi.setText(_translate("Form_Xiandaimima", "偏移量")) - self.AES_Pianyi.setPlaceholderText(_translate("Form_Xiandaimima", "ECB模式不需要")) self.label_zifuji.setText(_translate("Form_Xiandaimima", "字符集")) self.AES_zifuji.setItemText(0, _translate("Form_Xiandaimima", "gb2312")) self.AES_zifuji.setItemText(1, _translate("Form_Xiandaimima", "gbk")) self.AES_zifuji.setItemText(2, _translate("Form_Xiandaimima", "gb18030")) self.AES_zifuji.setItemText(3, _translate("Form_Xiandaimima", "utf-8")) self.AES_zifuji.setItemText(4, _translate("Form_Xiandaimima", "iso-8859-1")) - self.label_bianma.setText(_translate("Form_Xiandaimima", "密文编码")) + self.label_bianma.setText(_translate("Form_Xiandaimima", "输出密文编码")) self.AES_Bianma.setItemText(0, _translate("Form_Xiandaimima", "Base64")) self.AES_Bianma.setItemText(1, _translate("Form_Xiandaimima", "Hex")) self.label_miyao.setText(_translate("Form_Xiandaimima", "密钥")) + self.label_pianyi.setText(_translate("Form_Xiandaimima", "偏移量")) + self.AES_Pianyi.setPlaceholderText(_translate("Form_Xiandaimima", "ECB模式不需要")) self.AES_Encrypto.setText(_translate("Form_Xiandaimima", "加密")) self.AES_Decrypto.setText(_translate("Form_Xiandaimima", "解密")) self.AES_Clear.setText(_translate("Form_Xiandaimima", "清空")) diff --git a/GUI/__pycache__/Cipher.cpython-37.pyc b/GUI/__pycache__/Cipher.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6b7fc98d033eaba22a9d494ad840d64eefc8f0f GIT binary patch literal 2422 zcmZuzTW=dh6yBR1+ld{=aqL{$a(Tj{jYI+hA%sdoNm1K0Rud|$NGr!PG;7wo?(7(v zC`d>x6eOfRAQgdla2}9Ai1vv-mY;z%ugIn0Cm#(;~a!xyxR6o3a+F;f0?gu$Ey(kKnXt_94=J)5IN^A@;sy8rBZv^ZM@VKrCE1yM18ijBNfx+SZ6hbqQ9wrl&1rN@ zTh0TX2Yggp9+j5!npM!OabS)2i+rMAB4Z@IZ)x^8XiBcMjxmkvC)xfaV%m<1p$teF zGzuDxW0(Sb3h-FBEMu6`tT=`Wuqr3SPyx-N_Np{1`lMng>yslR%0j*{XCp&7tAgz+ z*qP8iRlL)HP6JxfXdLeh;4^?vYRl6y-Wkn`+*>5;;{1K3BFzx#cnU!Ug~ik1}+UaWkX2I4vYK1`n>A2>HJX+eptkf*wMAZL?r9t@@gPnzs zf6u=A=4LA-baQQoZ->F+>zmshf=tr9?8}DzbQk?JZh!OZ+z3zrL4ysWb zgkk2)vE;7EQ;ZYa`PpP&Bm{lVRDo<9C|@WoGqhhILqe^)q{phJ6Dpo4o4 z4?h2T@Y{D!9{euh1>r#ZF81(U|GocU@Zblz9o)PBN0Bqc~a^iGRzhd!YUCy?p@tPFX=`ae?Bhn1YvZOvvcBMCzj zIXCer3sQ-5_#FRetiX!UhGAyRqFH+8-mM-M#ZWV>)>0zlx&f5E>w*)v6Ox{f`!UzO z*=zdh37ZGY($Nv;*cVJjfHj5v9pN0wn3*>iBCGJ{Bek|u=dZ~uGORu|Y0}U;&~uV? Tl0lJqOU3c_C|bp-P`3XEeL{34 literal 0 HcmV?d00001 diff --git a/GUI/__pycache__/KEY_2.cpython-37.pyc b/GUI/__pycache__/KEY_2.cpython-37.pyc index 1b40457e48449129d6432a94046a46b091ab47f8..b94b93d3c92b341e67841c89ad0fc6dc54567c66 100644 GIT binary patch delta 32 mcmZqTZRF*3;^pOH0D_h^my`TA@}6X3Va-mh+_dul4E1(uYN-~rgmi0Xur_MFLdCz!Oa7Y(N>X}@h~>$+`aiE#MwLwFNks|$^; zq%PVgEfuhSF%`^qAh&SSZBAx0Ns@YRDXcwNVG>4vTwyk?n8wJU;g>Z&G@X@m&(vy6_BXL%Tsf ztKyuD9yuqcU_Av-r=+c5O$ios0Y0KorLWR7ozT+j3?c}5Y~zj6dDu*BTsVSE3dBCM zaj`TjZGELn;L_fkppzT5f%-I4lb$|}wAIt6v#s6Jr}L%L)2Da5+ta7_Y}nJMJvZv< z(>@yW^l5K|sIMs~b;Aoz-O)m4e5ERi@f>B&iLNt4yP4TGi?&l`XI4dBb<{gcR~*Gr zugotw)n!V0+Nt@8&TJ!_$w{NSdnPk>%!2JA!CYol&pGj|nO`*%=2qI?-qf8aN7H#z z)13(1rf-o{D^MFnID5}5tUGa1ExX-nq2DpqiW`O#C8d<5W);+YMraa3ZaA6|vX05< z#&*VZs(5%VN-vwR+?M_qxqOg9?PoqTPBqcz3t6_kX`7;VRhK>PYA&Z|m=iw?QCNRh zFNlnm%p%L`<>;>Bj&2om_5t^=UY%bWx$ML(-M+oLp=a%dOkQ_FOt*|3ozcz7i6yVQ z%f#qr;zX0nhl|A`1cZ}f=~xx@LK#g1fyK~a)r7>7Kf+pwMPqS+yj4bOxK;8dEgh?+ zP8D3p-B6XBlWWQ9NEL?ahOOsWJ$kHxnnr4xsA;CAg_>4s+R$)cGITqE9UM&FGz$8> zX4tHgK)SWDZqme(i$&{RqG;P@f%OtngUPvN6pVZ^zeKY_H#FP^x!ebt^;0uIXiai4 zmoW;<`j*Xo50Ykxnp4!ACQh8`Hp>*OT*lV#8cr>|&lMTd3-*nIrf)gnY|hBu*EI-c zp@1cEf?2-EvE(h?&WL4l8l-Y5XWCX`n=e}ot}yYpnWnQ5zZ0%44=i#y9OMAUjW zYKO}rOhoOhz(mxp3QR=puE0dp9v5qnQG0=isEuyaK9@z9h}!RBP116}wQQEipo_GW zTKU`#xk#JjoN|$Ni440)heS@hNT)>3xJZ{oMqI?ZFL9sbaYvyQ`_ik$jgf1|gqGL- zvkUy_Dbm5Q|KXp%efinmpFY?xJ>2{H87~t>sto&o{PfjdKiU7w%e~+Ik{7(4FbdxI z)buPHhFbP6O&`#iD|*xCFL2YnUzFhR)$e!rzIl>T=Mr;{IzN|ybS-f}Zy%)PI|o$3 zQtIt%31PGQ)!w5=ub%#mY=VpTv)08_-)UK^j?i5iwU zK0AB<()d)7s?_Vhf4ukj1*QD-@%}eYF%wQGk+Jj(Z=}?>^sOSD7SJAi^tp)g@X7uc zFAp9+;l>!580ojqe|7NNpTBkko5aCu}=l&KDl z^ol}Ohx*F&E1R3BIvLwA3%H6MmM32N-Zl!F`R=k|=X6o+qoT}Ek#oXO>RY$h_>zj+ zO%;Q5qFhr=qH@iV?^v>ViT0G_2KYc-&Fc5e97-E^MU|QLQR7x$QE2(CgAY(;3DVQV zI?=Q{C|(LhbCvX$(R_rjbrX%^i{QlX!P(!$pTl43{coA-h4<<4?ew2iDJrV}!bs4G zq|*gly3%PRNmtZjj^yfe`p3mgPH5OXGUJJQlBd$b_y~fK=niGkP$Ry`&y)ZoYytmk o3NCIZ?el!88NC+bP8UMm$IXJXPIBo)ejqaWAx)=6Z(o!8AFp-ukN^Mx literal 4657 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 H^-KB>`O*Kh literal 20514 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 Zc9Vrys=)EwSw?%R=sFOhr-q>!{|+qkFM9w0 diff --git a/GUI/main.py b/GUI/main.py index bf100c7..3771291 100644 --- a/GUI/main.py +++ b/GUI/main.py @@ -91,33 +91,9 @@ def setupUi(self, MainWindow): self.tab_add.setStyleSheet("") self.tab_add.setObjectName("tab_add") self.verticalLayout_2.addWidget(self.tab_add) - self.yijian_decode = QtWidgets.QPushButton(self.centralwidget) - self.yijian_decode.setMinimumSize(QtCore.QSize(60, 30)) - self.yijian_decode.setMaximumSize(QtCore.QSize(100, 16777215)) - self.yijian_decode.setStyleSheet("") - self.yijian_decode.setObjectName("yijian_decode") - self.verticalLayout_2.addWidget(self.yijian_decode) - self.yijian_base = QtWidgets.QPushButton(self.centralwidget) - self.yijian_base.setMinimumSize(QtCore.QSize(60, 30)) - self.yijian_base.setMaximumSize(QtCore.QSize(100, 16777215)) - self.yijian_base.setObjectName("yijian_base") - self.verticalLayout_2.addWidget(self.yijian_base) - self.yijian_decrypto = QtWidgets.QPushButton(self.centralwidget) - self.yijian_decrypto.setMinimumSize(QtCore.QSize(60, 30)) - self.yijian_decrypto.setMaximumSize(QtCore.QSize(100, 16777215)) - self.yijian_decrypto.setObjectName("yijian_decrypto") - self.verticalLayout_2.addWidget(self.yijian_decrypto) - self.yijian_jinzhi = QtWidgets.QPushButton(self.centralwidget) - self.yijian_jinzhi.setMinimumSize(QtCore.QSize(60, 30)) - self.yijian_jinzhi.setMaximumSize(QtCore.QSize(100, 16777215)) - self.yijian_jinzhi.setObjectName("yijian_jinzhi") - self.verticalLayout_2.addWidget(self.yijian_jinzhi) - self.zhuanyuan = QtWidgets.QPushButton(self.centralwidget) - self.zhuanyuan.setMinimumSize(QtCore.QSize(60, 30)) - self.zhuanyuan.setMaximumSize(QtCore.QSize(100, 16777215)) - self.zhuanyuan.setStyleSheet("") - self.zhuanyuan.setObjectName("zhuanyuan") - self.verticalLayout_2.addWidget(self.zhuanyuan) + self.xiandaimima = QtWidgets.QPushButton(self.centralwidget) + self.xiandaimima.setObjectName("xiandaimima") + self.verticalLayout_2.addWidget(self.xiandaimima) self.Result_Copy_Button = QtWidgets.QPushButton(self.centralwidget) self.Result_Copy_Button.setMinimumSize(QtCore.QSize(60, 30)) self.Result_Copy_Button.setMaximumSize(QtCore.QSize(100, 16777215)) @@ -130,6 +106,23 @@ def setupUi(self, MainWindow): self.Result_clear_Button.setStyleSheet("") self.Result_clear_Button.setObjectName("Result_clear_Button") self.verticalLayout_2.addWidget(self.Result_clear_Button) + self.zhuanyuan = QtWidgets.QPushButton(self.centralwidget) + self.zhuanyuan.setMinimumSize(QtCore.QSize(60, 30)) + self.zhuanyuan.setMaximumSize(QtCore.QSize(100, 16777215)) + self.zhuanyuan.setStyleSheet("") + self.zhuanyuan.setObjectName("zhuanyuan") + self.verticalLayout_2.addWidget(self.zhuanyuan) + self.miwenfenxi = QtWidgets.QPushButton(self.centralwidget) + self.miwenfenxi.setMinimumSize(QtCore.QSize(60, 30)) + self.miwenfenxi.setMaximumSize(QtCore.QSize(100, 16777215)) + self.miwenfenxi.setStyleSheet("") + self.miwenfenxi.setObjectName("miwenfenxi") + self.verticalLayout_2.addWidget(self.miwenfenxi) + self.auto_get_flag = QtWidgets.QPushButton(self.centralwidget) + self.auto_get_flag.setMinimumSize(QtCore.QSize(60, 30)) + self.auto_get_flag.setMaximumSize(QtCore.QSize(100, 16777215)) + self.auto_get_flag.setObjectName("auto_get_flag") + self.verticalLayout_2.addWidget(self.auto_get_flag) self.gridLayout_2.addLayout(self.verticalLayout_2, 0, 1, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menuBar = QtWidgets.QMenuBar(MainWindow) @@ -137,12 +130,22 @@ def setupUi(self, MainWindow): self.menuBar.setObjectName("menuBar") self.menuEncode = QtWidgets.QMenu(self.menuBar) self.menuEncode.setObjectName("menuEncode") - self.menuDecode = QtWidgets.QMenu(self.menuBar) - self.menuDecode.setObjectName("menuDecode") + self.menuJS = QtWidgets.QMenu(self.menuEncode) + self.menuJS.setObjectName("menuJS") + self.menu_3 = QtWidgets.QMenu(self.menuEncode) + self.menu_3.setObjectName("menu_3") self.menuEncrypt = QtWidgets.QMenu(self.menuBar) self.menuEncrypt.setObjectName("menuEncrypt") + self.menu_zhalan = QtWidgets.QMenu(self.menuEncrypt) + self.menu_zhalan.setObjectName("menu_zhalan") self.menuDecrypt = QtWidgets.QMenu(self.menuBar) self.menuDecrypt.setObjectName("menuDecrypt") + self.menuRot = QtWidgets.QMenu(self.menuDecrypt) + self.menuRot.setObjectName("menuRot") + self.menu_zhanlan_decrypt = QtWidgets.QMenu(self.menuDecrypt) + self.menu_zhanlan_decrypt.setObjectName("menu_zhanlan_decrypt") + self.menu_yufolunchan = QtWidgets.QMenu(self.menuDecrypt) + self.menu_yufolunchan.setObjectName("menu_yufolunchan") self.menuBinary = QtWidgets.QMenu(self.menuBar) self.menuBinary.setObjectName("menuBinary") self.menubase = QtWidgets.QMenu(self.menuBar) @@ -151,6 +154,12 @@ def setupUi(self, MainWindow): self.menubase_2.setObjectName("menubase_2") self.menu = QtWidgets.QMenu(self.menuBar) self.menu.setObjectName("menu") + self.menuDecode = QtWidgets.QMenu(self.menuBar) + self.menuDecode.setObjectName("menuDecode") + self.menuJS_2 = QtWidgets.QMenu(self.menuDecode) + self.menuJS_2.setObjectName("menuJS_2") + self.menu_4 = QtWidgets.QMenu(self.menuDecode) + self.menu_4.setObjectName("menu_4") MainWindow.setMenuBar(self.menuBar) self.actionURL_UTF8 = QtWidgets.QAction(MainWindow) self.actionURL_UTF8.setObjectName("actionURL_UTF8") @@ -216,8 +225,6 @@ def setupUi(self, MainWindow): self.actionRot13_decrypt.setObjectName("actionRot13_decrypt") self.action_zhalan_encrypt = QtWidgets.QAction(MainWindow) self.action_zhalan_encrypt.setObjectName("action_zhalan_encrypt") - self.action_zhalan_decrypt = QtWidgets.QAction(MainWindow) - self.action_zhalan_decrypt.setObjectName("action_zhalan_decrypt") self.action_zhalan_w_encrypt = QtWidgets.QAction(MainWindow) self.action_zhalan_w_encrypt.setObjectName("action_zhalan_w_encrypt") self.action_zhalan_w_decrypt = QtWidgets.QAction(MainWindow) @@ -462,6 +469,52 @@ def setupUi(self, MainWindow): self.actionhexinjiazhiguan_encode.setObjectName("actionhexinjiazhiguan_encode") self.action_hexinjiazhiguan_decode = QtWidgets.QAction(MainWindow) self.action_hexinjiazhiguan_decode.setObjectName("action_hexinjiazhiguan_decode") + self.action_yufolunchan_v1_decrypt = QtWidgets.QAction(MainWindow) + self.action_yufolunchan_v1_decrypt.setObjectName("action_yufolunchan_v1_decrypt") + self.action_yufolunchan_v1_encrypt = QtWidgets.QAction(MainWindow) + self.action_yufolunchan_v1_encrypt.setObjectName("action_yufolunchan_v1_encrypt") + self.actionguanyu = QtWidgets.QAction(MainWindow) + self.actionguanyu.setObjectName("actionguanyu") + self.action_yufolunchan_v2_decrypt = QtWidgets.QAction(MainWindow) + self.action_yufolunchan_v2_decrypt.setObjectName("action_yufolunchan_v2_decrypt") + self.action_yufolunchan_v2_encrypt = QtWidgets.QAction(MainWindow) + self.action_yufolunchan_v2_encrypt.setObjectName("action_yufolunchan_v2_encrypt") + self.actionRot5_decrypt = QtWidgets.QAction(MainWindow) + self.actionRot5_decrypt.setObjectName("actionRot5_decrypt") + self.actionRot18_decrypt = QtWidgets.QAction(MainWindow) + self.actionRot18_decrypt.setObjectName("actionRot18_decrypt") + self.actionRot47_decrypt = QtWidgets.QAction(MainWindow) + self.actionRot47_decrypt.setObjectName("actionRot47_decrypt") + self.action_zhalan_decrypt = QtWidgets.QAction(MainWindow) + self.action_zhalan_decrypt.setObjectName("action_zhalan_decrypt") + self.actionADFGX_encrypt = QtWidgets.QAction(MainWindow) + self.actionADFGX_encrypt.setObjectName("actionADFGX_encrypt") + self.action_ADFGX_decrypt = QtWidgets.QAction(MainWindow) + self.action_ADFGX_decrypt.setObjectName("action_ADFGX_decrypt") + self.action = QtWidgets.QAction(MainWindow) + self.action.setObjectName("action") + self.actionSocialism_encode = QtWidgets.QAction(MainWindow) + self.actionSocialism_encode.setObjectName("actionSocialism_encode") + self.actionSocialism_decode = QtWidgets.QAction(MainWindow) + self.actionSocialism_decode.setObjectName("actionSocialism_decode") + self.actionjother_encode = QtWidgets.QAction(MainWindow) + self.actionjother_encode.setObjectName("actionjother_encode") + self.actionjother_decode = QtWidgets.QAction(MainWindow) + self.actionjother_decode.setObjectName("actionjother_decode") + self.actiona1z26_encrypt = QtWidgets.QAction(MainWindow) + self.actiona1z26_encrypt.setObjectName("actiona1z26_encrypt") + self.actiona1z26_decrypt = QtWidgets.QAction(MainWindow) + self.actiona1z26_decrypt.setObjectName("actiona1z26_decrypt") + self.actionbaijiaxing_encode = QtWidgets.QAction(MainWindow) + self.actionbaijiaxing_encode.setObjectName("actionbaijiaxing_encode") + self.actionbaijiaxing_decode = QtWidgets.QAction(MainWindow) + self.actionbaijiaxing_decode.setObjectName("actionbaijiaxing_decode") + self.menuJS.addAction(self.actionJsFuck_encode) + self.menuJS.addAction(self.actionJJEncode_encode) + self.menuJS.addAction(self.actionAAEncode_encode) + self.menuJS.addAction(self.actionjother_encode) + self.menu_3.addAction(self.actiontupian_hex_encode) + self.menu_3.addAction(self.actiontupian_base64_encode) self.menuEncode.addAction(self.actionURL_encode) self.menuEncode.addAction(self.actionUnicode_encode) self.menuEncode.addAction(self.actionEscape_U_encode) @@ -473,44 +526,37 @@ def setupUi(self, MainWindow): self.menuEncode.addAction(self.actionShellcode_encode) self.menuEncode.addAction(self.actionQwerty_encode) self.menuEncode.addAction(self.actionStr_Hex_encode) - self.menuEncode.addAction(self.actiontupian_hex_encode) - self.menuEncode.addAction(self.actiontupian_base64_encode) - self.menuEncode.addAction(self.actionJsFuck_encode) - self.menuEncode.addAction(self.actionJJEncode_encode) - self.menuEncode.addAction(self.actionAAEncode_encode) - self.menuDecode.addAction(self.actionURL_decode) - self.menuDecode.addAction(self.actionUnicode_decode) - self.menuDecode.addAction(self.actionEscape_U_decode) - self.menuDecode.addAction(self.actionHtmlEncode_decode) - self.menuDecode.addAction(self.actionASCII_2_decode) - self.menuDecode.addAction(self.actionASCII_8_decode) - self.menuDecode.addAction(self.actionASCII_10_decode) - self.menuDecode.addAction(self.actionASCII_16_decode) - self.menuDecode.addAction(self.actionShellcode_decode) - self.menuDecode.addAction(self.actionQwerty_decode) - self.menuDecode.addAction(self.actionHex_Str_decode) - self.menuDecode.addAction(self.actionhex_tupian_decode) - self.menuDecode.addAction(self.actionbase64_tupian_decode) - self.menuDecode.addAction(self.actionJsFuck_decode) - self.menuDecode.addAction(self.actionJJEncode_decode) - self.menuDecode.addAction(self.actionAAEncode_decode) + self.menuEncode.addAction(self.menu_3.menuAction()) + self.menuEncode.addAction(self.menuJS.menuAction()) + self.menuEncode.addAction(self.actionbaijiaxing_encode) + self.menuEncode.addAction(self.actionSocialism_encode) + self.menu_zhalan.addAction(self.action_zhalan_encrypt) + self.menu_zhalan.addAction(self.action_zhalan_w_encrypt) self.menuEncrypt.addAction(self.actionRot13_encrypt) self.menuEncrypt.addAction(self.action_kaisa_encrypt) - self.menuEncrypt.addAction(self.action_zhalan_encrypt) - self.menuEncrypt.addAction(self.action_zhalan_w_encrypt) + self.menuEncrypt.addAction(self.menu_zhalan.menuAction()) self.menuEncrypt.addAction(self.action_peigen_encrypt) self.menuEncrypt.addAction(self.action_mosi_encrypt) self.menuEncrypt.addAction(self.action_yunying_encrypt) self.menuEncrypt.addAction(self.action_dangpu_encrypt) self.menuEncrypt.addAction(self.action_sifang_encrypt) self.menuEncrypt.addAction(self.action_fangshe_encrypt) + self.menuEncrypt.addAction(self.actiona1z26_encrypt) self.menuEncrypt.addAction(self.action_Atbash_encrypt) + self.menuEncrypt.addAction(self.action_yufolunchan_v2_encrypt) self.menuEncrypt.addAction(self.action_weinijiya_encrypt) - self.menuEncrypt.addAction(self.action_xiandaimima) - self.menuDecrypt.addAction(self.actionRot13_decrypt) + self.menuEncrypt.addAction(self.actionADFGX_encrypt) + self.menuRot.addAction(self.actionRot5_decrypt) + self.menuRot.addAction(self.actionRot13_decrypt) + self.menuRot.addAction(self.actionRot18_decrypt) + self.menuRot.addAction(self.actionRot47_decrypt) + self.menu_zhanlan_decrypt.addAction(self.action_zhalan_decrypt) + self.menu_zhanlan_decrypt.addAction(self.action_zhalan_w_decrypt) + self.menu_yufolunchan.addAction(self.action_yufolunchan_v1_decrypt) + self.menu_yufolunchan.addAction(self.action_yufolunchan_v2_decrypt) + self.menuDecrypt.addAction(self.menuRot.menuAction()) self.menuDecrypt.addAction(self.action_kaisa_decrypt) - self.menuDecrypt.addAction(self.action_zhalan_decrypt) - self.menuDecrypt.addAction(self.action_zhalan_w_decrypt) + self.menuDecrypt.addAction(self.menu_zhanlan_decrypt.menuAction()) self.menuDecrypt.addAction(self.action_peihen_decrypt) self.menuDecrypt.addAction(self.action_mosi_decrypt) self.menuDecrypt.addAction(self.action_yiwei_decrypt) @@ -518,8 +564,11 @@ def setupUi(self, MainWindow): self.menuDecrypt.addAction(self.action_dangpu_decry) self.menuDecrypt.addAction(self.action_sifang_decrypt) self.menuDecrypt.addAction(self.action_fangshe_decrypt) + self.menuDecrypt.addAction(self.actiona1z26_decrypt) self.menuDecrypt.addAction(self.action_Atbash_decrypt) + self.menuDecrypt.addAction(self.menu_yufolunchan.menuAction()) self.menuDecrypt.addAction(self.action_weinijiya_decrypt) + self.menuDecrypt.addAction(self.action_ADFGX_decrypt) self.menuBinary.addAction(self.action2_8) self.menuBinary.addAction(self.action2_10) self.menuBinary.addAction(self.action2_16) @@ -562,6 +611,27 @@ def setupUi(self, MainWindow): self.menu.addAction(self.action_str_re) self.menu.addAction(self.action_str_xiaoxie) self.menu.addAction(self.action_str_daxie) + self.menuJS_2.addAction(self.actionJsFuck_decode) + self.menuJS_2.addAction(self.actionJJEncode_decode) + self.menuJS_2.addAction(self.actionAAEncode_decode) + self.menuJS_2.addAction(self.actionjother_decode) + self.menu_4.addAction(self.actionhex_tupian_decode) + self.menu_4.addAction(self.actionbase64_tupian_decode) + self.menuDecode.addAction(self.actionURL_decode) + self.menuDecode.addAction(self.actionUnicode_decode) + self.menuDecode.addAction(self.actionEscape_U_decode) + self.menuDecode.addAction(self.actionHtmlEncode_decode) + self.menuDecode.addAction(self.actionASCII_2_decode) + self.menuDecode.addAction(self.actionASCII_8_decode) + self.menuDecode.addAction(self.actionASCII_10_decode) + self.menuDecode.addAction(self.actionASCII_16_decode) + self.menuDecode.addAction(self.actionShellcode_decode) + self.menuDecode.addAction(self.actionQwerty_decode) + self.menuDecode.addAction(self.actionHex_Str_decode) + self.menuDecode.addAction(self.menu_4.menuAction()) + self.menuDecode.addAction(self.menuJS_2.menuAction()) + self.menuDecode.addAction(self.actionbaijiaxing_decode) + self.menuDecode.addAction(self.actionSocialism_decode) self.menuBar.addAction(self.menuEncode.menuAction()) self.menuBar.addAction(self.menuDecode.menuAction()) self.menuBar.addAction(self.menubase.menuAction()) @@ -576,15 +646,14 @@ def setupUi(self, MainWindow): QtCore.QMetaObject.connectSlotsByName(MainWindow) MainWindow.setTabOrder(self.Source_clear_Button, self.Source_Copy_Button) MainWindow.setTabOrder(self.Source_Copy_Button, self.Source_Paste_Button) - MainWindow.setTabOrder(self.Source_Paste_Button, self.Result_clear_Button) - MainWindow.setTabOrder(self.Result_clear_Button, self.Result_Copy_Button) - MainWindow.setTabOrder(self.Result_Copy_Button, self.zhuanyuan) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "CTF Tools By qianxiao996 ")) self.source_text.setText(_translate("MainWindow", "Source")) + self.Source_text.setPlaceholderText(_translate("MainWindow", "请在此处输入")) self.result_text.setText(_translate("MainWindow", "Result")) + self.Result_text.setPlaceholderText(_translate("MainWindow", "结果会显示在此处")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "996")) self.checkBox_line.setText(_translate("MainWindow", "按行处理")) self.encode_type.setItemText(0, _translate("MainWindow", "UTF-8")) @@ -595,21 +664,28 @@ def retranslateUi(self, MainWindow): self.Source_Copy_Button.setText(_translate("MainWindow", "复制")) self.Source_clear_Button.setText(_translate("MainWindow", "清空")) self.tab_add.setText(_translate("MainWindow", "增加tab")) - self.yijian_decode.setText(_translate("MainWindow", "一键解码")) - self.yijian_base.setText(_translate("MainWindow", "一键Base")) - self.yijian_decrypto.setText(_translate("MainWindow", "一键解密")) - self.yijian_jinzhi.setText(_translate("MainWindow", "一键进制")) - self.zhuanyuan.setText(_translate("MainWindow", "转源文本")) + self.xiandaimima.setText(_translate("MainWindow", "现代密码")) self.Result_Copy_Button.setText(_translate("MainWindow", "复制")) self.Result_clear_Button.setText(_translate("MainWindow", "清空")) + self.zhuanyuan.setText(_translate("MainWindow", "转源文本")) + self.miwenfenxi.setText(_translate("MainWindow", "密文分析")) + self.auto_get_flag.setText(_translate("MainWindow", "提取Flag")) self.menuEncode.setTitle(_translate("MainWindow", "常见编码")) - self.menuDecode.setTitle(_translate("MainWindow", "常见解码")) + self.menuJS.setTitle(_translate("MainWindow", "JS加密系列")) + self.menu_3.setTitle(_translate("MainWindow", "图片转换")) self.menuEncrypt.setTitle(_translate("MainWindow", "加密")) + self.menu_zhalan.setTitle(_translate("MainWindow", "栅栏密码")) self.menuDecrypt.setTitle(_translate("MainWindow", "解密")) + self.menuRot.setTitle(_translate("MainWindow", "Rot系列")) + self.menu_zhanlan_decrypt.setTitle(_translate("MainWindow", "栅栏密码")) + self.menu_yufolunchan.setTitle(_translate("MainWindow", "与佛论禅")) self.menuBinary.setTitle(_translate("MainWindow", "进制转换")) self.menubase.setTitle(_translate("MainWindow", "Base编码")) self.menubase_2.setTitle(_translate("MainWindow", "Base解码")) self.menu.setTitle(_translate("MainWindow", "字符处理")) + self.menuDecode.setTitle(_translate("MainWindow", "常见解码")) + self.menuJS_2.setTitle(_translate("MainWindow", "JS加密系列")) + self.menu_4.setTitle(_translate("MainWindow", "图片转换")) self.actionURL_UTF8.setText(_translate("MainWindow", "URL-UTF8 Encode")) self.actionURL_GB2312.setText(_translate("MainWindow", "URL-GB2312 Encode")) self.actionUnicode.setText(_translate("MainWindow", "Unicode Encode")) @@ -642,7 +718,6 @@ def retranslateUi(self, MainWindow): self.actionRot13_encrypt.setText(_translate("MainWindow", "Rot13")) self.actionRot13_decrypt.setText(_translate("MainWindow", "Rot13")) self.action_zhalan_encrypt.setText(_translate("MainWindow", "栅栏密码")) - self.action_zhalan_decrypt.setText(_translate("MainWindow", "栅栏密码")) self.action_zhalan_w_encrypt.setText(_translate("MainWindow", "栅栏密码(W型)")) self.action_zhalan_w_decrypt.setText(_translate("MainWindow", "栅栏密码(W型)")) self.action_zhujuan_encrypt.setText(_translate("MainWindow", "猪圈密码")) @@ -765,3 +840,23 @@ def retranslateUi(self, MainWindow): self.actionUUEncode_encode.setText(_translate("MainWindow", "UUEncode")) self.actionhexinjiazhiguan_encode.setText(_translate("MainWindow", "核心价值观")) self.action_hexinjiazhiguan_decode.setText(_translate("MainWindow", "核心价值观")) + self.action_yufolunchan_v1_decrypt.setText(_translate("MainWindow", "与佛论禅 1.0")) + self.action_yufolunchan_v1_encrypt.setText(_translate("MainWindow", "与佛论禅 1.0")) + self.actionguanyu.setText(_translate("MainWindow", "guanyu")) + self.action_yufolunchan_v2_decrypt.setText(_translate("MainWindow", "与佛论禅 2.0")) + self.action_yufolunchan_v2_encrypt.setText(_translate("MainWindow", "与佛论禅 2.0")) + self.actionRot5_decrypt.setText(_translate("MainWindow", "Rot5")) + self.actionRot18_decrypt.setText(_translate("MainWindow", "Rot18")) + self.actionRot47_decrypt.setText(_translate("MainWindow", "Rot47")) + self.action_zhalan_decrypt.setText(_translate("MainWindow", "栅栏密码")) + self.actionADFGX_encrypt.setText(_translate("MainWindow", "棋盘密码(ADFGX)")) + self.action_ADFGX_decrypt.setText(_translate("MainWindow", "棋盘密码(ADFGX)")) + self.action.setText(_translate("MainWindow", "核心价值观编码")) + self.actionSocialism_encode.setText(_translate("MainWindow", "核心价值观编码")) + self.actionSocialism_decode.setText(_translate("MainWindow", "核心价值观解码")) + self.actionjother_encode.setText(_translate("MainWindow", "jother")) + self.actionjother_decode.setText(_translate("MainWindow", "jother")) + self.actiona1z26_encrypt.setText(_translate("MainWindow", "a1z26密码")) + self.actiona1z26_decrypt.setText(_translate("MainWindow", "a1z26密码")) + self.actionbaijiaxing_encode.setText(_translate("MainWindow", "百家姓编码")) + self.actionbaijiaxing_decode.setText(_translate("MainWindow", "百家姓编码")) diff --git a/Plugins/__pycache__/filename.cpython-37.pyc b/Plugins/__pycache__/filename.cpython-37.pyc index 9523a7e9a0405de564049651bc650c04b0b45173..e183c015b35b0745c216664ac29467aed8f8b31e 100644 GIT binary patch literal 404 zcmZ?b<>g`k0!H4ONfFEp439w^7+?Z29Dul31W2SXq%gKHL@}f=r7#0&#uS!d22Ivv zpdK&)(X2r148+AkK%#~zg%PASg{7H=5vUua+V2)uX=c1pd~!}^a&{>XP}TEQ)1US) zezu_f<)Rr;Y(9xesX2yF+Gr(%Ci5-s;{4L0g`k0?psM<6MFCV-N=hn1BoiATH(s5-AKRj4cdN3@J>(44TZzj6fj}0I317 zoq@QR14yJW)-u*G0@X12m4fs=>!0*w_qJzSyI-uIx)LaQi@P|#v?w_>z9hAxXTd8$*1+!NC@2WN9?aw9TyNVS0KA zYYnGG;+hl3Xf5TE8>dJKQjYlrD2Ki#An^loPgT$E7>p0u)qMMPb@z02)z{TK-)=Vu ze2%lfZdkzn#>Vtx0{I4>{9AyKgj!4z&DAvIdaNggYb2&?sMf=LA8w0G+CdxzTPy^Ur6~(U*?)me`YDdSoQ2G-`+=h3fEe*SI!fOPb>hrAB&!6%;qAX-DCT1%VNy71jOdeEF{jH+B> zATW>UQGONxazgsrSl=agwE`rwrSlWY2Kfwi%tAU-wT&t(=CW%nF3ewCbu5ktiFW~H zGZ=8rQnAYJ2-(2MU4hLGBiVoeEvEjBn1zncUztweuOU9?T& z4>3DFR6yC7^cxWUF4($Yv-fQ3T+n4{vr@$zPbg@A5Cl+0o~f3_IM2AW7S)frw0!Y9 z=kQ*t_#94ADcXrP2K~rwW4cx$UBS&P-Q;gzzbUFj&O=Y)%ep!a(a_Jz$yc)h514F< z>`LrMsY-l1$dVfwlrm2Yx0$q|!udjQUaOY;p5=oWP8z79n#Qr}N*eG;M1dd6W|VF~ z4fI8nrA|X>Mp8U$2^>b*KsNOpxtMw`YuJo#mqQ>zINV0t78{nv#8dlHZ&NNdxpGLE z_iGZ58j3SN3V@n?;j15m_7Qyao#O}T6yr55HkCqAohWgo&_97FT})5m%L=tXaiv0Q zN^w(#qJ65+I`C4V4K>CVP0^aD(tci*Bl|8bXr;*?)!Oax4A}NGS@xqQABxU+R%x>A zFE!awI<+Trz*cE8EGwtdB!3h3#*ZPqg>W3_XA;cM(n?yoc~1!utpx zAUFu9Bz_X%BLq|q{}|yD0HwEVA$*GP8Nz9V&k^vlva(M(Sj^TozGmD{v#?-;JCb_!5ko+qty1)O+r4 qhPq7MPU&lJV~_@Tzm);USMT{!GW0~!ugdXXW93oq;H?Db#P|=RN>^6^ literal 0 HcmV?d00001 diff --git a/__pycache__/frozen_dir.cpython-37.pyc b/__pycache__/frozen_dir.cpython-37.pyc index cfc6904f89dc34ed49d4abc48095961aa4d7a1fa..68a3666205c47de30301ef0b2b557ad0104c6749 100644 GIT binary patch delta 21 bcmbQiJcF6XiIZzgTz>0tx_E)WE) delta 21 bcmbQiJcF6XiI0tx_F5?8j diff --git a/config.ini b/config.ini index 374db5d..699d66a 100644 --- a/config.ini +++ b/config.ini @@ -1,5 +1,5 @@ [QSS_Setup] -qss = default.qss +qss = black.qss [QSS_List] 默认皮肤 = default.qss @@ -8,5 +8,6 @@ qss = default.qss 黑色炫酷 = black_2.qss mac风格 = mac.qss - +[Skin] +default = 默认皮肤 diff --git a/module/AutoGetFlag.py b/module/AutoGetFlag.py new file mode 100644 index 0000000..0b7d5bf --- /dev/null +++ b/module/AutoGetFlag.py @@ -0,0 +1,185 @@ +# GUI 独立程序 密文分析 +import importlib +import json,time,os,sys +from treelib import Tree +from PyQt5.QtCore import QThread, pyqtSignal + +if hasattr(sys, 'frozen'): + os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH'] +from module.func_binary import Class_Binary +from module.func_decode import Class_Decode +from module.func_encrypt import Class_Encrypt +from module.func_encode import Class_Encode +from module.func_tools import Class_Tools +from module.func_decrypt import Class_Decrypt +# 识别密文 +def Cipherase(cryptostr, key1, key2, key3): + + all_jiemi_result = [] + # 存放所有可调用的方法 + class_methods_list = [] + # 导入自定义解密插件 + with open("Plugins/Plugins.json", 'r+', encoding='utf-8') as f: + Crypto_json = json.load(f) + for i in Crypto_json: + plugins_filename = "Plugins/" + Crypto_json[i] + plugins_methods = "Plugins/" + Crypto_json[i][:-3] + nnnnnnnnnnnn1 = importlib.machinery.SourceFileLoader(plugins_methods, plugins_filename).load_module() + # 参数一为类对象,二为方法名 + class_methods_list.append([nnnnnnnnnnnn1, 'run',i]) + # str1 = "import Plugins.{crypto_name}".format(crypto_name=i) + # exec(str1) + for i in ["Class_Decode", "Class_Decrypt"]: + obj = eval(i) + # 得到所有方法 + a = (dir(obj)) + for j in a: + # print(j[:5]) + if j[:5] == "func_": + class_methods_list.append([obj, j,j.replace('func_','')]) + + for i in class_methods_list: + Function = getattr(i[0], i[1]) # 以字符串的形式执行函数 + Function_canshu_num = Function.__code__.co_argcount + result='' + try: + if Function_canshu_num == 3: + result = Function(i[0], 'utf-8', cryptostr) + elif Function_canshu_num == 4: + result = Function(i[0], 'utf-8', cryptostr, key1) + elif Function_canshu_num == 5: + result = Function(i[0], 'utf-8', cryptostr, key1, key2) + elif Function_canshu_num == 6: + result = Function(i[0], 'utf-8', cryptostr, key1,key2,key3) + else: + pass + except: + pass + if result and len(result)>=3 and result[0] and result[1] and result[1]!=cryptostr and len(str(cryptostr)) > len(str(result[1])): + #密码名称,解密结果 + all_jiemi_result.append([result[2],cryptostr,result[1]]) + return all_jiemi_result + +class AutoGetFlag(QThread): + signal = pyqtSignal(list) + + def __init__(self, cryptostr, key1, key2, flag_str): + super().__init__() + self.cryptostr = cryptostr + self.key1 = key1 + self.key2 = key2 + self.flag_str = flag_str + + def run(self): + self.depth=10 + # 识别密文 + #0 识别成功 解密结果 解密类型 + result = Cipherase(self.cryptostr, self.key1, self.key2, self.flag_str) + # result=[] + # for i in result_list: + # result.append([i[2],i[0],i[1]]) + # + # if self.log: + ################### + # 生成第一个父子节点 + FandS_node = [] # 0为父节点,其他为子节点,格式为 [ ["parent","name1","name2"],[...] ] + temp_FS_node = [] + + cry_path = Tree() + tree = cry_path.create_node(tag='Path',) # 解密路线树 + for i in result: + test = cry_path.create_node(tag=i[0], parent=tree) + temp_FS_node.append(test.identifier) + FandS_node.append(temp_FS_node) + ############### + Flag = False # 判断flag存不存在的关键词 + self.res = '' + filename = '' + cry_cryptostr = '' + depth_s = True + if self.depth != '': + depth_num = int(self.depth) - 1 + else: + depth_num=9 + while(len(result) != 0 and len(result) < 100 and depth_s and not Flag): + # 每轮广度遍历时初始化变量 + temporary = [] + result_dict = {} + temp_FandS_node = [] + for i in result: + # print(i) + try: + self.res = i[2] + if self.flag_str in i[2]: + # print(i[2]) + # self.signal.emit([1,i[2]]) + Flag =True + self.res = i[2] + # if self.log: + cry_path.create_node( + tag=i[2], parent=FandS_node[result.index(i)][0], data=i[1]) + #########3 + break + except: + pass + # 密文分析后的cryptoname + # aaa_result = [] + aaa_result = Cipherase(i[2], self.key1, self.key2, self.flag_str) + # for j in fenxi_result: + # aaa_result.append([j[2], j[0], j[1]]) + # 不需要导日志则不必要生成crypto_name与name的字典 + temp_FS_node = [] + # # if self.log and len(FandS_node) != 0: + if len(FandS_node) != 0: + for j in aaa_result: + # print(i) + # print(result.index(i)) + test = cry_path.create_node( + tag=j[0], parent=FandS_node[result.index(i)][0], data=j[2]) + temp_FS_node.append(test.identifier) + temp_FandS_node.append(temp_FS_node) + temporary.extend(aaa_result) + if Flag: + break + result = temporary + FandS_node = temp_FandS_node + if self.depth != '': + depth_num = depth_num - 1 + if depth_num > 0: + depth_s = True + else: + depth_s = False + # print(["查找完成!"]) + now2 = time.strftime('%Y-%m-%d %H-%M-%S', time.localtime()) + cry_path_name = "./{}.txt".format(now2) + cry_path.save2file(cry_path_name) + # 读取解析树 + try: + with open(cry_path_name, "r", encoding="utf-8") as f: + cry_tree = f.read() + os.remove(cry_path_name) + except: + pass + len_k = '' + for k in cry_path.paths_to_leaves(): + if len(k) > len(len_k): + len_k = k + # if Flag == False: + # cry_path.create_node( + # tag=self.flag_str + "【无法解密】", parent=len_k[-1]) + # 最长解密链 max_long_cry + test_m = [] + for m in len_k: + test_m.append(cry_path.get_node(m).tag) + if Flag == False: + test_m.append(self.flag_str) + max_long_cry = ' -> '.join(test_m) + + # 最终密文 + cry_fin = cry_path.get_node(len_k[-1]).data + textaaa = "\nflag关键词:{}\n\n密钥1:{}\n\n密钥2:{}\n\n深度:{}\n\n初始密文:{}\n\n解析树:\n{}\n最长解密链:\n{}\n\n最终密文:\n{}\n\n最终解密结果:\n{}\n\n".format( + self.flag_str, self.key1,self.key2,self.depth, self.cryptostr, cry_tree, max_long_cry, cry_fin,self.res) + if not Flag: + self.signal.emit([0,textaaa]) + else: + self.signal.emit([1,textaaa]) diff --git a/module/Buddha.py b/module/Buddha.py new file mode 100644 index 0000000..8937abe --- /dev/null +++ b/module/Buddha.py @@ -0,0 +1,83 @@ + +# !/usr/bin/env python3 +# pip3 install pycryptodome py7zr -i https://pypi.tuna.tsinghua.edu.cn/simple +# 源码参见 https://github.com/lersh/TudouCode/ +# 代码更新 https://github.com/playGitboy/foYu.py/edit/main/%E4%B8%8E%E4%BD%9B%E8%AE%BA%E7%A6%85.py + +from Crypto.Cipher import AES +from re import split +from py7zr import SevenZipFile +from io import BytesIO + + +KEY = b'XDXDtudou@KeyFansClub^_^Encode!!' +IV = b'Potato@Key@_@=_=' + +foYue = [ + '滅', '苦', '婆', '娑', '耶', '陀', '跋', '多', '漫', '都', '殿', '悉', '夜', '爍', '帝', '吉', + '利', '阿', '無', '南', '那', '怛', '喝', '羯', '勝', '摩', '伽', '謹', '波', '者', '穆', '僧', + '室', '藝', '尼', '瑟', '地', '彌', '菩', '提', '蘇', '醯', '盧', '呼', '舍', '佛', '參', '沙', + '伊', '隸', '麼', '遮', '闍', '度', '蒙', '孕', '薩', '夷', '迦', '他', '姪', '豆', '特', '逝', + '朋', '輸', '楞', '栗', '寫', '數', '曳', '諦', '羅', '曰', '咒', '即', '密', '若', '般', '故', + '不', '實', '真', '訶', '切', '一', '除', '能', '等', '是', '上', '明', '大', '神', '知', '三', + '藐', '耨', '得', '依', '諸', '世', '槃', '涅', '竟', '究', '想', '夢', '倒', '顛', '離', '遠', + '怖', '恐', '有', '礙', '心', '所', '以', '亦', '智', '道', '。', '集', '盡', '死', '老', '至'] + +BYTEMARK = ['冥', '奢', '梵', '呐', '俱', '哆', '怯', '諳', '罰', '侄', '缽', '皤'] + +ruShiWoWen = [ + '謹', '穆', '僧', '室', '藝', '瑟', '彌', '提', '蘇', '醯', '盧', '呼', '舍', '參', '沙', '伊', + '隸', '麼', '遮', '闍', '度', '蒙', '孕', '薩', '夷', '他', '姪', '豆', '特', '逝', '輸', '楞', + '栗', '寫', '數', '曳', '諦', '羅', '故', '實', '訶', '知', '三', '藐', '耨', '依', '槃', '涅', + '竟', '究', '想', '夢', '倒', '顛', '遠', '怖', '恐', '礙', '以', '亦', '智', '盡', '老', '至', + '吼', '足', '幽', '王', '告', '须', '弥', '灯', '护', '金', '刚', '游', '戏', '宝', '胜', '通', + '药', '师', '琉', '璃', '普', '功', '德', '山', '善', '住', '过', '去', '七', '未', '来', '贤', + '劫', '千', '五', '百', '万', '花', '亿', '定', '六', '方', '名', '号', '东', '月', '殿', '妙', + '尊', '树', '根', '西', '皂', '焰', '北', '清', '数', '精', '进', '首', '下', '寂', '量', '诸', + '多', '释', '迦', '牟', '尼', '勒', '阿', '閦', '陀', '中', '央', '众', '生', '在', '界', '者', + '行', '于', '及', '虚', '空', '慈', '忧', '各', '令', '安', '稳', '休', '息', '昼', '夜', '修', + '持', '心', '求', '诵', '此', '经', '能', '灭', '死', '消', '除', '毒', '害', '高', '开', '文', + '殊', '利', '凉', '如', '念', '即', '说', '曰', '帝', '毘', '真', '陵', '乾', '梭', '哈', '敬', + '禮', '奉', '祖', '先', '孝', '雙', '親', '守', '重', '師', '愛', '兄', '弟', '信', '朋', '友', + '睦', '宗', '族', '和', '鄉', '夫', '婦', '教', '孫', '時', '便', '廣', '積', '陰', '難', '濟', + '急', '恤', '孤', '憐', '貧', '創', '廟', '宇', '印', '造', '經', '捨', '藥', '施', '茶', '戒', + '殺', '放', '橋', '路', '矜', '寡', '拔', '困', '粟', '惜', '福', '排', '解', '紛', '捐', '資'] + + +def DecryptFoYue(ciphertext): + ciphertext = split("[::]", ciphertext) + if len(ciphertext)>1: + ciphertext = "".join(ciphertext[1:]).strip() + else: + ciphertext = ciphertext[0] + data = b'' + i = 0 + while i < len(ciphertext): + if ciphertext[i] in BYTEMARK: + i = i + 1 + data = data + bytes([foYue.index(ciphertext[i]) + 128]) + else: + data = data + bytes([foYue.index(ciphertext[i])]) + i = i + 1 + cryptor = AES.new(KEY, AES.MODE_CBC, IV) + result = cryptor.decrypt(data) + flag = result[-1] + if flag < 16 and result[-flag] == flag: + result = result[:-flag] + return result.decode('utf-16le') + + +def DecryptRuShiWoWen(ciphertext): + ciphertext = split("[::]", ciphertext) + if len(ciphertext)>1: + ciphertext = "".join(ciphertext[1:]).strip() + else: + ciphertext = ciphertext[0] + data = b'' + for i in ciphertext: + data += bytes([ruShiWoWen.index(i)]) + cryptor = AES.new(KEY, AES.MODE_CBC, IV) + fsevenZip=SevenZipFile(BytesIO(cryptor.decrypt(data))) + zipContent = fsevenZip.readall()['default'].read() + return zipContent + diff --git a/module/CipherAnalyse.py b/module/CipherAnalyse.py new file mode 100644 index 0000000..0d3095e --- /dev/null +++ b/module/CipherAnalyse.py @@ -0,0 +1,71 @@ +# GUI 独立程序 密文分析 +import importlib +import json +from PyQt5.QtCore import QThread, pyqtSlot, pyqtSignal +from module.func_binary import Class_Binary +from module.func_decode import Class_Decode +from module.func_encrypt import Class_Encrypt +from module.func_encode import Class_Encode +from module.func_tools import Class_Tools +from module.func_decrypt import Class_Decrypt + + +class Cipher_Thread(QThread): + signal = pyqtSignal(list) + + def __init__(self, cryptostr, key1, key2, key3): + super().__init__() + self.cryptostr = cryptostr + self.key1 = key1 + self.key2 = key2 + self.key3 = key3 + + def run(self): + # 识别密文 + # 存放所有可调用的方法 + class_methods_list = [] + # 导入自定义解密插件 + with open("Plugins/Plugins.json", 'r+', encoding='utf-8') as f: + Crypto_json = json.load(f) + for i in Crypto_json: + plugins_filename = "Plugins/" + Crypto_json[i] + plugins_methods = "Plugins/" + Crypto_json[i][:-3] + nnnnnnnnnnnn1 = importlib.machinery.SourceFileLoader(plugins_methods, plugins_filename).load_module() + # 参数一为类对象,二为方法名 + class_methods_list.append([nnnnnnnnnnnn1, 'run',i]) + # str1 = "import Plugins.{crypto_name}".format(crypto_name=i) + # exec(str1) + for i in ["Class_Decode", "Class_Decrypt"]: + obj = eval(i) + # 得到所有方法 + a = (dir(obj)) + for j in a: + # print(j[:5]) + if j[:5] == "func_": + class_methods_list.append([obj, j,j.replace('func_','')]) + + for i in class_methods_list: + Function = getattr(i[0], i[1]) # 以字符串的形式执行函数 + Function_canshu_num = Function.__code__.co_argcount + result='' + try: + status=0 + type__ ='' + if Function_canshu_num == 3: + status,result,type__= Function(i[0],'utf-8',self.cryptostr) + elif Function_canshu_num == 4: + status,result,type__= Function(i[0],'utf-8',self.cryptostr,self.key1) + elif Function_canshu_num == 5: + status,result,type__ = Function(i[0],'utf-8',self.cryptostr,self.key1,self.key2) + elif Function_canshu_num == 6: + status,result,type__ = Function(i[0],'utf-8',self.cryptostr,self.key1,self.key2,self.key3) + else: + pass + + if status and len(result)>=3: + # 发出信号 + self.signal.emit([1,type__,result]) + except Exception as e: + pass + # self.signal.emit([i[2],str(e)]) + self.signal.emit([1,"end",'']) diff --git a/module/__pycache__/AutoGetFlag.cpython-37.pyc b/module/__pycache__/AutoGetFlag.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82d5e8e56b61d25c4ac0bf67b76429a26002ab72 GIT binary patch literal 4122 zcmZu!-ESOM6~A|8c6N65d+j*3lY$i~1=HGX(*mUprHNDbLo{+~OKwLg!(?Y{?|OE2 zeP=e1nREqlh(6YZu+zaptM*lB-X!!`4}vllRM= zidB*G4Zqr{SvA=%`1MZ1YRIabdl%hghLS5c`BrbzrziC#`wT=O}DtG z4E0@KW*gsLX1jcIGR|E<{c;U@i?QLBCKzaWg6$|tHLkWx?Q&9ci%EU!)wt$X)|Fi@ zCgW-*>8df?QImS`P4KFc_vlex%y%?!&x2c#+!ycU#>!3({8Ql9B!ByEeyr~3kYLL! zC~-!=msp^@$l|*AD5}Ku9S)mv;-k1umdhHpAJ#EjS4l3a!cM-!WvecChu*pdISrn! zyLIduI*Bv%&_~NG)^JH17q>?j{Qhby2p<^Mv+b}OY%Aiv?OZ=vnRyf!$nfZ9wSv`c z<52kEKR0jQOjXejrWH}Z4H9LLgB(bjTj>W)J7ofQiXBLzQj0F$flfpLnXaW;x90_^ zMhm8z-^I%)v^u@6i2T--w9s*yYpuW&TWM{v+ZRo5zU6yghmp z+e!;_t=^g^oY1R5Nq7N-DH?t?KFUpA0&OUxs>uz-;3h_=lnQTfgKJy?zkxz>V<_W_ z#&!IjQBHDk7J8bb?C_&YKwo%2h{q_tTZ*T8+77pJZ?F|kVdpi&(kb*HuIArh8nX;s z(_C6SVsw*k8GTgKRU*aVy&w_WVFSL0cNFuO*-ET{sxjWNt;HH>&Sg-?FHY-eF6{Sk zlW;FuK`XLtF%1Rc3qw+j?^V+HLj0-r@>*AdI} zSkH9xh~)XibPdF6)&^K2&Rj?QL>m#QFwT-vpt)vJLWKQBR6-o&uC}i3DuNAr#dSu# zxG1TytAvCua*loswM`qmQcqo|B^X=hn)T}K>#1nV0|xY=GvR*CtbOo#*| zpuOpC0j=^im9vHaiKXz~aD_YkSChUgAx3AmbMe9Eb8!uRJD=30-|ABL-D}B6Ol#fc z%j%&oclkzy=vp3B;+jOazoTbhKYv-kXu{)aLT8zI^_{qs`4hFau0iTk^7_U*I1SKc z7F7qpCD8gF+f$N;TOBmw2C#Spv3(>Sp%u0sj7H-Tx8~N}1`xZFjK-sbV?f$txA8g} z8ywH1@5UOO^w{R-p>2GRVfQDK<2b|PK$B8DMks<46!Gz7Y**P3%XEt4n^W-^B*&A9 zcpSUd1{3kb9&b;QEsz5G0zY*io+AD%C2+39b4Laz;&IqMDd&v2qZ17CP9`VZW7rj) z{_Q)C8-Y82ES`){pk?kAl9TYF8s3ZEJ%i7(`^}9H-aTZ!`Li4EeHY^UKYn94^vQd_ z*nfL>fAD?uO(@&H{_4Sx{)kah`qm$Yqcr^Shi~4RNs_~{O!VUq-`aos`l0mnXVaYP z^`bQy!2e&+6BKi;ViUP+KX9zRJ1ZmJ@=B#u>0=-W6s%KSuIN8t! z)cPJ|L(2fxXXeNQ*4o`xAfBbkdYC2K8sIyczDJzHp!f=iWzIW+yC`Q_rO4~_?D=8O zKsI305|$Pre-{r*D<0_pAwB=lA>18v)F zH6yEX(8EW<&as}>nUHibTZKHq`YI5 zI?kr;cY{?j&B~LFE3LrFM>qs5lA#sl4H;w+_>;53pMWr~t7C@7HAP1PKp9ZoWdOZ)NxHiqF`e56lT|W1*6JvHWCT0D+ZDY6LS=B8_Ip1mKx(zKRw>dPv!;fkdd37c@3~Lf{WA6O%+!ycb+;38Z|D zEMJ?I>GT!(Z%`Pd{|<&L{}##|JRLbY14%n&qC$qjJEq8V-V>B+r1hgyBKpTDN;H0l tDy$(@QI4O51={_Q8+7X$rN-Gz;S&@jLUN43r|A3@lTV_)^;3)o{tH>yYDxeA literal 0 HcmV?d00001 diff --git a/module/__pycache__/CipherAnalyse.cpython-37.pyc b/module/__pycache__/CipherAnalyse.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..418b0cb11a364b7821c6df5849e3f24f478829c0 GIT binary patch literal 2181 zcmZuyOK;pZ5GM6nNxRyY9jED`D1suuqKTU{eW56dHg;T~D2zA>;8fT^kVSf}wH|9q zTX+{zP+(o;R5ZsN*S)pBriWh2Yft_IJrpR?A+;OFNGNbPBtH&khBKo(j$x0o!O2FzE`vmb#FL~w-MYQ!#vxe_U{>Z-BkYO(I>SnR2h5!c+BYE*vC&)Wf{75&2o>-3b$)P0r_=G)M`Bxl`@mO#(I<<>vrc zr~vf}@GwoI>>Lm01wIgZEStJuvg^Q5B>dtkRHfPsyZTeKj|nEqiRl_dCE5vcYfq7e zTodfkL5*;9K$%xr6X*+3VpO0D(b+X1Ihvt4K1CQ6xIms#C_vRh1*#PqP@NzUh_`zN z*R%16GH!Zan1s3KaZBo)W;x^9A)VZk^g~H+gAQ6oqkYzdTUbkwwjdoKV7BFXfpnzz z8~XQ?&CmP7JN{oM!W@t#gl00% zu#FA*P1i0MzrNHrzM!k5$?+V#af(ZI7lLmG z-A9km@phqZqQ_gMMs)Czb_HEVrM~1LM2(*mxn|_*P@C(8QRt`2+&D#Lt-$kIQ6sfN z8>pukqoeg*bbOzfAn)5!%gq9wwKQ|9Fk!TgKPoKPxnA0Z4RS3Zm)M62doJae1+33) zVw3u*vXJ+D7acv>MbGf@^#X6g`1mTwtrr?;TtPscD`=*a^`bs(44tw;>ZLQ`q)|43 zYZVRBJXD@xcCA>PAP@t?=1lFYWwUh3R&oNEmc(pd!~m`}(_Z5GfU_iS`Z^AKk`K3b}_W!}C zY-2Rl#5)q;pR^yL?*Z`$`Yu|YCLL0*PRoezZckV5MdLx3WFIWX^oc zV7W>Y(p%$NI-&{J#D!doQm98(7>`nxN8ui~Vm~+t6UrvM{U9B)fNq5m{SHu&oppis zs*K@=KLR;~YxD;{;wlLluQ57`{DAV>faZPddV>+W$tM|qegy$lgx|4Ea!ONt#60|mwM7B9P;+4@~*cJ z$|rtId26|{ILe*mm3E7(P!%}#IUaIz3mhpfbyt?07x+nbF!qvh%ne4fag>9qVB$FA zMm`w{12JW*pkhTX3GOW*m!W5yK#-~_ZM+JFqye<6tg1FP6%*UA`mWN%U2I|vE6_E- zybb*w=vSd%(^i!=*k4noor}ds#DOJzEKCFyY;W;6z&AYaXzWMT4iiBDj}7i(H-VMa zP3p&;MX?NM6nWmc2|dhK1X5Ze3YsX0nTR73^lsFcSnI8@_h4XGf$+w?$xi<9`cA%) zGRnlCfQbOC?(SAmvo3>lPyXPT4BHDEME>byWb>6*Pe3Y&7iKka(S;*2NhmYLM(5Qd rx%de(ORQfI1$RhMB6Fk>=Qf|e9XG$IWPK^@$VBXc+3;|U^H2RB8F@ut literal 0 HcmV?d00001 diff --git a/module/__pycache__/aes_func.cpython-37.pyc b/module/__pycache__/aes_func.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a06b36df8ba8cdd11f370d2ebf27dae50fa3aec7 GIT binary patch literal 3903 zcmbtW-ESOM6`wobJG<-nW8*jlN?f9dEv>2T)JY185<3a)18$TAfkvjw?#?8h^?KI1 zGh1wHR!ZfjNJybo8xT}HtOaSQgc>1LB1%d7#uL22+kHStjT8HYKOj&1&YfAuPH8}5 zR`;CyalY=y`R$o5799oO=wJU{`_~hS@)-?!pN7r}wCFt$Pw`k&aZ}D*CdaC)O0Kz@ z;H@zH;IwCjItVU7gq#xC7Xw#QRGtp+yqIa31BxY0~bC=ZfN{rDO z^RxwxAI#SoY%(E6O9z#RVv|oXgEv59RfqpLSXBv89MOQq> z%gb4%t0q>ulKM=qVO{!y%T^~8*|hLPy&TE`CG#!3+@f7xC!*Hz4~V!jXa z_qOM)Oyfsb*|VU&#rRXP-N-eZhVJ#p`MA(6LIOKpQ@w#}Y9|LTsjt2y=M7#XZwH|} zBz2E(+uf7dwXwI7+=bokPb{2S%5{GP-_so4pUfJoH>GqSE=xcA@fB)mHpMSb>`@M}% zuWqe>EOkh-Jp_>rxxUM(P}<~n^X4BnKY3^4>WzE9{Mo%<{A5&UGt)DiUK)C5ra>;8 z+q!}wJQjm6h=Xdg@@lo&_Az1ATkSCRxzJudGu_?~sg0j@vB7)4Ti^K8o0}hga{tbU zTi1WJdGqF|FsG}LKXn*dwjb78UJzaq+Kc|Ou%dRo?nhC1SZGZ@6sBDEMXu^cm0J69 zP~nt6LJR#L3;Vk-pE_MZh*=M3(3?ZB<_uq1id#beUK})qHPeeO2xDQ_g0LFZgFsmG z{&F+8xYAR+a4zd%6T*UbG9t7n=EAJWphZ57skRdPkub0lED5VNQLVsKIWP3cZ(bBO z1-#hueBn@UHMrPr1focNoLX3)Z(++O4TD!xk!+_H%`NyV>EvQ1_LpOvt=tRFwvIsZ z+>hHlluI8d{COP6gYi=@%;6yYxw9)VY)>AUYtRwCDtg!gOY<2hkj6vjQ589Z8?SXb`Pma)&+1O3Yz{stxL}5l9WIs{`B6 zG?txO-6FgAc0ts2f+%AbL>W6Eiuyf>qW*4(GBUt1kitEP(mn@K+75`)G7Sx|cm>HV z6EV@fJYePBSnXmyl_1~?2eCpB_4`=w8i|>KAwkohW3y`|Mr=0hL<4A9;q?rh{;|E1 z187-cl0lQgA8fBUnGV5Lzl4gZINvBViVe#fi2LF_02?iXtwF$+4L_;3fyDNP09%%X zt&-F|w{3SYvrDkGmmp^45TJKRMxINQZYjx02y*~R1noI*IFZoJ6#7AHA8C0Cz-eTb z>$t4PKod8x&gsvF)7AcO&?MpG|A405z(jZgVB!N51c4c+xg*O! z0$gYP5uu!qn4a-^@btlVv6VRJUG2QejH?rhQdA>M!^q` zO-!yjv#kS}iL&_+7Vxh;&xOIO;U!;~U|wrcSj16ll>5?$tII!f6GhFXc%DB?E+~)P z;&wSup(4YORg};Ws8DN>TL1`9$dxEq^@Wv<9!`^0*S?IBqH-SUEO<0M_K_#F$OTc5 zt~yd1Kdl5>PzUKBp6NRM=NHsIBsGl-fPfMk!CX2c=aBq5)=T*58d*W|!-^xVtPVX) zJ1R0{tu|Y>gk7nG)kVKj5l)2)B2*#h7b=y@?P@b!k(G!DM z(Zte?-=!F)PnkNmm(FE literal 0 HcmV?d00001 diff --git a/module/__pycache__/binary_func.cpython-37.pyc b/module/__pycache__/binary_func.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04e856db0f85557c7e268f84842b53d6f8723378 GIT binary patch literal 4969 zcmd5=O>7%Q6rR~Xuh&lFwrP@<0;RN2ml6`Um=vn0KcR?A1ZpL~3R>BoZQ^8OJF{!B zqje>45g>sC;)3APB9K5r0wjbu@OMJoxy=Jt*;)C;^fYdem*ZCz-kjy3Pi&d$!x z_ukui^ZEGDkVT-V-~U>8cMBoE;YGKo&^QX!D}Z2xQJ3UGO>+4KHK$6gGX30a|AB@m1@ z)qtJ{d>3d_tDg+CS@PmcQ}<~AXai-8w3I+^(WVioz7iNMdLD2vdO-oLceH_;!Pv)0 zQ(YZ-jsz;B%PKDf>M6ovPzkKboD<{<-Ia@lYqEthS%F%ITBr@fS}uS8`K7l%y7=)| zm%skx&+lGIYeM&`Zpjz11;@|(J{PJ7BF3Gnn=d-)n9w}OJtGocrN)bn?K^c}Bs#PE zjjAK8yzAQB@oKIwOl->`S~xK5mtCI`z7-a5<k#Ooxv192J8Wshi8nxiJg&v?L)s(gIeuqr- zJyOK5!JISm)`#(bNR;)FTU{& zSX(WXeU1wdYNhCl_>=XbQ}s)ga$4s}=;oX8o)OxO!v{zNb)?}!F@il-$Nm|6dIwy4 z_#mMQSRw_#QMxv^!4B)Aqs?#}o^Fixn*oi`Gl2poI5Ln4_$bVD0~4rx3;c!{xt{;Kz@^`13`pNAeZEKF zYRC7`FMY3`ReQcyr0)j-u65kL=+r|KNc7se*9QWg-H*T#0Xls2`mnP-*taq4O<2k` zd_LU``*oiS6+Y~nb$mD8r|rxX!XGT&VRSV9uG`l?`~Mp6yKapA7R38B#QWimxUU!Q zI6NBoE#2?<0N}NC$Mbst!Oc3p`^5vK?6Hj&=aBii^6H@H_eEhB)VuK~KQ(D*p6*9(cK7&5}*R{ev+Y5V4 zPGQ8$On>ufZYpbM@(6v9G>3zGxNl#Yc0dA@UfqoCh#$}Mc*W#HAoL}UwNIJp^{UYz8WB7B}{)!-A-C`7AlOf zn1LJ<`6Y5o7~Bhnn6a$z zFP|a7P}5p{3%FhKymo<5Qr{UQVQnML;XwEGAQ24XyMY1ft3Si2SfF-2aSpcaBmlg z1rm@K$LEzMW=(>}r8gjlZY3k+U1e1}6`s=5RHpm1DwK&yLCb=c(p2bYcxA<2KgM6N zj<_YyFIHBnGq2+O3J8O&WjAbV+$lFoOQrJKV#!`xtmVsCCyuz4V&3&;pwXS8{SOq5 z3vZ*4C-F9}zm166h@y>byp6P6o>|&)XbE~u(1M^R1f3Q1NkLDhV;qmN5(1Fm+KPxf z<=TqF^S*<8_$7yXP9JaCEKlx0Ov}h-ZREmy2xr!ooyL@unOuT9evOyy*}R|UxP5XY z;UURW{feE7`A*q}*9e;DPvEV+I0bF+NARM@g21$s*dgiPwn*c=4EMbZ2qXp?oDwW# z$BIc!WskZC+6r)F6MD^FYXnA_z@FE3-`MtZ>CM8l?Q(v_v29`5cF5DAowV)MTHX!s z@NKxvoha@`aW9J9DDFqG2gL&@9z?MZ1u`1`5Q+mR@U+v%{3HiN*c{^ot>@wF0L3z~ z#H8#Byo$+@>7+0UdCxhR4fUhbq0VMH`cSA3gR2((6<5Tojf42W;fzSuxa*b*6V*Jp pTo~b%F!29`B~R!}UZ&cRFNs>GFpq?$nZX5nxOB98-w%DF{tKx=gWCWA literal 0 HcmV?d00001 diff --git a/module/__pycache__/decode_func.cpython-37.pyc b/module/__pycache__/decode_func.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29a39404f1ed090aa4fc3afc73d3f8ed0d2a2c91 GIT binary patch literal 32424 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 literal 0 HcmV?d00001 diff --git a/module/__pycache__/func_binary.cpython-37.pyc b/module/__pycache__/func_binary.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e615590c984365bd58b4dd05463fa80d5902c4a GIT binary patch literal 5379 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 literal 0 HcmV?d00001 diff --git a/module/__pycache__/func_decrypt.cpython-37.pyc b/module/__pycache__/func_decrypt.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95a8e4448246d15ab92124cb0857a6079d9c606a GIT binary patch literal 22720 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 EUrix%RR910 literal 0 HcmV?d00001 diff --git a/module/__pycache__/func_encode.cpython-37.pyc b/module/__pycache__/func_encode.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..304d71786b6fc60cea623cb4604187b51c50c171 GIT binary patch literal 26154 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 literal 0 HcmV?d00001 diff --git a/module/__pycache__/func_tools.cpython-37.pyc b/module/__pycache__/func_tools.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1ae4250f320b024d521d884c55e10138a6642c5 GIT binary patch literal 2795 zcmb_e>u(!H5Z}F*&u1r1+mHthB}G-GD>Sr8=_5o@MWgZsMM$X{$x3A$?s>AeEPA!rwDQl?xW zU{hrpaEj zP=XH{VCt+oL6(V6muZzQX#6OgYT@Z+a+%I3(yZx&JE6=nsj6e7N-G+Rtf+yuN-H`u zeJ#+dG}N=B8G|cy#yn`umq^ z%a@8T;lc8y+LiA%u0O0jxLvz>XYIiUp~%|(`r*Db-ire>hC%Lz>Gc7bB>_3#S%EMD zc$P^wxv2D#kClQpLB1p$6JaYt88|Fx1{RU@Tq--uiX!IaiahNkeW&D0sm-CW;i+_v zIa60{Oh^5soy#LakqI=7e~-GeTL z{w*DD`f&!NhUfDn*v`y2*?|!^mrl9fC@i*=H);O{#%Sw8&18L{x=vQ;9DH?zHlNF6 zg$g&=hR{66oe?o7i>@a9a^B$)&=UqI%=&Xe!+=DLJARR8pG0RX9MdLcxrquLt#0jt zQx6HD3XM~PT1p&dzhcp)zGubrRP|vcp2nLF011>8s6MC^jnNfauNlQx0)0hYg<7iD zjW*7)Pk9VTQ-y?OVQWJ7@@~fGJ5Z(r2psr4leZ1N6OYhm8CW7J1(WcWcjDo5NU#J# zBI9mv#4Uwigts21hENNhrRTSeREnnYCLCDAs3PP11b#L~D=PGvg56O%=tF-6T2&b% z=ld#p0MYhB78WABCs4!PaZ*tWJ(B=z zdkNFK39d#+;oKxCyfsN6mj>pN87u;DW3uQ~wGw4k#VYj$QMjWMJg~4!8MH-}f@Q04 zW0C|Gi{bijQs8S{>SrkxN2!LDHfg0@T8V*f>>n)r(d5~VW}SxJy;8TU;a$V-N3?K4 zTJDhk4ag`Cpj;RO+u2QIJW`{ZuwC5*B|+~U$SBCM-H2^==eQsekDdY#tj`IUveGjM z9##clH=x%fWY|=y)NzBOw4kh|hM?Gee2F8#j-Z(u%K2G@I3nA^T*$;+B$DTm)d~{!^?5sVM5RN&Y~w# z$d0$bkD#8Qu8cz%-0_O8&+(%m^pu;QOC=z;cy>g>($;RUC1kOqflp!K>_=CJfe@-u zlXd_!chGhTRwnIHy5Q8Jo$w~4U6OaneMk?`r9ICmh6bu(tv67uA2x{ItAJGa40AHo;ri7t;EU4(FT+%6EvX9OxdoYHjmWt(2C5!BW-^&gEjr1hu#(B}8x8AtGFd35-0%&@KP0>tiH+oCBu|XX6*e5l_QS7? zhdWa>+f3c;m#21I7}F`w89Em7*G`1|*kGL>4f)9t?10 t@+oL6VT3zjI3*`N?+Jb08_bubk?nkf-VTErMdv*HteKFKrbmIb`WM5orO5yQ literal 0 HcmV?d00001 diff --git a/module/__pycache__/jother.cpython-37.pyc b/module/__pycache__/jother.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3573677319ba185a380265ff7a5bc0e52795b624 GIT binary patch literal 4633 zcmb_g+j1Mn5uM&$fJ+brDM}VaNp>j47p^JEx>|{%IEwU=~rLDUja^DI|S^vga%d={yvHTSa^NbHFX4L@`KBERz(= zjwI=PBbHt1N)NRsb25)QCr6}@Ixk0M0riL+lSS0N9G4~3qjEw{qAti2atigBJSk71 zF3Pv$Y1HF#TAo2&k~8uw>Ir!cc+TtmgD_sNsVV^i|G2({au+4~HYb2yI*f&J$dRWb z9Z?q2XB3Qpy|ZU|;%NaI>WB@o?{vhzi{e2dIW;4|=WN@CkSAxvOW5t_jn+uhXqjfK zv`0oh#Xb7;N60UUKjLxV9iEL{DglS_YjtmBqy&@IozCc{Gt!xiG?S6eW~6g{l8}i% zJ8Of*%!oY-j!|DsjO~$HgQriMAhIJ5_DyD%iFPk0gQyPUYEflJ9`u{V+*`*ZMjk|! z9r^Xq7}REGG^owSc@R~$@9XC~s7=<|M$$-qtB}w}$$z0n(|x3BDaCwV^v<>Ah>BbXibf85Kwb1|~@+{+eu{<}GxDI@Z2Xngq& zW0gNKk@4lMkuI=Q9+j}$FUX(T*_6j16*0@PzA@9tY>dcv?{FLjEz(?p#d||7OnlfQ zEZ!e#Ve-0X@qw`@$azLl9ybUB!z_6lzkMB2BTTmZs;LKG(FQ>5DGS zc4?(cYhAk3rG>V;vbLhVC{%IV0XJ3+n^CM<)i_jY0YKPbp*^8$aZ5F48)3B)*F!j1 z*R<88+gowa0tbR_xNe`Vb>^Dd^IB!G!i6SE8EsnyqJ%&R4d!YE7w~ z?W-u)QEs4I)4A$;MMXLnhYw?=&Y`>Z!B`R_{Lg?9!t!Y(%TiLfLB6RyWK;Ih;SS_{CxM2PdMK#(O;Yrz52aF$NetD^6$>K7*WT-jVK-x`DQ~haDG~NCb{zQ#HqgLu1Krn7a+~6-s0V zr}k*i>Gsv*yW_Pssq;o}zl7zZVcxDC+gsaNm_O#+egRKk5A$|?xHsO5Hk1gXv!wXF z`Nk>Tfzk3XCpU&WIcmMs&Et6cHH_AVdAphM#wU%*jx%6zs$*K_97mp*Q$3q0ZZIDp zM|jVvUxD=UMdu^4`vy~H5hi~|Nm3@s(`2`1kZ?>5l6S%MBa!?XcRD29mq24sc_x2z zHhzfOO6X-l;>RML$Th6V=~3jQ&wGQ`Nw(0yotv}Fdf3*Q6!N?yY9}}*y*@? z)NwY2dS5ztd%4`cUHV#dToa{(N%U#ES6=J}o;icenI5Zp^Qm?lwWiKL3DvVooM>HK z5o!i~w6~6s48+jHxB+d%StY1wPTh7fg^w_%QRJ|s(0_yw1N0$CeB(}R=>~Tmyy*=9WRJ-HB ziXXRZpG&nlqy1+m2Q5Extp^TTZb{?fT-CI5@He0i^4blRRG)xX519O($rnt12NL9M zTs__dCh?ZNRI|_#YD9 zl6r^{75gyfaNz2ksx+V0?9~5+_B3hmE>Lr9c%Dgiwq|qw1MN`>L||G|JVD2&)6|za zcylZTll%f`R-V<$WnCzj?fU?Hv0UD6RT@^KK4T|*Z7ROa6kjrmF9F48vsz?g)`?fg zE*2jRiV@qB;t-(W%r(r0B+J#|crS^Q%h}#L zBilMl6>e#YL;+P55>JU#T7f`RyioOlkH3MpeQgZQzYrn8%${RX(+VN6r=8i4nVsM4 z&CK0feSH>z_VzEo&VOVQ@(?FGO@+Z3=)pV?Mi})-Hs&--LI6r<;ft!;rFGFw2p(-at-fgZdH#3g7KY*MCN zAz)Kw8gPy2%mA*l1T%pfED5JsA~o&hgTT2^DtSRc1AS~pr=xR04oE#6l1OdQ>tv4j z7A5!~oHY{CHQJ&p8XsXwQ}aizk!y4TK!Z^;RG1#`uaTBILt3;6AlB7L-=Iw`)FQ2g zE+uBGgJ9#)cRxJ(@n-w#mz(!5Z{Gjt&ZG zKvfu^uoy0h6nDca_oYih>pEsD9B)j@a)@vOzWvM%QVi!AK94NMBbsAV44-lv$4HW@|zZ%3d+#dtk=*0)d5) z7t6N6`*CR>66s!23OcaM2XGNzy?kRaksc+{BPn+nb_4X6Pz#>MfnFb^Q~^A?+n6O1-hNCySNS*wkNkY^Cc$_%-5sHsQb$q@LrlHdm;HJ+U$O|^1x4zd_CF^Utx zsEtLaGtx}dj^G+-n^7V%R}_9RG9q(`Fg-(XG)XEK=Sbz9IRf_t>9awY!4gmvOqTpu zZ6=x3v}%W62FWNGmDO zO+CfJAG?t4-L2ELdsylYcF}e1eo8B+q~(5zZ&Z456y;(c*uD&r{z#1sVW|v3Nzi)_ z^&npM&k7}%s}e0Vj)gl8_(*b z?nrOIge8A*xwtEHyJ}mQxm{p5!80T3$sA}qpTNerLzVGtDtzv>fAw4$LzW2$5C8$-!D7P$_!rJY-6V`vm z%rUKcQ1cgH?Id&w`0W38=ETmK4aKsy>4dFwbb$8(5k^qrq059`4Bgd0Rt`JeTQX=M zs3$QCgS$c13;A=XtmnP*Qa%eeg=@!UDcPBg^|&W2tSRx!e+dyGECS`xr2SAL`{^E8 zU`%>Y8H81f4!}-K2PGer^Ozo`jln0s&~7EdDAl3MN`&7Mtfd=JT|yeEO#XFTRWYMw zKyCdA4JvyE1mjE4dM+U@mRRRv$7G!}&?oLn8)%RK#>W0$WZa##6T);HKfmfaj<6gj z{`kQ-?KqWc-ivqm0X%*P$p{ksMcH+Y(m2}Xm={>&1Du(vnKpHESgzV>Va(?Pcl<=m z-#iub6Js6zM$Ati7ur&|>WO5zK8^~f$3(iyJ+C-FTFyh*3nQKh!>zf6>>2]>>>24-o%4*8&255;e[i+o>>>2]|=s<<24-(i+o)%4*8}else for(o=0;o>>2]=r[o>>>2];return this.sigBytes+=n,this},clamp:function(){var t=this.words,e=this.sigBytes;t[e>>>2]&=4294967295<<32-e%4*8,t.length=l.ceil(e/4)},clone:function(){var t=s.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r>>2]>>>24-n%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>3]|=parseInt(t.substr(i,2),16)<<24-i%8*4;return new f.init(r,e/2)}},h=c.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>24-n%4*8&255;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;return new f.init(r,e)}},d=c.Utf8={stringify:function(t){try{return decodeURIComponent(escape(h.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return h.parse(unescape(encodeURIComponent(t)))}},u=o.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new f.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=d.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var e,r=this._data,i=r.words,n=r.sigBytes,o=this.blockSize,s=n/(4*o),c=(s=t?l.ceil(s):l.max((0|s)-this._minBufferSize,0))*o,a=l.min(4*c,n);if(c){for(var h=0;h>>32-e}function Dt(t,e,r,i){var n,o=this._iv;o?(n=o.slice(0),this._iv=void 0):n=this._prevBlock,i.encryptBlock(n,0);for(var s=0;s>24&255)){var e=t>>16&255,r=t>>8&255,i=255&t;255===e?(e=0,255===r?(r=0,255===i?i=0:++i):++r):++e,t=0,t+=e<<16,t+=r<<8,t+=i}else t+=1<<24;return t}function Rt(){for(var t=this._X,e=this._C,r=0;r<8;r++)ft[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16,s=((n*n>>>17)+n*o>>>15)+o*o,c=((4294901760&i)*i|0)+((65535&i)*i|0);dt[r]=s^c}t[0]=dt[0]+(dt[7]<<16|dt[7]>>>16)+(dt[6]<<16|dt[6]>>>16)|0,t[1]=dt[1]+(dt[0]<<8|dt[0]>>>24)+dt[7]|0,t[2]=dt[2]+(dt[1]<<16|dt[1]>>>16)+(dt[0]<<16|dt[0]>>>16)|0,t[3]=dt[3]+(dt[2]<<8|dt[2]>>>24)+dt[1]|0,t[4]=dt[4]+(dt[3]<<16|dt[3]>>>16)+(dt[2]<<16|dt[2]>>>16)|0,t[5]=dt[5]+(dt[4]<<8|dt[4]>>>24)+dt[3]|0,t[6]=dt[6]+(dt[5]<<16|dt[5]>>>16)+(dt[4]<<16|dt[4]>>>16)|0,t[7]=dt[7]+(dt[6]<<8|dt[6]>>>24)+dt[5]|0}function Mt(){for(var t=this._X,e=this._C,r=0;r<8;r++)wt[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16,s=((n*n>>>17)+n*o>>>15)+o*o,c=((4294901760&i)*i|0)+((65535&i)*i|0);kt[r]=s^c}t[0]=kt[0]+(kt[7]<<16|kt[7]>>>16)+(kt[6]<<16|kt[6]>>>16)|0,t[1]=kt[1]+(kt[0]<<8|kt[0]>>>24)+kt[7]|0,t[2]=kt[2]+(kt[1]<<16|kt[1]>>>16)+(kt[0]<<16|kt[0]>>>16)|0,t[3]=kt[3]+(kt[2]<<8|kt[2]>>>24)+kt[1]|0,t[4]=kt[4]+(kt[3]<<16|kt[3]>>>16)+(kt[2]<<16|kt[2]>>>16)|0,t[5]=kt[5]+(kt[4]<<8|kt[4]>>>24)+kt[3]|0,t[6]=kt[6]+(kt[5]<<16|kt[5]>>>16)+(kt[4]<<16|kt[4]>>>16)|0,t[7]=kt[7]+(kt[6]<<8|kt[6]>>>24)+kt[5]|0}return h=bt.lib.WordArray,bt.enc.Base64={stringify:function(t){var e=t.words,r=t.sigBytes,i=this._map;t.clamp();for(var n=[],o=0;o>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,c=0;c<4&&o+.75*c>>6*(3-c)&63));var a=i.charAt(64);if(a)for(;n.length%4;)n.push(a);return n.join("")},parse:function(t){var e=t.length,r=this._map,i=this._reverseMap;if(!i){i=this._reverseMap=[];for(var n=0;n>>6-o%4*2,a=s|c;i[n>>>2]|=a<<24-n%4*8,n++}return h.create(i,n)}(t,e,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},function(l){var t=bt,e=t.lib,r=e.WordArray,i=e.Hasher,n=t.algo,H=[];!function(){for(var t=0;t<64;t++)H[t]=4294967296*l.abs(l.sin(t+1))|0}();var o=n.MD5=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o=this._hash.words,s=t[e+0],c=t[e+1],a=t[e+2],h=t[e+3],l=t[e+4],f=t[e+5],d=t[e+6],u=t[e+7],p=t[e+8],_=t[e+9],v=t[e+10],y=t[e+11],g=t[e+12],B=t[e+13],w=t[e+14],k=t[e+15],S=o[0],m=o[1],x=o[2],b=o[3];S=z(S,m,x,b,s,7,H[0]),b=z(b,S,m,x,c,12,H[1]),x=z(x,b,S,m,a,17,H[2]),m=z(m,x,b,S,h,22,H[3]),S=z(S,m,x,b,l,7,H[4]),b=z(b,S,m,x,f,12,H[5]),x=z(x,b,S,m,d,17,H[6]),m=z(m,x,b,S,u,22,H[7]),S=z(S,m,x,b,p,7,H[8]),b=z(b,S,m,x,_,12,H[9]),x=z(x,b,S,m,v,17,H[10]),m=z(m,x,b,S,y,22,H[11]),S=z(S,m,x,b,g,7,H[12]),b=z(b,S,m,x,B,12,H[13]),x=z(x,b,S,m,w,17,H[14]),S=A(S,m=z(m,x,b,S,k,22,H[15]),x,b,c,5,H[16]),b=A(b,S,m,x,d,9,H[17]),x=A(x,b,S,m,y,14,H[18]),m=A(m,x,b,S,s,20,H[19]),S=A(S,m,x,b,f,5,H[20]),b=A(b,S,m,x,v,9,H[21]),x=A(x,b,S,m,k,14,H[22]),m=A(m,x,b,S,l,20,H[23]),S=A(S,m,x,b,_,5,H[24]),b=A(b,S,m,x,w,9,H[25]),x=A(x,b,S,m,h,14,H[26]),m=A(m,x,b,S,p,20,H[27]),S=A(S,m,x,b,B,5,H[28]),b=A(b,S,m,x,a,9,H[29]),x=A(x,b,S,m,u,14,H[30]),S=C(S,m=A(m,x,b,S,g,20,H[31]),x,b,f,4,H[32]),b=C(b,S,m,x,p,11,H[33]),x=C(x,b,S,m,y,16,H[34]),m=C(m,x,b,S,w,23,H[35]),S=C(S,m,x,b,c,4,H[36]),b=C(b,S,m,x,l,11,H[37]),x=C(x,b,S,m,u,16,H[38]),m=C(m,x,b,S,v,23,H[39]),S=C(S,m,x,b,B,4,H[40]),b=C(b,S,m,x,s,11,H[41]),x=C(x,b,S,m,h,16,H[42]),m=C(m,x,b,S,d,23,H[43]),S=C(S,m,x,b,_,4,H[44]),b=C(b,S,m,x,g,11,H[45]),x=C(x,b,S,m,k,16,H[46]),S=D(S,m=C(m,x,b,S,a,23,H[47]),x,b,s,6,H[48]),b=D(b,S,m,x,u,10,H[49]),x=D(x,b,S,m,w,15,H[50]),m=D(m,x,b,S,f,21,H[51]),S=D(S,m,x,b,g,6,H[52]),b=D(b,S,m,x,h,10,H[53]),x=D(x,b,S,m,v,15,H[54]),m=D(m,x,b,S,c,21,H[55]),S=D(S,m,x,b,p,6,H[56]),b=D(b,S,m,x,k,10,H[57]),x=D(x,b,S,m,d,15,H[58]),m=D(m,x,b,S,B,21,H[59]),S=D(S,m,x,b,l,6,H[60]),b=D(b,S,m,x,y,10,H[61]),x=D(x,b,S,m,a,15,H[62]),m=D(m,x,b,S,_,21,H[63]),o[0]=o[0]+S|0,o[1]=o[1]+m|0,o[2]=o[2]+x|0,o[3]=o[3]+b|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32;var n=l.floor(r/4294967296),o=r;e[15+(64+i>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),e[14+(64+i>>>9<<4)]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),t.sigBytes=4*(e.length+1),this._process();for(var s=this._hash,c=s.words,a=0;a<4;a++){var h=c[a];c[a]=16711935&(h<<8|h>>>24)|4278255360&(h<<24|h>>>8)}return s},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function z(t,e,r,i,n,o,s){var c=t+(e&r|~e&i)+n+s;return(c<>>32-o)+e}function A(t,e,r,i,n,o,s){var c=t+(e&i|r&~i)+n+s;return(c<>>32-o)+e}function C(t,e,r,i,n,o,s){var c=t+(e^r^i)+n+s;return(c<>>32-o)+e}function D(t,e,r,i,n,o,s){var c=t+(r^(e|~i))+n+s;return(c<>>32-o)+e}t.MD5=i._createHelper(o),t.HmacMD5=i._createHmacHelper(o)}(Math),e=(t=bt).lib,r=e.WordArray,i=e.Hasher,n=t.algo,f=[],o=n.SHA1=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=0;a<80;a++){if(a<16)f[a]=0|t[e+a];else{var h=f[a-3]^f[a-8]^f[a-14]^f[a-16];f[a]=h<<1|h>>>31}var l=(i<<5|i>>>27)+c+f[a];l+=a<20?1518500249+(n&o|~n&s):a<40?1859775393+(n^o^s):a<60?(n&o|n&s|o&s)-1894007588:(n^o^s)-899497514,c=s,s=o,o=n<<30|n>>>2,n=i,i=l}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=Math.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}}),t.SHA1=i._createHelper(o),t.HmacSHA1=i._createHmacHelper(o),function(n){var t=bt,e=t.lib,r=e.WordArray,i=e.Hasher,o=t.algo,s=[],B=[];!function(){function t(t){for(var e=n.sqrt(t),r=2;r<=e;r++)if(!(t%r))return;return 1}function e(t){return 4294967296*(t-(0|t))|0}for(var r=2,i=0;i<64;)t(r)&&(i<8&&(s[i]=e(n.pow(r,.5))),B[i]=e(n.pow(r,1/3)),i++),r++}();var w=[],c=o.SHA256=i.extend({_doReset:function(){this._hash=new r.init(s.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=0;f<64;f++){if(f<16)w[f]=0|t[e+f];else{var d=w[f-15],u=(d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3,p=w[f-2],_=(p<<15|p>>>17)^(p<<13|p>>>19)^p>>>10;w[f]=u+w[f-7]+_+w[f-16]}var v=i&n^i&o^n&o,y=(i<<30|i>>>2)^(i<<19|i>>>13)^(i<<10|i>>>22),g=l+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&a^~c&h)+B[f]+w[f];l=h,h=a,a=c,c=s+g|0,s=o,o=n,n=i,i=g+(y+v)|0}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0,r[5]=r[5]+a|0,r[6]=r[6]+h|0,r[7]=r[7]+l|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=n.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA256=i._createHelper(c),t.HmacSHA256=i._createHmacHelper(c)}(Math),function(){var n=bt.lib.WordArray,t=bt.enc;t.Utf16=t.Utf16BE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=t.charCodeAt(i)<<16-i%2*16;return n.create(r,2*e)}};function s(t){return t<<8&4278255360|t>>>8&16711935}t.Utf16LE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535);i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=s(t.charCodeAt(i)<<16-i%2*16);return n.create(r,2*e)}}}(),function(){if("function"==typeof ArrayBuffer){var t=bt.lib.WordArray,n=t.init;(t.init=function(t){if(t instanceof ArrayBuffer&&(t=new Uint8Array(t)),(t instanceof Int8Array||"undefined"!=typeof Uint8ClampedArray&&t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)&&(t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),t instanceof Uint8Array){for(var e=t.byteLength,r=[],i=0;i>>2]|=t[i]<<24-i%4*8;n.call(this,r,e)}else n.apply(this,arguments)}).prototype=t}}(),Math,c=(s=bt).lib,a=c.WordArray,l=c.Hasher,d=s.algo,m=a.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),x=a.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),b=a.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),H=a.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),z=a.create([0,1518500249,1859775393,2400959708,2840853838]),A=a.create([1352829926,1548603684,1836072691,2053994217,0]),u=d.RIPEMD160=l.extend({_doReset:function(){this._hash=a.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o,s,c,a,h,l,f,d,u,p,_,v=this._hash.words,y=z.words,g=A.words,B=m.words,w=x.words,k=b.words,S=H.words;l=o=v[0],f=s=v[1],d=c=v[2],u=a=v[3],p=h=v[4];for(r=0;r<80;r+=1)_=o+t[e+B[r]]|0,_+=r<16?mt(s,c,a)+y[0]:r<32?xt(s,c,a)+y[1]:r<48?Ht(s,c,a)+y[2]:r<64?zt(s,c,a)+y[3]:At(s,c,a)+y[4],_=(_=Ct(_|=0,k[r]))+h|0,o=h,h=a,a=Ct(c,10),c=s,s=_,_=l+t[e+w[r]]|0,_+=r<16?At(f,d,u)+g[0]:r<32?zt(f,d,u)+g[1]:r<48?Ht(f,d,u)+g[2]:r<64?xt(f,d,u)+g[3]:mt(f,d,u)+g[4],_=(_=Ct(_|=0,S[r]))+p|0,l=p,p=u,u=Ct(d,10),d=f,f=_;_=v[1]+c+u|0,v[1]=v[2]+a+p|0,v[2]=v[3]+h+l|0,v[3]=v[4]+o+f|0,v[4]=v[0]+s+d|0,v[0]=_},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var n=this._hash,o=n.words,s=0;s<5;s++){var c=o[s];o[s]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}return n},clone:function(){var t=l.clone.call(this);return t._hash=this._hash.clone(),t}}),s.RIPEMD160=l._createHelper(u),s.HmacRIPEMD160=l._createHmacHelper(u),p=bt.lib.Base,_=bt.enc.Utf8,bt.algo.HMAC=p.extend({init:function(t,e){t=this._hasher=new t.init,"string"==typeof e&&(e=_.parse(e));var r=t.blockSize,i=4*r;e.sigBytes>i&&(e=t.finalize(e)),e.clamp();for(var n=this._oKey=e.clone(),o=this._iKey=e.clone(),s=n.words,c=o.words,a=0;a>>24)|4278255360&(o<<24|o>>>8),s=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),(x=r[n]).high^=s,x.low^=o}for(var c=0;c<24;c++){for(var a=0;a<5;a++){for(var h=0,l=0,f=0;f<5;f++){h^=(x=r[a+5*f]).high,l^=x.low}var d=R[a];d.high=h,d.low=l}for(a=0;a<5;a++){var u=R[(a+4)%5],p=R[(a+1)%5],_=p.high,v=p.low;for(h=u.high^(_<<1|v>>>31),l=u.low^(v<<1|_>>>31),f=0;f<5;f++){(x=r[a+5*f]).high^=h,x.low^=l}}for(var y=1;y<25;y++){var g=(x=r[y]).high,B=x.low,w=C[y];l=w<32?(h=g<>>32-w,B<>>32-w):(h=B<>>64-w,g<>>64-w);var k=R[D[y]];k.high=h,k.low=l}var S=R[0],m=r[0];S.high=m.high,S.low=m.low;for(a=0;a<5;a++)for(f=0;f<5;f++){var x=r[y=a+5*f],b=R[y],H=R[(a+1)%5+5*f],z=R[(a+2)%5+5*f];x.high=b.high^~H.high&z.high,x.low=b.low^~H.low&z.low}x=r[0];var A=E[c];x.high^=A.high,x.low^=A.low}},_doFinalize:function(){var t=this._data,e=t.words,r=(this._nDataBytes,8*t.sigBytes),i=32*this.blockSize;e[r>>>5]|=1<<24-r%32,e[(d.ceil((1+r)/i)*i>>>5)-1]|=128,t.sigBytes=4*e.length,this._process();for(var n=this._state,o=this.cfg.outputLength/8,s=o/8,c=[],a=0;a>>24)|4278255360&(l<<24|l>>>8),f=16711935&(f<<8|f>>>24)|4278255360&(f<<24|f>>>8),c.push(f),c.push(l)}return new u.init(c,o)},clone:function(){for(var t=i.clone.call(this),e=t._state=this._state.slice(0),r=0;r<25;r++)e[r]=e[r].clone();return t}});t.SHA3=i._createHelper(n),t.HmacSHA3=i._createHmacHelper(n)}(Math),function(){var t=bt,e=t.lib.Hasher,r=t.x64,i=r.Word,n=r.WordArray,o=t.algo;function s(){return i.create.apply(i,arguments)}var mt=[s(1116352408,3609767458),s(1899447441,602891725),s(3049323471,3964484399),s(3921009573,2173295548),s(961987163,4081628472),s(1508970993,3053834265),s(2453635748,2937671579),s(2870763221,3664609560),s(3624381080,2734883394),s(310598401,1164996542),s(607225278,1323610764),s(1426881987,3590304994),s(1925078388,4068182383),s(2162078206,991336113),s(2614888103,633803317),s(3248222580,3479774868),s(3835390401,2666613458),s(4022224774,944711139),s(264347078,2341262773),s(604807628,2007800933),s(770255983,1495990901),s(1249150122,1856431235),s(1555081692,3175218132),s(1996064986,2198950837),s(2554220882,3999719339),s(2821834349,766784016),s(2952996808,2566594879),s(3210313671,3203337956),s(3336571891,1034457026),s(3584528711,2466948901),s(113926993,3758326383),s(338241895,168717936),s(666307205,1188179964),s(773529912,1546045734),s(1294757372,1522805485),s(1396182291,2643833823),s(1695183700,2343527390),s(1986661051,1014477480),s(2177026350,1206759142),s(2456956037,344077627),s(2730485921,1290863460),s(2820302411,3158454273),s(3259730800,3505952657),s(3345764771,106217008),s(3516065817,3606008344),s(3600352804,1432725776),s(4094571909,1467031594),s(275423344,851169720),s(430227734,3100823752),s(506948616,1363258195),s(659060556,3750685593),s(883997877,3785050280),s(958139571,3318307427),s(1322822218,3812723403),s(1537002063,2003034995),s(1747873779,3602036899),s(1955562222,1575990012),s(2024104815,1125592928),s(2227730452,2716904306),s(2361852424,442776044),s(2428436474,593698344),s(2756734187,3733110249),s(3204031479,2999351573),s(3329325298,3815920427),s(3391569614,3928383900),s(3515267271,566280711),s(3940187606,3454069534),s(4118630271,4000239992),s(116418474,1914138554),s(174292421,2731055270),s(289380356,3203993006),s(460393269,320620315),s(685471733,587496836),s(852142971,1086792851),s(1017036298,365543100),s(1126000580,2618297676),s(1288033470,3409855158),s(1501505948,4234509866),s(1607167915,987167468),s(1816402316,1246189591)],xt=[];!function(){for(var t=0;t<80;t++)xt[t]=s()}();var c=o.SHA512=e.extend({_doReset:function(){this._hash=new n.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=i.high,d=i.low,u=n.high,p=n.low,_=o.high,v=o.low,y=s.high,g=s.low,B=c.high,w=c.low,k=a.high,S=a.low,m=h.high,x=h.low,b=l.high,H=l.low,z=f,A=d,C=u,D=p,E=_,R=v,M=y,F=g,P=B,W=w,O=k,I=S,U=m,K=x,X=b,L=H,j=0;j<80;j++){var N,T,q=xt[j];if(j<16)T=q.high=0|t[e+2*j],N=q.low=0|t[e+2*j+1];else{var Z=xt[j-15],V=Z.high,G=Z.low,J=(V>>>1|G<<31)^(V>>>8|G<<24)^V>>>7,$=(G>>>1|V<<31)^(G>>>8|V<<24)^(G>>>7|V<<25),Q=xt[j-2],Y=Q.high,tt=Q.low,et=(Y>>>19|tt<<13)^(Y<<3|tt>>>29)^Y>>>6,rt=(tt>>>19|Y<<13)^(tt<<3|Y>>>29)^(tt>>>6|Y<<26),it=xt[j-7],nt=it.high,ot=it.low,st=xt[j-16],ct=st.high,at=st.low;T=(T=(T=J+nt+((N=$+ot)>>>0<$>>>0?1:0))+et+((N+=rt)>>>0>>0?1:0))+ct+((N+=at)>>>0>>0?1:0),q.high=T,q.low=N}var ht,lt=P&O^~P&U,ft=W&I^~W&K,dt=z&C^z&E^C&E,ut=A&D^A&R^D&R,pt=(z>>>28|A<<4)^(z<<30|A>>>2)^(z<<25|A>>>7),_t=(A>>>28|z<<4)^(A<<30|z>>>2)^(A<<25|z>>>7),vt=(P>>>14|W<<18)^(P>>>18|W<<14)^(P<<23|W>>>9),yt=(W>>>14|P<<18)^(W>>>18|P<<14)^(W<<23|P>>>9),gt=mt[j],Bt=gt.high,wt=gt.low,kt=X+vt+((ht=L+yt)>>>0>>0?1:0),St=_t+ut;X=U,L=K,U=O,K=I,O=P,I=W,P=M+(kt=(kt=(kt=kt+lt+((ht=ht+ft)>>>0>>0?1:0))+Bt+((ht=ht+wt)>>>0>>0?1:0))+T+((ht=ht+N)>>>0>>0?1:0))+((W=F+ht|0)>>>0>>0?1:0)|0,M=E,F=R,E=C,R=D,C=z,D=A,z=kt+(pt+dt+(St>>>0<_t>>>0?1:0))+((A=ht+St|0)>>>0>>0?1:0)|0}d=i.low=d+A,i.high=f+z+(d>>>0>>0?1:0),p=n.low=p+D,n.high=u+C+(p>>>0>>0?1:0),v=o.low=v+R,o.high=_+E+(v>>>0>>0?1:0),g=s.low=g+F,s.high=y+M+(g>>>0>>0?1:0),w=c.low=w+W,c.high=B+P+(w>>>0>>0?1:0),S=a.low=S+I,a.high=k+O+(S>>>0>>0?1:0),x=h.low=x+K,h.high=m+U+(x>>>0>>0?1:0),H=l.low=H+L,l.high=b+X+(H>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[30+(128+i>>>10<<5)]=Math.floor(r/4294967296),e[31+(128+i>>>10<<5)]=r,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32});t.SHA512=e._createHelper(c),t.HmacSHA512=e._createHmacHelper(c)}(),Z=(q=bt).x64,V=Z.Word,G=Z.WordArray,J=q.algo,$=J.SHA512,Q=J.SHA384=$.extend({_doReset:function(){this._hash=new G.init([new V.init(3418070365,3238371032),new V.init(1654270250,914150663),new V.init(2438529370,812702999),new V.init(355462360,4144912697),new V.init(1731405415,4290775857),new V.init(2394180231,1750603025),new V.init(3675008525,1694076839),new V.init(1203062813,3204075428)])},_doFinalize:function(){var t=$._doFinalize.call(this);return t.sigBytes-=16,t}}),q.SHA384=$._createHelper(Q),q.HmacSHA384=$._createHmacHelper(Q),bt.lib.Cipher||function(){var t=bt,e=t.lib,r=e.Base,a=e.WordArray,i=e.BufferedBlockAlgorithm,n=t.enc,o=(n.Utf8,n.Base64),s=t.algo.EvpKDF,c=e.Cipher=i.extend({cfg:r.extend(),createEncryptor:function(t,e){return this.create(this._ENC_XFORM_MODE,t,e)},createDecryptor:function(t,e){return this.create(this._DEC_XFORM_MODE,t,e)},init:function(t,e,r){this.cfg=this.cfg.extend(r),this._xformMode=t,this._key=e,this.reset()},reset:function(){i.reset.call(this),this._doReset()},process:function(t){return this._append(t),this._process()},finalize:function(t){return t&&this._append(t),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(i){return{encrypt:function(t,e,r){return h(e).encrypt(i,t,e,r)},decrypt:function(t,e,r){return h(e).decrypt(i,t,e,r)}}}});function h(t){return"string"==typeof t?w:g}e.StreamCipher=c.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var l,f=t.mode={},d=e.BlockCipherMode=r.extend({createEncryptor:function(t,e){return this.Encryptor.create(t,e)},createDecryptor:function(t,e){return this.Decryptor.create(t,e)},init:function(t,e){this._cipher=t,this._iv=e}}),u=f.CBC=((l=d.extend()).Encryptor=l.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;p.call(this,t,e,i),r.encryptBlock(t,e),this._prevBlock=t.slice(e,e+i)}}),l.Decryptor=l.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);r.decryptBlock(t,e),p.call(this,t,e,i),this._prevBlock=n}}),l);function p(t,e,r){var i,n=this._iv;n?(i=n,this._iv=void 0):i=this._prevBlock;for(var o=0;o>>2];t.sigBytes-=e}},v=(e.BlockCipher=c.extend({cfg:c.cfg.extend({mode:u,padding:_}),reset:function(){var t;c.reset.call(this);var e=this.cfg,r=e.iv,i=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=i.createEncryptor:(t=i.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(i,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),e.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),y=(t.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,r=t.salt;return(r?a.create([1398893684,1701076831]).concat(r).concat(e):e).toString(o)},parse:function(t){var e,r=o.parse(t),i=r.words;return 1398893684==i[0]&&1701076831==i[1]&&(e=a.create(i.slice(2,4)),i.splice(0,4),r.sigBytes-=16),v.create({ciphertext:r,salt:e})}},g=e.SerializableCipher=r.extend({cfg:r.extend({format:y}),encrypt:function(t,e,r,i){i=this.cfg.extend(i);var n=t.createEncryptor(r,i),o=n.finalize(e),s=n.cfg;return v.create({ciphertext:o,key:r,iv:s.iv,algorithm:t,mode:s.mode,padding:s.padding,blockSize:t.blockSize,formatter:i.format})},decrypt:function(t,e,r,i){return i=this.cfg.extend(i),e=this._parse(e,i.format),t.createDecryptor(r,i).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),B=(t.kdf={}).OpenSSL={execute:function(t,e,r,i){i=i||a.random(8);var n=s.create({keySize:e+r}).compute(t,i),o=a.create(n.words.slice(e),4*r);return n.sigBytes=4*e,v.create({key:n,iv:o,salt:i})}},w=e.PasswordBasedCipher=g.extend({cfg:g.cfg.extend({kdf:B}),encrypt:function(t,e,r,i){var n=(i=this.cfg.extend(i)).kdf.execute(r,t.keySize,t.ivSize);i.iv=n.iv;var o=g.encrypt.call(this,t,e,n.key,i);return o.mixIn(n),o},decrypt:function(t,e,r,i){i=this.cfg.extend(i),e=this._parse(e,i.format);var n=i.kdf.execute(r,t.keySize,t.ivSize,e.salt);return i.iv=n.iv,g.decrypt.call(this,t,e,n.key,i)}})}(),bt.mode.CFB=((Y=bt.lib.BlockCipherMode.extend()).Encryptor=Y.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;Dt.call(this,t,e,i,r),this._prevBlock=t.slice(e,e+i)}}),Y.Decryptor=Y.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);Dt.call(this,t,e,i,r),this._prevBlock=n}}),Y),bt.mode.ECB=((tt=bt.lib.BlockCipherMode.extend()).Encryptor=tt.extend({processBlock:function(t,e){this._cipher.encryptBlock(t,e)}}),tt.Decryptor=tt.extend({processBlock:function(t,e){this._cipher.decryptBlock(t,e)}}),tt),bt.pad.AnsiX923={pad:function(t,e){var r=t.sigBytes,i=4*e,n=i-r%i,o=r+n-1;t.clamp(),t.words[o>>>2]|=n<<24-o%4*8,t.sigBytes+=n},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},bt.pad.Iso10126={pad:function(t,e){var r=4*e,i=r-t.sigBytes%r;t.concat(bt.lib.WordArray.random(i-1)).concat(bt.lib.WordArray.create([i<<24],1))},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},bt.pad.Iso97971={pad:function(t,e){t.concat(bt.lib.WordArray.create([2147483648],1)),bt.pad.ZeroPadding.pad(t,e)},unpad:function(t){bt.pad.ZeroPadding.unpad(t),t.sigBytes--}},bt.mode.OFB=(et=bt.lib.BlockCipherMode.extend(),rt=et.Encryptor=et.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._keystream;n&&(o=this._keystream=n.slice(0),this._iv=void 0),r.encryptBlock(o,0);for(var s=0;s>>8^255&n^99,h[r]=n;var o=t[l[n]=r],s=t[o],c=t[s],a=257*t[n]^16843008*n;f[r]=a<<24|a>>>8,d[r]=a<<16|a>>>16,u[r]=a<<8|a>>>24,p[r]=a;a=16843009*c^65537*s^257*o^16843008*r;_[n]=a<<24|a>>>8,v[n]=a<<16|a>>>16,y[n]=a<<8|a>>>24,g[n]=a,r?(r=o^t[t[t[c^o]]],i^=t[t[i]]):r=i=1}}();var B=[0,1,2,4,8,16,32,64,128,27,54],i=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*(1+(this._nRounds=6+r)),n=this._keySchedule=[],o=0;o>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a]):(a=h[(a=a<<8|a>>>24)>>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a],a^=B[o/r|0]<<24),n[o]=n[o-r]^a);for(var s=this._invKeySchedule=[],c=0;c>>24]]^v[h[a>>>16&255]]^y[h[a>>>8&255]]^g[h[255&a]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,f,d,u,p,h)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,_,v,y,g,l);r=t[e+1];t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,i,n,o,s,c){for(var a=this._nRounds,h=t[e]^r[0],l=t[e+1]^r[1],f=t[e+2]^r[2],d=t[e+3]^r[3],u=4,p=1;p>>24]^n[l>>>16&255]^o[f>>>8&255]^s[255&d]^r[u++],v=i[l>>>24]^n[f>>>16&255]^o[d>>>8&255]^s[255&h]^r[u++],y=i[f>>>24]^n[d>>>16&255]^o[h>>>8&255]^s[255&l]^r[u++],g=i[d>>>24]^n[h>>>16&255]^o[l>>>8&255]^s[255&f]^r[u++];h=_,l=v,f=y,d=g}_=(c[h>>>24]<<24|c[l>>>16&255]<<16|c[f>>>8&255]<<8|c[255&d])^r[u++],v=(c[l>>>24]<<24|c[f>>>16&255]<<16|c[d>>>8&255]<<8|c[255&h])^r[u++],y=(c[f>>>24]<<24|c[d>>>16&255]<<16|c[h>>>8&255]<<8|c[255&l])^r[u++],g=(c[d>>>24]<<24|c[h>>>16&255]<<16|c[l>>>8&255]<<8|c[255&f])^r[u++];t[e]=_,t[e+1]=v,t[e+2]=y,t[e+3]=g},keySize:8});t.AES=e._createHelper(i)}(),function(){var t=bt,e=t.lib,n=e.WordArray,r=e.BlockCipher,i=t.algo,h=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],l=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],f=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],d=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],u=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],o=i.DES=r.extend({_doReset:function(){for(var t=this._key.words,e=[],r=0;r<56;r++){var i=h[r]-1;e[r]=t[i>>>5]>>>31-i%32&1}for(var n=this._subKeys=[],o=0;o<16;o++){var s=n[o]=[],c=f[o];for(r=0;r<24;r++)s[r/6|0]|=e[(l[r]-1+c)%28]<<31-r%6,s[4+(r/6|0)]|=e[28+(l[r+24]-1+c)%28]<<31-r%6;s[0]=s[0]<<1|s[0]>>>31;for(r=1;r<7;r++)s[r]=s[r]>>>4*(r-1)+3;s[7]=s[7]<<5|s[7]>>>27}var a=this._invSubKeys=[];for(r=0;r<16;r++)a[r]=n[15-r]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(t,e,r){this._lBlock=t[e],this._rBlock=t[e+1],p.call(this,4,252645135),p.call(this,16,65535),_.call(this,2,858993459),_.call(this,8,16711935),p.call(this,1,1431655765);for(var i=0;i<16;i++){for(var n=r[i],o=this._lBlock,s=this._rBlock,c=0,a=0;a<8;a++)c|=d[a][((s^n[a])&u[a])>>>0];this._lBlock=s,this._rBlock=o^c}var h=this._lBlock;this._lBlock=this._rBlock,this._rBlock=h,p.call(this,1,1431655765),_.call(this,8,16711935),_.call(this,2,858993459),p.call(this,16,65535),p.call(this,4,252645135),t[e]=this._lBlock,t[e+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function p(t,e){var r=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=r,this._lBlock^=r<>>t^this._lBlock)&e;this._lBlock^=r,this._rBlock^=r<192.");var e=t.slice(0,2),r=t.length<4?t.slice(0,2):t.slice(2,4),i=t.length<6?t.slice(0,2):t.slice(4,6);this._des1=o.createEncryptor(n.create(e)),this._des2=o.createEncryptor(n.create(r)),this._des3=o.createEncryptor(n.create(i))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2});t.TripleDES=r._createHelper(s)}(),function(){var t=bt,e=t.lib.StreamCipher,r=t.algo,i=r.RC4=e.extend({_doReset:function(){for(var t=this._key,e=t.words,r=t.sigBytes,i=this._S=[],n=0;n<256;n++)i[n]=n;n=0;for(var o=0;n<256;n++){var s=n%r,c=e[s>>>2]>>>24-s%4*8&255;o=(o+i[n]+c)%256;var a=i[n];i[n]=i[o],i[o]=a}this._i=this._j=0},_doProcessBlock:function(t,e){t[e]^=n.call(this)},keySize:8,ivSize:0});function n(){for(var t=this._S,e=this._i,r=this._j,i=0,n=0;n<4;n++){r=(r+t[e=(e+1)%256])%256;var o=t[e];t[e]=t[r],t[r]=o,i|=t[(t[e]+t[r])%256]<<24-8*n}return this._i=e,this._j=r,i}t.RC4=e._createHelper(i);var o=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var t=this.cfg.drop;0>>24)|4278255360&(t[r]<<24|t[r]>>>8);var i=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],n=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]];for(r=this._b=0;r<4;r++)Rt.call(this);for(r=0;r<8;r++)n[r]^=i[r+4&7];if(e){var o=e.words,s=o[0],c=o[1],a=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),h=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),l=a>>>16|4294901760&h,f=h<<16|65535&a;n[0]^=a,n[1]^=l,n[2]^=h,n[3]^=f,n[4]^=a,n[5]^=l,n[6]^=h,n[7]^=f;for(r=0;r<4;r++)Rt.call(this)}},_doProcessBlock:function(t,e){var r=this._X;Rt.call(this),lt[0]=r[0]^r[5]>>>16^r[3]<<16,lt[1]=r[2]^r[7]>>>16^r[5]<<16,lt[2]=r[4]^r[1]>>>16^r[7]<<16,lt[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)lt[i]=16711935&(lt[i]<<8|lt[i]>>>24)|4278255360&(lt[i]<<24|lt[i]>>>8),t[e+i]^=lt[i]},blockSize:4,ivSize:2}),ct.Rabbit=at._createHelper(ut),bt.mode.CTR=(pt=bt.lib.BlockCipherMode.extend(),_t=pt.Encryptor=pt.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._counter;n&&(o=this._counter=n.slice(0),this._iv=void 0);var s=o.slice(0);r.encryptBlock(s,0),o[i-1]=o[i-1]+1|0;for(var c=0;c>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],i=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],n=this._b=0;n<4;n++)Mt.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(e){var o=e.words,s=o[0],c=o[1],a=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),h=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),l=a>>>16|4294901760&h,f=h<<16|65535&a;i[0]^=a,i[1]^=l,i[2]^=h,i[3]^=f,i[4]^=a,i[5]^=l,i[6]^=h,i[7]^=f;for(n=0;n<4;n++)Mt.call(this)}},_doProcessBlock:function(t,e){var r=this._X;Mt.call(this),Bt[0]=r[0]^r[5]>>>16^r[3]<<16,Bt[1]=r[2]^r[7]>>>16^r[5]<<16,Bt[2]=r[4]^r[1]>>>16^r[7]<<16,Bt[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)Bt[i]=16711935&(Bt[i]<<8|Bt[i]>>>24)|4278255360&(Bt[i]<<24|Bt[i]>>>8),t[e+i]^=Bt[i]},blockSize:4,ivSize:2}),vt.RabbitLegacy=yt._createHelper(St),bt.pad.ZeroPadding={pad:function(t,e){var r=4*e;t.clamp(),t.sigBytes+=r-(t.sigBytes%r||r)},unpad:function(t){var e=t.words,r=t.sigBytes-1;for(r=t.sigBytes-1;0<=r;r--)if(e[r>>>2]>>>24-r%4*8&255){t.sigBytes=r+1;break}}},bt}); \ No newline at end of file diff --git a/module/func_aes.py b/module/func_aes.py new file mode 100644 index 0000000..b4a147a --- /dev/null +++ b/module/func_aes.py @@ -0,0 +1,188 @@ +# coding=utf-8 +import binascii +import random +import Crypto.Util.Counter + +import Crypto +import base64 + +from Crypto.Cipher import AES + +class Class_Aes: + + def buqi_key(self,aes_type,aes_key,aes_zifuji): + + if aes_type == 'AES-128': + length = 16 + elif aes_type == 'AES-192': + length = 24 + elif aes_type == 'AES-256': + length = 32 + else: + length = 16 + if len(aes_key)>=length: + return aes_key[:length].encode(),length + else: + + aes_key = self.aes_buqi_(aes_key.encode(aes_zifuji), length, 'ZeroPadding', 'utf-8') + return aes_key,length + + def encrypt(self,aes_type,aes_mode, aes_zifuji, aes_tianchong, aes_iv,aes_encode,aes_key,aes_m_text): + if not aes_key: + return ['error','AES密钥不能为空!'] + else: + aes_key,aes_length= self.buqi_key(aes_type,aes_key,aes_zifuji) + if aes_mode not in ["ECB"]: + if len(aes_iv) != 16: + # 32, 48, or 64 + return ['error', 'AES偏移长度必须为16位!'] + if not aes_iv: + return ['error', '偏移不能为空!'] + else: + aes_iv = aes_iv.encode(aes_zifuji) + if not aes_m_text: + return ['', '请输入明文!'] + else: + aes_m_text = self.aes_buqi_(aes_m_text.encode(aes_zifuji), 16, aes_tianchong, aes_zifuji) + if aes_mode == "CBC": + cryptor = AES.new(aes_key, AES.MODE_CBC, aes_iv) + elif aes_mode == "ECB": + try: + cryptor = AES.new(aes_key, AES.MODE_ECB) + except Exception as e: + print(str(e)) + elif aes_mode == "CFB": + cryptor = AES.new(aes_key, AES.MODE_CFB, aes_iv) + elif aes_mode == "CTR": + ctr = Crypto.Util.Counter.new(128, initial_value=int(binascii.hexlify(aes_iv), 16)) + cryptor = AES.new(aes_key, AES.MODE_CTR, counter=ctr) + elif aes_mode == "OFB": + cryptor = AES.new(aes_key, AES.MODE_OFB, aes_iv) + else: + return ['error', '加密模式设置错误!'] + return_text = cryptor.encrypt(aes_m_text) + if aes_encode == 'Base64': + return_text = str(base64.encodebytes(return_text), encoding=aes_zifuji).strip() + + elif aes_encode == 'Hex': + return_text = str(binascii.b2a_hex(return_text), encoding=aes_zifuji).strip() + # print(return_text) + return ['success', return_text] + + def decrypt(self,aes_type,aes_mode, aes_zifuji, aes_iv,aes_encode,aes_key,aes_m_text): + if not aes_key: + return ['error','AES密钥不能为空!'] + else: + if len(aes_key)<16: + aes_key = self.aes_buqi_(aes_key.encode(aes_zifuji), 16, 'ZeroPadding', 'utf-8') + elif 16 32: + return ['error', 'AES密钥最长32位!'] + # return ['error', 'AES密钥应为16、24、32位!'] + else: + aes_key = aes_key.encode(aes_zifuji) + if aes_mode not in ["ECB"]: + if len(aes_iv) != 16: + return ['error', 'AES偏移长度必须为16位!'] + if not aes_iv: + return ['error', '偏移不能为空!'] + else: + aes_iv = aes_iv.encode(aes_zifuji) + + if not aes_m_text: + return ['error', '请输入密文!'] + else: + if aes_encode == 'Base64': + aes_m_text = base64.b64decode(aes_m_text.encode(aes_zifuji)) + elif aes_encode == 'Hex': + aes_m_text = bytes.fromhex(aes_m_text) + if aes_mode == "CBC": + cryptor = AES.new(aes_key, AES.MODE_CBC, aes_iv) + elif aes_mode == "ECB": + cryptor = AES.new(aes_key, AES.MODE_ECB) + elif aes_mode == "CFB": + cryptor = AES.new(aes_key, AES.MODE_CFB, aes_iv) + elif aes_mode == "CTR": + ctr = Crypto.Util.Counter.new(128, initial_value=int(binascii.hexlify(aes_iv), 16)) + cryptor = AES.new(aes_key, AES.MODE_CTR, counter=ctr) + elif aes_mode == "OFB": + cryptor = AES.new(aes_key, AES.MODE_OFB, aes_iv) + else: + return ['error', '加密模式设置错误!'] + try: + return_text = cryptor.decrypt(aes_m_text) + ret = self._unpad(return_text) + return_text = ret.decode(aes_zifuji) + return ['success', return_text] + except: + return ['error', '解密失败!'] + + def _unpad(self, s): + return s[:-ord(s[len(s) - 1:])] + def aes_buqi_(self, text, length, aes_tianchong, aes_zifuji): + if aes_tianchong == "ZeroPadding": + tianchong_str = '\0' + # length = 16 + count = len(text) + if count < length: + add = (length - count) + # \0 backspace + # text = text + ('\0' * add) + text = text + (tianchong_str * add).encode(aes_zifuji) + elif count > length: + add = (length - (count % length)) + # text = text + ('\0' * add) + text = text + (tianchong_str * add).encode(aes_zifuji) + return text + elif aes_tianchong == "Pkcs7": + # bs = 16 + bs = length + # length = len(text) + # bytes_length = len(text) + # padding_size = length if (bytes_length == length) else bytes_length + padding_size = len(text) + padding = bs - padding_size % bs + padding_text = chr(padding) * padding + # print(text+ padding_text.encode(aes_zifuji)) + return (text + padding_text.encode(aes_zifuji)) + elif aes_tianchong == "Iso10126": + # bs = 16 + bs= length + padding_size = len(text) + padding = bs - padding_size % bs + # * padding-1 + qian_Str = '' + for i in range(0, padding - 1): + qian_Str += chr(random.randint(0, 9)) + padding_text = qian_Str + chr(padding) + return (text + padding_text.encode(aes_zifuji)) + elif aes_tianchong == "AnsiX923": + # bs = 16 + bs= length + tianchong_str = '\0' + padding_size = len(text) + padding = bs - padding_size % bs + text = text + (tianchong_str * (padding - 1) + chr(padding)).encode(aes_zifuji) + return text + elif aes_tianchong == "No Padding": + while len(text) % 16 != 0: + text += '\0'.encode(aes_zifuji) + return text + + else: + tianchong_str = '\0' + # length = 16 + count = len(text) + if count < length: + add = (length - count) + # \0 backspace + # text = text + ('\0' * add) + text = text + (tianchong_str * add).encode(aes_zifuji) + elif count > length: + add = (length - (count % length)) + # text = text + ('\0' * add) + text = text + (tianchong_str * add).encode(aes_zifuji) + return text diff --git a/module/func_binary.py b/module/func_binary.py new file mode 100644 index 0000000..28959f3 --- /dev/null +++ b/module/func_binary.py @@ -0,0 +1,152 @@ +# coding=utf-8 +import base36 +import base58 +import base62 +import base64 +import base91 +import html +import py3base92 +import urllib.parse + +import execjs +import js2py + + +class Class_Binary: + def exec_Binary(self, source_text, Binary_type): + all_result = '' + all_text = source_text.split(" ") + result_text=[0,''] + for text in all_text: + result_text = getattr(self, 'Binary_'+Binary_type)(text) + all_result += str(result_text[1]).replace('0o', '').replace('0x', '').replace('0b', '') + ' ' + if all_result != "": + return [result_text[0],all_result,result_text[2]] + else: + return [result_text[0],'转换失败!',result_text[2]] + def Binary_2_8(self, text): + try: + result = int(text, 2) + result_text = str(oct(result)) + except Exception as e: + return [0,'您输入的不是2进制','2->8'] + return [1,result_text,'2->8'] + + def Binary_2_10(self, text): + try: + result = int(text, 2) + result_text = str(result) + except Exception as e: + return [0,'您输入的不是2进制','2->10'] + return [1,result_text,'2->10'] + + def Binary_2_16(self, text): + try: + result_text = str(hex(int(text, 2))) + except Exception as e: + return [0,'您输入的不是2进制','2->16'] + return [1,result_text,'2->16'] + + + def Binary_8_2(self, text): + try: + result = int(text, 8) + result_text = str(bin(result)) + except Exception as e: + return [0,'您输入的不是8进制',"8->2"] + return [1, result_text,"8->2"] + + def Binary_8_10(self, text): + try: + result = int(text, 8) + result_text = str(result) + except Exception as e: + return [0,'您输入的不是8进制',"8->10"] + return [1, result_text,"8->10"] + + def Binary_8_16(self, text): + try: + result = int(text, 8) + result_text = str(hex(result)) + except Exception as e: + return [0,'您输入的不是8进制',"8->16"] + return [1, result_text,"8->16"] + + def Binary_10_2(self, text): + try: + s = int(text) + result_text = str(bin(s)) + except Exception as e: + return [0,'您输入的不是10进制',"10->2"] + + return [1, result_text,"10->2"] + + def Binary_10_8(self, text): + try: + s = int(text) + result_text = str(oct(s)) + except Exception as e: + return [0,'您输入的不是10进制',"10->8"] + return [1, result_text,"10->8"] + + def Binary_10_16(self, text): + try: + s = int(text) + result_text = str(hex(s)) + except Exception as e: + return [0,'您输入的不是10进制',"10->16"] + return [1, result_text,"10->16"] + + def Binary_16_2(self, text): + try: + result_text = str(bin(int(text, 16))) + except Exception as e: + return [0,'您输入的不是16进制',"16->2"] + return [1, result_text,"16->2"] + + def Binary_16_8(self, text): + try: + result = int(text, 16) + result_text = str(oct(result)) + except Exception as e: + return [0,'您输入的不是16进制',"16->8"] + return [1, result_text,"16->8"] + + def Binary_16_10(self, text): + try: + result = int(text, 16) + result_text = str(result) + except Exception as e: + return [0,'您输入的不是16进制',"16->10"] + return [1, result_text,"16->10"] + + def func_renyijinzhi_zhuanhuan(self, encode_type, source_text,key1,key2): + try: + return_Data = '' + if key1 != '' and key2 != '': + all_text = source_text.split(" ") + all_result = '' + for text in all_text: + # # print(text) + from_ = int(key1) + to_ = int(key2) + # from_进制转换为十进制 + ten_num = sum([int(i) * from_ ** n for n, i in enumerate(text[::-1])]) + # print(ten_num) + # 十进制转换为to_进制 + a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'b', 'C', 'D', 'E', 'F'] + b = [] + while True: + s = ten_num // to_ # 商 + y = ten_num % to_ # 余数 + b = b + [y] + if s == 0: + break + ten_num = s + b.reverse() + for i in b: + return_Data += str(a[i]) + all_result += return_Data + ' ' + return [1, all_result,key1+"->"+key2] + except Exception as e: + return [0, str(e),key1+"->"+key2] diff --git a/module/func_decode.py b/module/func_decode.py new file mode 100644 index 0000000..f4ffd05 --- /dev/null +++ b/module/func_decode.py @@ -0,0 +1,866 @@ +# coding=utf-8 +import re + +import base36 +import base58 +import base62 +import base64 +import base91 +import html +import py3base92 +import urllib.parse +import execjs +import js2py +from module.jother import Jother + +class Class_Decode: + def func_url(self,encode_type,source_text): + try: + result_text = str(urllib.parse.unquote(source_text, encode_type)) + except Exception as e: + return [0, '解码失败',"Url编码"] + return [1, result_text.strip(),'Url编码'] + + def func_unicode(self,encode_type,source_text): + try: + result_text = bytes(source_text, encoding=encode_type).decode('unicode_escape') + except Exception as e: + return [0, '解码失败',"Unicode编码"] + return [1, result_text.strip(),"Unicode编码"] + + def func_escape_u(self,encode_type,source_text): + try: + text = source_text.replace('%u', '\\u').replace('%U', '\\u') + result_text = bytes(text, encoding=encode_type).decode('unicode_escape') + except Exception as e: + return [0, '解码失败',"Escape_u编码"] + return [1, result_text.strip(),"Escape_u编码"] + def func_html(self,encode_type,source_text): + try: + result_text = html.unescape(source_text) + except Exception as e: + return [0, '解码失败',"html编码"] + return [1, result_text.strip(),"html编码"] + + # 得到分割数据 返回list + def get_split_data(self, text): + if ':' in text: + text = text.split(":") + elif ' ' in text: + text = text.split(" ") + elif ';' in text: + text = text.split(";") + elif ',' in text: + text = text.split(",") + else: + list22 = [] + list22.append(text) + text = list22 + return text + def func_ASCII_2(self,encode_type,source_text): + try: + text = self.get_split_data(source_text) + # print(text) + result = '' + for i in text: + if i != '': + # print(i) + # print(chr(int(i))) + result = result + chr(int(i, 2)) + except Exception as e: + # print(str(e)) + return [0, '解码失败',"ASCII(2进制)"] + return [1, result,"ASCII(2进制)"] + + def func_ASCII_8(self,encode_type,source_text): + try: + text = self.get_split_data(source_text) + # print(text) + result = '' + for i in text: + if i != '': + # print(i) + # print(chr(int(i))) + result = result + chr(int(i, 8)) + except Exception as e: + return [0, '解码失败',"ASCII(8进制)"] + return [1, result,"ASCII(8进制)"] + + def func_ASCII_10(self,encode_type,source_text): + try: + text = self.get_split_data(source_text) + # print(text) + result = '' + for i in text: + if i != '': + # print(i) + # print(chr(int(i))) + result = result + chr(int(i)) + except Exception as e: + return [0, '解码失败',"ASCII(10进制)"] + + return [0, result,"ASCII(10进制)"] + + def func_ASCII_16(self,encode_type,source_text): + try: + text = self.get_split_data(source_text) + # print(text) + result = '' + for i in text: + if i != '': + # print(i) + # print(chr(int(i))) + result = result + chr(int(i, 16)) + except Exception as e: + return [0, '解码失败',"ASCII(16进制)"] + return [1, result.strip(),"ASCII(16进制)"] + + def func_jsfuck(self,encode_type,source_text): + ctx = execjs.compile(""" + function decode(source) { + output = '' + if (source.length > 0) + { + l = '' + + if (source.length > 3 && source.slice(source.length-3) == ')()') + { + //eval-ed + s = source.slice(0, source.length - 2) + i = s.length + + //first try---------------------------- + while (i--) { + //if ((l = s.slice(i)).split(')').length == l.split('(').length) break + l = s.slice(i) + if (l.split(')').length == l.split('(').length) { + break; + } + } + //------------------------------------- + } + else + { + l = source; + } + + txtResult = eval(l) + return txtResult + + } + } + """) # 获取代码编译完成后的对象 + return [1, ctx.call("decode", source_text),"Jsfuck"] + + def func_jjencode(self,encode_type,source_text): + js = """ + + var result ='' + function jjdecode(t) + { + //get string from src + + + //clean it + t.replace(/^\\s+|\\s+$/g, ""); + + var startpos; + var endpos; + var gv; + var gvl; + + if (t.indexOf("\\"\\'\\\\\\"+\\'+\\",") == 0) //palindrome check + { + //locate jjcode + startpos = t.indexOf('$$+"\\\\""+') + 8; + endpos = t.indexOf('"\\\\"")())()'); + + //get gv + gv = t.substring((t.indexOf('"\\'\\\\"+\\'+",')+9), t.indexOf("=~[]")); + gvl = gv.length; + } + else + { + //get gv + gv = t.substr(0, t.indexOf("=")); + gvl = gv.length; + + //locate jjcode + startpos = t.indexOf('"\\\\""+') + 5; + endpos = t.indexOf('"\\\\"")())()'); + } + + if (startpos == endpos) + { + alert("No data !"); + return; + } + + //start decoding + var data = t.substring(startpos, endpos); + + //hex decode string + var b=[ "___+", "__$+", "_$_+", "_$$+", "$__+", "$_$+", "$$_+", "$$$+", "$___+", "$__$+", "$_$_+", "$_$$+", "$$__+", "$$_$+", "$$$_+", "$$$$+" ]; + + //lotu + var str_l = "(![]+\\"\\")[" + gv + "._$_]+"; + var str_o = gv + "._$+"; + var str_t = gv + ".__+"; + var str_u = gv + "._+"; + + //0123456789abcdef + var str_hex = gv + "."; + + //s + var str_s = '"'; + var gvsig = gv + "."; + + var str_quote = '\\\\\\\\\\\\"'; + var str_slash = '\\\\\\\\\\\\\\\\'; + + var str_lower = "\\\\\\\\\\"+"; + var str_upper = "\\\\\\\\\\"+" + gv + "._+"; + + var str_end = '"+'; //end of s loop + + + + while(data != "") + { + //l o t u + if (0 == data.indexOf(str_l)) + { + data = data.substr(str_l.length); + out("l"); + continue; + } + else if (0 == data.indexOf(str_o)) + { + data = data.substr(str_o.length); + out("o"); + continue; + } + else if (0 == data.indexOf(str_t)) + { + data = data.substr(str_t.length); + out("t"); + continue; + } + else if (0 == data.indexOf(str_u)) + { + data = data.substr(str_u.length); + out("u"); + continue; + } + + //0123456789abcdef + if (0 == data.indexOf(str_hex)) + { + data = data.substr(str_hex.length); + + //check every element of hex decode string for a match + var i = 0; + for (i = 0; i < b.length; i++) + { + if (0 == data.indexOf(b[i])) + { + data = data.substr( (b[i]).length ); + out(i.toString(16)); + break; + } + } + continue; + } + + //start of s block + if (0 == data.indexOf(str_s)) + { + data = data.substr(str_s.length); + + //check if "R + if (0 == data.indexOf(str_upper)) // r4 n >= 128 + { + data = data.substr(str_upper.length); //skip sig + + var ch_str = ""; + for (j = 0; j < 2; j++) //shouldn't be more than 2 hex chars + { + //gv + "."+b[ c ] + if (0 == data.indexOf(gvsig)) + { + data = data.substr(gvsig.length); //skip gvsig + + for (k = 0; k < b.length; k++) //for every entry in b + { + if (0 == data.indexOf(b[k])) + { + data = data.substr(b[k].length); + ch_str += k.toString(16) + ""; + break; + } + } + } + else + { + break; //done + } + } + + out(String.fromCharCode(parseInt(ch_str,16))); + continue; + } + else if (0 == data.indexOf(str_lower)) //r3 check if "R // n < 128 + { + data = data.substr(str_lower.length); //skip sig + + var ch_str = ""; + var ch_lotux = "" + var temp = ""; + var b_checkR1 = 0; + for (j = 0; j < 3; j++) //shouldn't be more than 3 octal chars + { + + if (j > 1) //lotu check + { + if (0 == data.indexOf(str_l)) + { + data = data.substr(str_l.length); + ch_lotux = "l"; + break; + } + else if (0 == data.indexOf(str_o)) + { + data = data.substr(str_o.length); + ch_lotux = "o"; + break; + } + else if (0 == data.indexOf(str_t)) + { + data = data.substr(str_t.length); + ch_lotux = "t"; + break; + } + else if (0 == data.indexOf(str_u)) + { + data = data.substr(str_u.length); + ch_lotux = "u"; + break; + } + } + + //gv + "."+b[ c ] + if (0 == data.indexOf(gvsig)) + { + temp = data.substr(gvsig.length); + for (k = 0; k < 8; k++) //for every entry in b octal + { + if (0 == temp.indexOf(b[k])) + { + if (parseInt(ch_str + k + "",8) > 128) + { + b_checkR1 = 1; + break; + } + + ch_str += k + ""; + data = data.substr(gvsig.length); //skip gvsig + data = data.substr(b[k].length); + break; + } + } + + if (1 == b_checkR1) + { + if (0 == data.indexOf(str_hex)) //0123456789abcdef + { + data = data.substr(str_hex.length); + + //check every element of hex decode string for a match + var i = 0; + for (i = 0; i < b.length; i++) + { + if (0 == data.indexOf(b[i])) + { + data = data.substr( (b[i]).length ); + ch_lotux = i.toString(16); + break; + } + } + + break; + } + } + } + else + { + break; //done + } + } + + out(String.fromCharCode(parseInt(ch_str,8)) + ch_lotux); + continue; //step out of the while loop + } + else //"S ----> "SR or "S+ + { + + // if there is, loop s until R 0r + + // if there is no matching s block, throw error + + var match = 0; + var n; + + //searching for mathcing pure s block + while(true) + { + n = data.charCodeAt( 0 ); + if (0 == data.indexOf(str_quote)) + { + data = data.substr(str_quote.length); + out('"'); + match += 1; + continue; + } + else if (0 == data.indexOf(str_slash)) + { + data = data.substr(str_slash.length); + out('\\\\'); + match += 1; + continue; + } + else if (0 == data.indexOf(str_end)) //reached end off S block ? + + { + if (match == 0) + { + return("+ no match S block: "+data); + return; + } + data = data.substr(str_end.length); + + break; //step out of the while loop + } + else if (0 == data.indexOf(str_upper)) //r4 reached end off S block ? - check if "R n >= 128 + { + if (match == 0) + { + return("no match S block n>128: "+data); + return; + } + + data = data.substr(str_upper.length); //skip sig + + var ch_str = ""; + var ch_lotux = ""; + for (j = 0; j < 10; j++) //shouldn't be more than 10 hex chars + { + + if (j > 1) //lotu check + { + if (0 == data.indexOf(str_l)) + { + data = data.substr(str_l.length); + ch_lotux = "l"; + break; + } + else if (0 == data.indexOf(str_o)) + { + data = data.substr(str_o.length); + ch_lotux = "o"; + break; + } + else if (0 == data.indexOf(str_t)) + { + data = data.substr(str_t.length); + ch_lotux = "t"; + break; + } + else if (0 == data.indexOf(str_u)) + { + data = data.substr(str_u.length); + ch_lotux = "u"; + break; + } + } + + //gv + "."+b[ c ] + if (0 == data.indexOf(gvsig)) + { + data = data.substr(gvsig.length); //skip gvsig + + for (k = 0; k < b.length; k++) //for every entry in b + { + if (0 == data.indexOf(b[k])) + { + data = data.substr(b[k].length); + ch_str += k.toString(16) + ""; + break; + } + } + } + else + { + break; //done + } + } + + out(String.fromCharCode(parseInt(ch_str,16))); + break; //step out of the while loop + } + else if (0 == data.indexOf(str_lower)) //r3 check if "R // n < 128 + { + if (match == 0) + { + return("no match S block n<128: "+data); + return; + } + + data = data.substr(str_lower.length); //skip sig + + var ch_str = ""; + var ch_lotux = "" + var temp = ""; + var b_checkR1 = 0; + for (j = 0; j < 3; j++) //shouldn't be more than 3 octal chars + { + + if (j > 1) //lotu check + { + if (0 == data.indexOf(str_l)) + { + data = data.substr(str_l.length); + ch_lotux = "l"; + break; + } + else if (0 == data.indexOf(str_o)) + { + data = data.substr(str_o.length); + ch_lotux = "o"; + break; + } + else if (0 == data.indexOf(str_t)) + { + data = data.substr(str_t.length); + ch_lotux = "t"; + break; + } + else if (0 == data.indexOf(str_u)) + { + data = data.substr(str_u.length); + ch_lotux = "u"; + break; + } + } + + //gv + "."+b[ c ] + if (0 == data.indexOf(gvsig)) + { + temp = data.substr(gvsig.length); + for (k = 0; k < 8; k++) //for every entry in b octal + { + if (0 == temp.indexOf(b[k])) + { + if (parseInt(ch_str + k + "",8) > 128) + { + b_checkR1 = 1; + break; + } + + ch_str += k + ""; + data = data.substr(gvsig.length); //skip gvsig + data = data.substr(b[k].length); + break; + } + } + + if (1 == b_checkR1) + { + if (0 == data.indexOf(str_hex)) //0123456789abcdef + { + data = data.substr(str_hex.length); + + //check every element of hex decode string for a match + var i = 0; + for (i = 0; i < b.length; i++) + { + if (0 == data.indexOf(b[i])) + { + data = data.substr( (b[i]).length ); + ch_lotux = i.toString(16); + break; + } + } + } + } + } + else + { + break; //done + } + } + + out(String.fromCharCode(parseInt(ch_str,8)) + ch_lotux); + break; //step out of the while loop + } + else if( (0x21 <= n && n <= 0x2f) || (0x3A <= n && n <= 0x40) || ( 0x5b <= n && n <= 0x60 ) || ( 0x7b <= n && n <= 0x7f ) ) + { + out(data.charAt( 0 )); + data = data.substr( 1 ); + match += 1; + } + + } + continue; + } + } + + return("no match : "+data); + break; + } + return result + + } + + function out(s) + { + result+=s; + + }""" # 获取代码编译完成后的对象 + js_dr = js2py.EvalJs() + # 执行js代码 + js_dr.execute(js) + result = js_dr.jjdecode(source_text) + if 'no match :' in result: + return [0, result.strip(),'JJEncode'] + return [1, result.strip(),'JJEncode'] + + def func_aaencode(self,encode_type,source_text): + js = """ + function aadecode( text ) + { + var evalPreamble = "(\uFF9F\u0414\uFF9F) ['_'] ( (\uFF9F\u0414\uFF9F) ['_'] ("; + var decodePreamble = "( (\uFF9F\u0414\uFF9F) ['_'] ("; + var evalPostamble = ") (\uFF9F\u0398\uFF9F)) ('_');"; + var decodePostamble = ") ());"; + + // strip beginning/ending space. + text = text.replace(/^\s*/, "").replace(/\s*$/, ""); + + // returns empty text for empty input. + if (/^\s*$/.test(text)) { + return ""; + } + // check if it is encoded. + if (text.lastIndexOf(evalPreamble) < 0) { + throw new Error("Given code is not encoded as aaencode."); + } + if (text.lastIndexOf(evalPostamble) != text.length - evalPostamble.length) { + throw new Error("Given code is not encoded as aaencode."); + } + + var decodingScript = text.replace(evalPreamble, decodePreamble).replace(evalPostamble, decodePostamble); + return eval(decodingScript); + }""" # 获取代码编译完成后的对象 + js_dr = js2py.EvalJs() + # 执行js代码 + js_dr.execute(js) + result = js_dr.aadecode(source_text) + return [1, result.strip(),"AAEncode"] + + + + def func_base16(self,encode_type,source_text): + try: + text = source_text.upper() + text = base64.b16decode(text.encode(encode_type)) + result_text = str(text, encoding=encode_type) + except Exception as e: + return [0, '解码失败',"Base16"] + return [1, result_text.strip(),"Base16"] + + def func_base32(self,encode_type,source_text): + try: + text = base64.b32decode(source_text.encode(encode_type)) + result_text = str(text, encoding=encode_type) + except Exception as e: + return [0, '解码失败',"Base32"] + + return [1, result_text.strip(),"Base32"] + + def func_base36(self,encode_type,source_text): + try: + text = base36.dumps(int(source_text)) # 解密 + result_text = str(text) + except Exception as e: + + return [0, '解码失败',"Base36"] + return [1, result_text.strip(),"Base36"] + + def func_base58(self,encode_type,source_text): + try: + result_text = base58.b58decode(source_text).decode(encode_type) # 解密 + except Exception as e: + return [0, '解码失败',"Base58"] + return [1, result_text.strip(),"Base58"] + + def func_base62(self,encode_type,source_text): + try: + result_text = base62.decode(source_text) + except: + return [0, '解码失败',"Base62"] + return [1, str(result_text).strip(),"Base62"] + + def func_base64(self,encode_type,source_text): + try: + text = base64.b64decode(source_text.encode(encode_type)) + result_text = str(text, encoding=encode_type) + except Exception as e: + return [0, '解码失败',"Base64"] + return [1, result_text.strip(),"Base64"] + + def func_base64_zidingyi(self,encode_type,source_text,n): + try: + STANDARD_ALPHABET = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + CUSTOM_ALPHABET = n.encode() + DECODE_TRANS = bytes.maketrans(CUSTOM_ALPHABET, STANDARD_ALPHABET) + result_text = base64.b64decode((source_text.encode()).translate(DECODE_TRANS)).decode() + return [1, result_text.strip(),"Base64自定义"] + except Exception as e: + return [0, str(e),"Base64自定义"] + + def func_bae85_ASCII85(self,encode_type,source_text): + try: + result_text = base64.a85decode(source_text).decode(encode_type) # 解密 + except Exception as e: + return [0, '解码失败',"Base85(ASCII85)"] + return [1, result_text.strip(),"Base85(ASCII85)"] + + def func_bae85_RFC1924(self,encode_type,source_text): + try: + result_text = base64.b85decode(source_text).decode(encode_type) # 解密 + except Exception as e: + return [0, '解码失败',"Base85(RFC1924)"] + return [1, result_text.strip(),"Base85(RFC1924)"] + + def func_base91(self,encode_type,source_text): + try: + result_text = base91.decode(source_text).decode(encode_type) + except Exception as e: + return [0, '解码失败',"Base91"] + return [1, result_text.strip(),"Base91"] + + def func_base92(self,encode_type,source_text): + try: + result_text = py3base92.decode(source_text) # 解密 + except Exception as e: + return [0, '解码失败',"Base92"] + return [1, result_text.strip(),"Base92"] + + def func_Hex_Str(self,encode_type,source_text): + try: + text = source_text.replace('0x', '').replace('0X', '') + result_text = str(bytes.fromhex(text), encoding=encode_type) + except Exception as e: + return [0, '解码失败',"Hex->Str"] + return [1, result_text.strip(),"Hex-Str"] + + def func_shellcode(self,encode_type,source_text): + try: + text = source_text.lower() + if "0x" in text and "\\x" not in text: + text = text.split('0x') + elif "\\x" in text and "0x" not in text: + text = text.split('\\x') + else: + result_text = "请输入正确的格式,如:\n\\x61\\x00\\x62\\x00\\x63\n0x610x000x620x000x63" + return [0, result_text,"Shellcode"] + result = '' + for i in text: + if i != '': + result = result + chr(int(i, 16)) + result_text = result + except Exception as e: + return [0, '解码失败',"Shellcode"] + return [1, result_text.strip(),"Shellcode"] + + def func_qwerty(self,encode_type,source_text): + try: + letter = { + 'q': 'a', 'w': 'b', 'e': 'c', 'r': 'd', 't': 'e', 'y': 'f', 'u': 'g', + 'i': 'h', 'o': 'i', 'p': 'j', 'a': 'k', 's': 'l', 'd': 'm', 'f': 'n', + 'g': 'o', 'h': 'p', 'j': 'q', 'k': 'r', 'l': 's', 'z': 't', + 'x': 'u', 'c': 'v', 'v': 'w', 'b': 'x', 'n': 'y', 'm': 'z', + 'Q': 'A', 'W': 'B', 'E': 'C', 'R': 'D', 'T': 'E', 'Y': 'F', 'U': 'G', + 'I': 'H', 'O': 'I', 'P': 'J', 'A': 'K', 'S': 'L', 'D': 'M', 'F': 'N', + 'G': 'O', 'H': 'P', 'J': 'Q', 'K': 'R', 'L': 'S', 'Z': 'T', + 'X': 'U', 'C': 'V', 'V': 'W', 'B': 'X', 'N': 'Y', 'M': 'Z', + } + result_text = '' + for i in range(0, len(source_text)): + if source_text[i] != ' ': + result_text = result_text + letter.get(source_text[i]) + else: + result_text = result_text + ' ' + except Exception as e: + return [0, '解码失败',"qwerty编码"] + return [1, result_text.strip(),"qwerty编码"] + + # 核心价值观编码 + def func_Socialism(sellf, encode_type, source_text): + values = '富强民主文明和谐自由平等公正法治爱国敬业诚信友善' + duo = [] + for i in source_text: + num = values.index(i) + if num == -1: + continue + elif num & 1: + continue + else: + duo.append(num >> 1) + hexs = [] + i = 0 + while (i < len(duo)): + if duo[i] < 10: + hexs.append(duo[i]) + elif duo[i] == 10: + i += 1 + hexs.append(duo[i] + 10) + else: + i += 1 + hexs.append(duo[i] + 6) + i += 1 + res = ''.join([hex(i)[2:].upper() for i in hexs]) + if len(res) == 0: + return [0, '解码失败',"核心价值观编码"] + + splited = [] + for i in range(len(res)): + if i & 1 == 0: + splited.append('%') + splited.append(res[i]) + result = urllib.parse.unquote(''.join(splited)) + return [1, result.strip(),"核心价值观编码"] + def func_jother(sellf, encode_type, source_text): + # a = Jother() + # # b =a.toStr("abcd") + # result = (a.toStr(source_text)) + + result = "暂不支持Jother解密,但可以在浏览器按F12打开console,输入密文后回车,可得到解密结果" + return [0, result,"jother"] + def func_baijiaxing(sellf, encode_type, source_text): + CODE = { + "赵": "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", "薛": ".", "伍": "-", "余": "_", "米": "+", "贝": "=", "姚": "/", "孟": "?", "顾": "#", + "尹": "%", "江": "&", "钟": "*" + } + source_text = re.sub('[^\u4e00-\u9fa5]+', '', source_text) + # source_text = source_text.replace( r"/ ^\s\s * /", '').replace( r"/\s\s *$ /", '') + cc = [CODE[i] for i in source_text] + dd = ''.join(cc) + if dd: + return [1, 'magnet:?xt=urn:btih:'+dd,"百家姓编码"] + else: + return [0, '解码失败',"百家姓编码"] diff --git a/module/func_decrypt.py b/module/func_decrypt.py new file mode 100644 index 0000000..1d48a69 --- /dev/null +++ b/module/func_decrypt.py @@ -0,0 +1,598 @@ +# coding=utf-8 +import collections +import re +import string + +import base36 +import base58 +import base62 +import base64 +import base91 +import html +import py3base92 +import urllib.parse + +import execjs +import js2py + +from Crypto.Cipher import AES +from re import split +from py7zr import SevenZipFile +from io import BytesIO + +class Class_Decrypt: + + def func_rot5(self, encode_type, source_text): + if not bool(re.match('^[A-Za-z0-9]+$',source_text)): + return [0, 'ROT5只能对数字解密',"ROT5"] + result = '' + ascii_num = string.digits + lookup_tuple = {} + + for i in range(len(ascii_num)): + lookup_tuple[ascii_num[i]] = ascii_num[i - 5] + + for i in source_text: + if i not in lookup_tuple: + b = i + else: + b = lookup_tuple[i] + result += b + return [1, result.strip(),"Rot5"] + + def func_rot13(self, encode_type, source_text): + if not bool(re.match('^[A-Za-z0-9]+$',source_text)): + return [0, 'Rot13只能对字母解密',"Rot13"] + try: + PAIRS = { + "a": "n", "b": "o", "c": "p", "d": "q", "e": "r", + "f": "s", "g": "t", "h": "u", "i": "v", "j": "w", + "k": "x", "l": "y", "m": "z", "n": "a", "o": "b", + "p": "c", "q": "d", "r": "e", "s": "f", "t": "g", + "u": "h", "v": "i", "w": "j", "x": "k", "y": "l", + "z": "m", "A": "N", "B": "O", "C": "P", "D": "Q", + "E": "R", "F": "S", "G": "T", "H": "U", "I": "V", + "J": "W", "K": "X", "L": "Y", "M": "Z", "N": "A", + "O": "B", "P": "C", "Q": "D", "R": "E", "S": "F", + "T": "G", "U": "H", "V": "I", "W": "J", "X": "K", + "Y": "L", "Z": "M" + } + result_text = "".join(PAIRS.get(c, c) for c in source_text) + except Exception as e: + return [0, '解密失败',"Rot13"] + return [1, result_text.strip(),"Rot13"] + + # def rot13(cryptostr): + # result = '' + # ascii_case = string.ascii_lowercase + # ascii_case_up = string.ascii_uppercase + # lookup_tuple = {} + # lookup_tuple_up = {} + # + # for i in range(len(ascii_case)): + # lookup_tuple[ascii_case[i]] = ascii_case[i - 13] + # for i in range(len(ascii_case_up)): + # lookup_tuple_up[ascii_case_up[i]] = ascii_case_up[i - 13] + # + # for i in cryptostr: + # if i not in lookup_tuple and i not in lookup_tuple_up: + # b = i + # elif i in lookup_tuple: + # b = lookup_tuple[i] + # else: + # b = lookup_tuple_up[i] + # result += b + # return [1, result.strip()] + def func_rot18(self, encode_type, source_text): + rot5_ = self.func_rot5('', source_text)[1] + # print(rot5_) + result = self.func_rot13('',rot5_) + return [1, str(result[1]).strip(),"Rot18"] + + def func_rot47(self, encode_type, source_text): + result = '' + for i in source_text: + if ord(i) > 126 or ord(i) < 33: + b = i + elif ord(i) >= 80: + b = chr(ord(i) - 47) + else: + b = chr(ord(i) + 47) + result += b + return [1, result.strip(),"Rot47"] + + def func_kaisa(self, encode_type, source_text): + if not bool(re.match('^[A-Za-z0-9]+$',source_text)): + return [0, '凯撒密码只能对字母解密',"凯撒密码"] + try: + t = "" + for c in source_text: + if 'a' <= c <= 'z': # str是可以直接比较的 + t += chr(ord('a') + ((ord(c) - ord('a')) - 3) % 26) + elif 'A' <= c <= 'Z': + t += chr(ord('A') + ((ord(c) - ord('A')) - 3) % 26) + else: + t += c + result_text = t + except Exception as e: + return [0, '解密失败',"凯撒密码"] + return [1, result_text.strip(),"凯撒密码"] + + def func_zhalan(self, encode_type, source_text): + try: + result_text = '' + factors = [fac for fac in range(2, len(source_text)) if len(source_text) % fac == 0] # 取得密文长度的所有因数 + for fac in factors: + flag = '' + for i in range(fac): # 按一定的步长取几组字符,并连接起来,这里组数就等于步长数 + flag += source_text[i::fac] + result_text += "分为%s栏,解密结果为:%s\n" % (fac, flag) + except Exception as e: + return [0, '解密失败',"栅栏密码"] + return [1, result_text.strip(),"栅栏密码"] + + def func_zhalan_w(self, encode_type, source_text): + try: + result_text = '' + for n in range(2, len(source_text)): # 遍历所有可能的栏数 + # print(str(n) + '栏:' + ''.join(self.zhanlan_w_decode(text, n)[1])) + result_text += "分为%s栏,解密结果为:%s\n" % (str(n), ''.join(self.zhanlan_w_decode(source_text, n)[1])) + except Exception as e: + return [0, '解密失败',"栅栏密码(W型)"] + return [1, result_text.strip(),"栅栏密码(W型)"] + + def func_peigen(self, encode_type, source_text): + try: + return_str = '' + dicts = {'aabbb': 'H', 'aabba': 'G', 'baaab': 'R', 'baaaa': 'Q', 'bbaab': 'Z', 'bbaaa': 'Y', + 'abbab': 'N', + 'abbaa': 'M', 'babaa': 'U', 'babab': 'V', 'abaaa': 'I', 'abaab': 'J', 'aabab': 'F', + 'aabaa': 'E', + 'aaaaa': 'A', 'aaaab': 'B', 'baabb': 'T', 'baaba': 'S', 'aaaba': 'C', 'aaabb': 'D', + 'abbbb': 'P', + 'abbba': 'O', 'ababa': 'K', 'ababb': 'L', 'babba': 'W', 'babbb': 'X'} + sums = len(source_text) + j = 5 ##每5个为一组 + for i in range(int(sums / j)): + result = source_text[j * i:j * (i + 1)].lower() + return_str += str(dicts[result], ) + result_text = return_str + except Exception as e: + return [0, '解密失败',"培根密码"] + return [1, result_text.strip(),"培根密码"] + + def func_mosi(self, encode_type, source_text): + try: + dict = {'.-': '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', '.----': '1', '..---': '2', + '...--': '3', '....-': '4', '.....': '5', '-....': '6', + '--...': '7', '---..': '8', '----.': '9', '-----': '0', + '..--..': '?', '-..-.': '/', '-.--.-': '()', '-....-': '-', + '.-.-.-': '.', '..--.-': '_' + } + msg = '' + if ' ' in source_text: + split_str = ' ' + elif '/' in source_text: + split_str = '/' + else: + split_str = source_text.replace('.', '').replace('-', '')[0:1] + s = source_text.split(split_str) + for item in s: + if item != '' and item != ' ': + if item in dict.keys(): + msg += (dict[item]) + else: + msg += ("(部分解密失败:" + item + ")") + result_text = msg + except Exception as e: + return [0, '解密失败',"摩斯密码"] + return [1, result_text.strip(),"摩斯密码"] + + def func_yiwei(self, encode_type, source_text): + try: + inputStr = source_text + # + result = '' + for j in range(26): + result_list = [] + for i, num in zip(inputStr, range(len(inputStr))): + # print(i) + caseS1 = string.ascii_lowercase * 2 + if i.islower: + caseS1 = string.ascii_lowercase * 2 + if i in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": + caseS1 = string.ascii_uppercase * 2 + status = caseS1.find(i) + if status != -1: + result_list.append(caseS1[status + j]) + else: + result_list.append(inputStr[num]) + text2 = ("".join(result_list), "向右偏移了{}位".format(j)) + result += text2[0] + ' ' + text2[1] + '\n' + result_text = result + except Exception as e: + return [0, '解密失败',"移位密码"] + return [1, result_text.strip(),"移位密码"] + + def func_yunying(self, encode_type, source_text): + try: + other_letters = [] + for s in source_text: + if not ['0', '1', '2', '4', '8'].count(s): + other_letters.append(s) + if other_letters: + return [0, '加密字符串内只能包含0、1、2、4、8',"云影密码"] + else: + result_text = '' + charList = [chr(i) for i in range(ord('A'), ord('Z') + 1)] + ret = [] + plaintext = [i for i in source_text.split('0')] + for i in plaintext: + tmp = 0 + for j in range(len(i)): + tmp += int(i[j]) + ret.append(charList[tmp - 1]) + result_text = ''.join(ret) + except Exception as e: + return [0, '解密失败',"云影密码"] + return [1, result_text.strip(),"云影密码"] + + def func_dangpu(self, encode_type, source_text): + try: + result_text = '' + mapping_data = {'田': 0, '由': 1, '中': 2, '人': 3, '工': 4, '大': 5, '王': 6, '夫': 7, '井': 8, '羊': 9} + for i in source_text: + if i in mapping_data.keys(): + result_text += str(mapping_data[i]) + else: + result_text += str(i) + except Exception as e: + return [0, '解密失败',"当铺密码"] + return [1, result_text.strip(),"当铺密码"] + + def func_Polybius(self, encode_type, source_text): + Polybius_dic = { + '11': 'A', '12': 'B', '13': 'C', '14': 'D', '15': 'E', '21': 'F', '22': 'G', + '23': 'H', '24': 'I', '25': 'K', '31': 'L', '32': 'M', '33': 'N', '34': 'O', + '35': 'P', '41': 'Q', '42': 'R', '43': 'S', '44': 'T', '45': 'U', '51': 'V', + '52': 'W', '53': 'X', '54': 'Y', '55': 'Z' + } + list = re.findall(r'.{2}', source_text) + cc = [Polybius_dic[i] for i in list] + dd = ''.join(cc) + ee='' + if 'I' in dd: + ee = dd.replace('I', 'J') + result = ("{}\n{}".format(dd, ee)) + return [1, result.strip(),"棋盘密码"] + + def func_atbash(self, encode_type, source_text): + if not bool(re.match('^[A-Za-z]+$',source_text)): + return [0, '埃特巴什码只能对字母解密',"埃特巴什码"] + try: + str1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + str2 = "zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA" + result_text = "" + for s in source_text: + if s in str1: + if s != ' ': + result_text = result_text + str1[str2.index(s)] + else: + result_text = result_text + ' ' + else: + result_text = result_text + s + except Exception as e: + return [0, '解密失败',"Atbash"] + return [1, result_text.strip(),"Atbash"] + + def func_vigenere(self,encode_type, source_text,key): + try: + letter_list = string.ascii_uppercase + letter_list2 = string.ascii_lowercase + message =source_text.strip() + if len(key) == 0: + return [0, '请输入一个合法的key!',"维吉尼亚密码"] + + key_list = [] + for i in key: + key_list.append(ord(i.upper()) - 65) + plaintext = "" + flag = 0 + for cipher in message: + if flag % len(key_list) == 0: + flag = 0 + if cipher.isalpha(): + if cipher.isupper(): + plaintext += letter_list[(ord(cipher) - 65 - key_list[flag]) % 26] + flag += 1 + if cipher.islower(): + plaintext += letter_list2[(ord(cipher) - 97 - key_list[flag]) % 26] + flag += 1 + else: + plaintext += cipher + if plaintext != '': + return [1, plaintext,"维吉尼亚密码"] + else: + return [0, '解密失败',"维吉尼亚密码"] + except Exception as e: + return [0, str(e),"维吉尼亚密码"] + + def zhanlan_w_decode(self, string, n): + '''解密''' + array = self.generate_w(string, n) + sub = 0 + for row in range(n): # 将w型字符按行的顺序依次替换为string + for col in range(len(string)): + if array[row][col] != '.': + array[row][col] = string[sub] + sub += 1 + msg = [] + for col in range(len(string)): # 以列的顺序依次连接各字符 + for row in range(n): + if array[row][col] != '.': + msg.append(array[row][col]) + return array, msg + def generate_w(self, string, n): + '''将字符排列成w型''' + array = [['.'] * len(string) for i in range(n)] # 生成初始矩阵 + row = 0 + upflag = False + for col in range(len(string)): # 在矩阵上按w型画出string + array[row][col] = string[col] + if row == n - 1: + upflag = True + if row == 0: + upflag = False + if upflag: + row -= 1 + else: + row += 1 + return array + def func_sifang(self,encode_type, source_text,key1,key2): + try: + text = source_text.upper() + key1 = key1.upper() + key2 = key2.upper() + matrix = "ABCDEFGHIJKLMNOPRSTUVWXYZ" + pla = "abcdefghijklmnoprstuvwxyz" + key1 = '[' + key1 + "]" + key2 = '[' + key2 + "]" + key1 = ''.join(collections.OrderedDict.fromkeys(key1)) + key2 = ''.join(collections.OrderedDict.fromkeys(key2)) + matrix1 = re.sub('[\[\]]', '', key1) + re.sub(key1, '', matrix) + matrix2 = re.sub('[\[\]]', '', key2) + re.sub(key2, '', matrix) + matrix_list1 = [] + matrix_list2 = [] + pla_list = [] + # print(matrix1) + for i in range(0, len(matrix1), 5): + matrix_list1.append(list(matrix1[i:i + 5])) + for i in range(0, len(matrix2), 5): + matrix_list2.append(list(matrix2[i:i + 5])) + for i in range(0, len(pla), 5): + pla_list.append(list(pla[i:i + 5])) + cip = text.replace(' ', '') + result = '' + for i in range(0, len(cip), 2): + letter = cip[i:i + 2] + # 两个子母中第一个字母位置 + first = self.find_index1(letter[0], matrix_list1) + + # 两个子母中第二个字母位置 + second = self.find_index2(letter[1], matrix_list2) + + return_pla = "" + return_pla += pla_list[first[0]][second[1]] + return_pla += pla_list[second[0]][first[1]] + result += return_pla + if result != '': + return [1, result.strip(),"四方密码"] + else: + return [0, '解密失败',"四方密码"] + + except Exception as e: + return [0, str(e),"四方密码"] + + # 求逆元函数 + def GetInverse(self, a, m): + for i in range(m): + if (1 == (a * i) % m): + return i + return a + def gcd(self, a, b): + if (a < b): + t = a + a = b + b = t + + while (0 != b): + t = a + a = b + b = t % b + return a + + def func_fangshe(self, encode_type, source_text,key1,key2): + try: + try: + if (0 == int(key1.isdigit()) or 0 == int(key2.isdigit())): + return [0, '输入有误! 密钥为数字。',"仿射密码"] + if (self.gcd(int(key1), 26) != 1): + key1_list = [] + result = '' + for i in range(0, int(key1)): + if self.gcd(i, 26) == 1: + key1_list.append(i) + for z in key1_list: + result += 'key1:%s' % z + ' 明文:' + self.fangshe_getdecrypt(int(z), int(key2)) + '\n' + return [0, '输入有误! key1和26必须互素。以下为爆破key1的结果\n' + result,"仿射密码"] + else: + result = self.fangshe_getdecrypt(source_text,int(key1), int(key2)) + return [1, result.strip(),"仿射密码"] + + except: + return [0, '输入有误!',"仿射密码"] + + except Exception as e: + return [0, str(e),"仿射密码"] + + def fangshe_getdecrypt(self, source_text,key1, key2): + try: + text = source_text.strip() + letter_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 字母表 + plaintext = "" + for ch in text: # 遍历密文 + if ch.isalpha(): # 密文为否为字母,如果是,则判断大小写,分别进行解密 + if ch.isupper(): + plaintext += letter_list[self.GetInverse(key1, 26) * (ord(ch) - 65 - key2) % 26] + else: + plaintext += letter_list[self.GetInverse(key1, 26) * (ord(ch) - 97 - key2) % 26].lower() + else: # 如果密文不为字母,直接添加到明文字符串里 + plaintext += ch + return plaintext + except: + return + + # 查询两个密文字母位置 + def find_index1(self, x, matrix_list1): + for i in range(len(matrix_list1)): + for j in range(len(matrix_list1[i])): + if matrix_list1[i][j] == x: + return i, j + + def find_index2(self, y, matrix_list2): + for k in range(len(matrix_list2)): + for l in range(len(matrix_list2[k])): + if matrix_list2[k][l] == y: + return k, l + def func_yufolunchan_v1(self,encode_type,source_text): + KEY = b'XDXDtudou@KeyFansClub^_^Encode!!' + IV = b'Potato@Key@_@=_=' + try: + result = self.DecryptFoYue(source_text,KEY,IV) + except: + result = self.DecryptRuShiWoWen(source_text,KEY,IV) + return [1, result.strip(),"与佛论禅1.0"] + + def DecryptFoYue(self,ciphertext,KEY,IV): + BYTEMARK = ['冥', '奢', '梵', '呐', '俱', '哆', '怯', '諳', '罰', '侄', '缽', '皤'] + foYue = [ + '滅', '苦', '婆', '娑', '耶', '陀', '跋', '多', '漫', '都', '殿', '悉', '夜', '爍', '帝', '吉', + '利', '阿', '無', '南', '那', '怛', '喝', '羯', '勝', '摩', '伽', '謹', '波', '者', '穆', '僧', + '室', '藝', '尼', '瑟', '地', '彌', '菩', '提', '蘇', '醯', '盧', '呼', '舍', '佛', '參', '沙', + '伊', '隸', '麼', '遮', '闍', '度', '蒙', '孕', '薩', '夷', '迦', '他', '姪', '豆', '特', '逝', + '朋', '輸', '楞', '栗', '寫', '數', '曳', '諦', '羅', '曰', '咒', '即', '密', '若', '般', '故', + '不', '實', '真', '訶', '切', '一', '除', '能', '等', '是', '上', '明', '大', '神', '知', '三', + '藐', '耨', '得', '依', '諸', '世', '槃', '涅', '竟', '究', '想', '夢', '倒', '顛', '離', '遠', + '怖', '恐', '有', '礙', '心', '所', '以', '亦', '智', '道', '。', '集', '盡', '死', '老', '至'] + + ciphertext = split("[::]", ciphertext) + if len(ciphertext) > 1: + ciphertext = "".join(ciphertext[1:]).strip() + else: + ciphertext = ciphertext[0] + data = b'' + i = 0 + while i < len(ciphertext): + if ciphertext[i] in BYTEMARK: + i = i + 1 + data = data + bytes([foYue.index(ciphertext[i]) + 128]) + else: + data = data + bytes([foYue.index(ciphertext[i])]) + i = i + 1 + cryptor = AES.new(KEY, AES.MODE_CBC, IV) + result = cryptor.decrypt(data) + flag = result[-1] + if flag < 16 and result[-flag] == flag: + result = result[:-flag] + return result.decode('utf-16le') + + def DecryptRuShiWoWen(self,ciphertext,KEY,IV): + ruShiWoWen = [ + '謹', '穆', '僧', '室', '藝', '瑟', '彌', '提', '蘇', '醯', '盧', '呼', '舍', '參', '沙', '伊', + '隸', '麼', '遮', '闍', '度', '蒙', '孕', '薩', '夷', '他', '姪', '豆', '特', '逝', '輸', '楞', + '栗', '寫', '數', '曳', '諦', '羅', '故', '實', '訶', '知', '三', '藐', '耨', '依', '槃', '涅', + '竟', '究', '想', '夢', '倒', '顛', '遠', '怖', '恐', '礙', '以', '亦', '智', '盡', '老', '至', + '吼', '足', '幽', '王', '告', '须', '弥', '灯', '护', '金', '刚', '游', '戏', '宝', '胜', '通', + '药', '师', '琉', '璃', '普', '功', '德', '山', '善', '住', '过', '去', '七', '未', '来', '贤', + '劫', '千', '五', '百', '万', '花', '亿', '定', '六', '方', '名', '号', '东', '月', '殿', '妙', + '尊', '树', '根', '西', '皂', '焰', '北', '清', '数', '精', '进', '首', '下', '寂', '量', '诸', + '多', '释', '迦', '牟', '尼', '勒', '阿', '閦', '陀', '中', '央', '众', '生', '在', '界', '者', + '行', '于', '及', '虚', '空', '慈', '忧', '各', '令', '安', '稳', '休', '息', '昼', '夜', '修', + '持', '心', '求', '诵', '此', '经', '能', '灭', '死', '消', '除', '毒', '害', '高', '开', '文', + '殊', '利', '凉', '如', '念', '即', '说', '曰', '帝', '毘', '真', '陵', '乾', '梭', '哈', '敬', + '禮', '奉', '祖', '先', '孝', '雙', '親', '守', '重', '師', '愛', '兄', '弟', '信', '朋', '友', + '睦', '宗', '族', '和', '鄉', '夫', '婦', '教', '孫', '時', '便', '廣', '積', '陰', '難', '濟', + '急', '恤', '孤', '憐', '貧', '創', '廟', '宇', '印', '造', '經', '捨', '藥', '施', '茶', '戒', + '殺', '放', '橋', '路', '矜', '寡', '拔', '困', '粟', '惜', '福', '排', '解', '紛', '捐', '資'] + ciphertext = split("[::]", ciphertext) + if len(ciphertext) > 1: + ciphertext = "".join(ciphertext[1:]).strip() + else: + ciphertext = ciphertext[0] + data = b'' + for i in ciphertext: + data += bytes([ruShiWoWen.index(i)]) + cryptor = AES.new(KEY, AES.MODE_CBC, IV) + fsevenZip = SevenZipFile(BytesIO(cryptor.decrypt(data))) + zipContent = fsevenZip.readall()['default'].read() + return zipContent.decode() + + def func_yufolunchan_v2(sellf,encode_type,source_text,key): + CODE = {"e": "啰", "E": "羯", "t": "婆", "T": "提", + "a": "摩", "A": "埵", "o": "诃", "O": "迦", + "i": "耶", "I": "吉", "n": "娑", "N": "佛", + "s": "夜", "S": "驮", "h": "那", "H": "谨", + "r": "悉", "R": "墀", "d": "阿", "D": "呼", + "l": "萨", "L": "尼", "c": "陀", "C": "唵", + "u": "唎", "U": "伊", "m": "卢", "M": "喝", + "w": "帝", "W": "烁", "f": "醯", "F": "蒙", + "g": "罚", "G": "沙", "y": "嚧", "Y": "他", "p": "南", + "P": "豆", "b": "无", "B": "孕", "v": "菩", + "V": "伽", "k": "怛", "K": "俱", "j": "哆", + "J": "度", "x": "皤", "X": "阇", "q": "室", + "Q": "地", "z": "利", "Z": "遮", "0": "穆", + "1": "参", "2": "舍", "3": "苏", "4": "钵", + "5": "曳", "6": "数", "7": "写", "8": "栗", + "9": "楞", "+": "咩", "/": "输", "=": "漫", + } + CODE = dict((value, key) for key, value in CODE.items()) + if len(source_text)<1: + return [0,"无言者,纵真神再临,亦不可渡。(请输入待解密的密文)","与佛论禅2.0"] + elif source_text[0:4] !="佛又曰:" and source_text[0:3] !="佛曰:" : + return [0,"施主可曾记得此为何高僧所言?(不是佛语,请确定密文来源本网站并且密文以“佛曰:”或“佛又曰:”开头”)","与佛论禅2.0"] + else: + source_text = source_text.replace("佛又曰:","").replace("佛曰:","") + msg = '' + for char in source_text: + if char in CODE: + if char == ' ': + pass + else: + msg += (CODE[char]) + else: + msg = '文本中含有不能识别的字符!' + try: + f = open('./module/yufoluntan_main.js', 'r') + jsf_code = f.read() + js = execjs.get() + # print(jsf_code) + # print "Using Engine %s" % js.name + jsf_int = js.compile(jsf_code) + return_text = jsf_int.call("aes_decrypto", msg, key) + return [1, return_text,"与佛论禅2.0"] + except Exception as e: + return [0, str(e),"与佛论禅2.0"] + + def func_a1z26(self, encode_type, source_text): + str1 = string.ascii_lowercase + res = source_text.split("-") + result = "" + for i in res: + result += str1[int(i) - 1] + return [1, result.strip(),"A1z26密码"] \ No newline at end of file diff --git a/module/func_encode.py b/module/func_encode.py new file mode 100644 index 0000000..4bfb259 --- /dev/null +++ b/module/func_encode.py @@ -0,0 +1,704 @@ +# coding=utf-8 +import re +from random import random +from module.jother import Jother +import base36 +import base58 +import base62 +import base64 +import base91 +import html +import py3base92 +import urllib.parse + +import execjs +import js2py + + +class Class_Encode: + + def func_url(self, encode_type, source_text): + text = source_text.encode(encode_type) + result_text = urllib.parse.quote(text) + return [1, result_text,"Url"] + + def func_unicode(self, encode_type, source_text): + text = source_text.encode('unicode_escape') + result_text = str(text, encoding=encode_type) + return [1, result_text,"Unicode"] + + def func_escape_u(self, encode_type, source_text): + text = source_text.encode('unicode_escape') + result_text = str(text, encoding=encode_type).replace('\\u', '%u') + return [1, result_text,"Escape_u"] + + def func_html(self, encode_type, source_text): + result_text = html.escape(source_text) + return [1, result_text,"html"] + + def func_ASCII_2(self, encode_type, source_text): + result = '' + for i in source_text: + s = int(ord(str(i))) + re = str(bin(s)).replace('0b', '') + result += str(re) + ' ' + result_text = str(result) + return [1, result_text.strip(),"ASCII(2进制)"] + + def func_ASCII_8(self, encode_type, source_text): + result = '' + for i in source_text: + s = int(ord(str(i))) + re = str(oct(s)).replace('0o', '') + result += str(re) + ' ' + result_text = str(result) + return [1, result_text.strip(),"ASCII(8进制)"] + + def func_ASCII_10(self, encode_type, source_text): + result = '' + for i in source_text: + result = str(result) + str(ord(str(i))) + ' ' + result_text = str(result) + return [1, result_text.strip(),"ASCII(10进制)"] + + def func_ASCII_16(self, encode_type, source_text): + result = '' + for i in source_text: + s = int(ord(str(i))) + re = str(hex(s)).replace('0x', '') + result += str(re) + ' ' + result_text = str(result) + return [1, result_text.strip(),"ASCII(16进制)"] + + def func_base16(self, encode_type, source_text): + text = source_text.lower() + text = base64.b16encode(text.encode(encode_type)) + result_text = str(text, encoding=encode_type) + return [1, result_text,"Base16"] + + def func_base32(self, encode_type, source_text): + text = base64.b32encode(source_text.encode(encode_type)) + result_text = str(text, encoding=encode_type) + return [1, result_text,"Base32"] + + def func_base36(self, encode_type, source_text): + result_text = str(base36.loads(source_text)) + return [1, result_text,"Base36"] + + def func_base58(self, encode_type, source_text): + result_text = base58.b58encode(source_text.encode(encode_type)).decode() # 加密 + return [1, result_text,"Base58"] + + def func_base62(self, encode_type, source_text): + try: + text = base62.encode(int(source_text)) + except: + return [0, 'base62只能对数字编码',"Base62"] + # print(text) + # result_text = str(text, encoding='utf-8') + return [1, text,"Base62"] + + def func_base64(self, encode_type, source_text): + text = base64.b64encode(source_text.encode(encode_type)) + result_text = str(text, encoding=encode_type) + return [1, result_text,"Base64"] + + def func_base64_zidingyi(self, encode_type, source_text, n): + try: + STANDARD_ALPHABET = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + CUSTOM_ALPHABET = n.encode(encode_type) + encode_typeTRANS = bytes.maketrans(STANDARD_ALPHABET, CUSTOM_ALPHABET) + result_text = base64.b64encode(source_text.encode(encode_type)).translate(encode_typeTRANS).decode() + return [1, result_text,"Base64(自定义)"] + except Exception as e: + return [0, str(e),"Base64(自定义)"] + + def func_bae85_ASCII85(self, encode_type, source_text): + result_text = base64.a85encode(source_text.encode(encode_type)).decode(encode_type) # 加密 + return [1, result_text,"Base85(ASCII85)"] + + def func_bae85_RFC1924(self, encode_type, source_text): + result_text = base64.b85encode(source_text.encode(encode_type)).decode() # 加密 + return [1, result_text,"Base85(RFC1924)"] + + def func_base91(self, encode_type, source_text): + result_text = base91.encode(source_text.encode(encode_type)) # + return [1, result_text,"Base91"] + + def func_base92(self, encode_type, source_text): + result_text = py3base92.encode(source_text) + return [1, result_text,"Base92"] + + def func_Str_Hex(self, encode_type, source_text): + result = '' + for i in source_text: + single = str(hex(ord(str(i)))) + result = result + single + result_text = (str(result)).replace('0x', '') + return [1, result_text,"Str->Hex"] + + def func_shellcode(self, encode_type, source_text): + result = '' + for i in source_text: + single = str(hex(ord(str(i)))) + result = result + single + result_text = (str(result)).replace('0x', '\\x') + return [1, result_text,"Shellcode"] + + def func_qwerty(self, encode_type, source_text): + str1 = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" + str2 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + result_text = "" + for s in source_text: + if s in str1: + if s != ' ': + result_text = result_text + str1[str2.index(s)] + else: + result_text = result_text + ' ' + else: + return [1, 'Qwerty只能对字母加密!', "Qwerty密码"] + return [1, result_text,"Qwerty密码"] + # print(str(e)) + + def func_jsfuck(self, encode_type, source_text): + ctx = execjs.compile(""" + /*! JSFuck 0.4.0 - http://jsfuck.com */ + + function JSFuck(code){ + + var USE_CHAR_CODE = "USE_CHAR_CODE"; + + var MIN = 32, MAX = 126; + + var SIMPLE = { + 'false': '![]', + 'true': '!![]', + 'undefined': '[][[]]', + 'NaN': '+[![]]', + 'Infinity': '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])' // +"1e1000" + }; + + var CONSTRUCTORS = { + 'Array': '[]', + 'Number': '(+[])', + 'String': '([]+[])', + 'Boolean': '(![])', + 'Function': '[]["fill"]', + 'RegExp': 'Function("return/"+false+"/")()' + }; + + var MAPPING = { + 'a': '(false+"")[1]', + 'b': '([]["entries"]()+"")[2]', + 'c': '([]["fill"]+"")[3]', + 'd': '(undefined+"")[2]', + 'e': '(true+"")[3]', + 'f': '(false+"")[0]', + 'g': '(false+[0]+String)[20]', + 'h': '(+(101))["to"+String["name"]](21)[1]', + 'i': '([false]+undefined)[10]', + 'j': '([]["entries"]()+"")[3]', + 'k': '(+(20))["to"+String["name"]](21)', + 'l': '(false+"")[2]', + 'm': '(Number+"")[11]', + 'n': '(undefined+"")[1]', + 'o': '(true+[]["fill"])[10]', + 'p': '(+(211))["to"+String["name"]](31)[1]', + 'q': '(+(212))["to"+String["name"]](31)[1]', + 'r': '(true+"")[1]', + 's': '(false+"")[3]', + 't': '(true+"")[0]', + 'u': '(undefined+"")[0]', + 'v': '(+(31))["to"+String["name"]](32)', + 'w': '(+(32))["to"+String["name"]](33)', + 'x': '(+(101))["to"+String["name"]](34)[1]', + 'y': '(NaN+[Infinity])[10]', + 'z': '(+(35))["to"+String["name"]](36)', + + 'A': '(+[]+Array)[10]', + 'B': '(+[]+Boolean)[10]', + 'C': 'Function("return escape")()(("")["italics"]())[2]', + 'D': 'Function("return escape")()([]["fill"])["slice"]("-1")', + 'E': '(RegExp+"")[12]', + 'F': '(+[]+Function)[10]', + 'G': '(false+Function("return Date")()())[30]', + 'H': USE_CHAR_CODE, + 'I': '(Infinity+"")[0]', + 'J': USE_CHAR_CODE, + 'K': USE_CHAR_CODE, + 'L': USE_CHAR_CODE, + 'M': '(true+Function("return Date")()())[30]', + 'N': '(NaN+"")[0]', + 'O': '(NaN+Function("return{}")())[11]', + 'P': USE_CHAR_CODE, + 'Q': USE_CHAR_CODE, + 'R': '(+[]+RegExp)[10]', + 'S': '(+[]+String)[10]', + 'T': '(NaN+Function("return Date")()())[30]', + 'U': '(NaN+Function("return{}")()["to"+String["name"]]["call"]())[11]', + 'V': USE_CHAR_CODE, + 'W': USE_CHAR_CODE, + 'X': USE_CHAR_CODE, + 'Y': USE_CHAR_CODE, + 'Z': USE_CHAR_CODE, + + ' ': '(NaN+[]["fill"])[11]', + '!': USE_CHAR_CODE, + '"': '("")["fontcolor"]()[12]', + '#': USE_CHAR_CODE, + '$': USE_CHAR_CODE, + '%': 'Function("return escape")()([]["fill"])[21]', + '&': '("")["link"](0+")[10]', + '\\'': USE_CHAR_CODE, + '(': '(undefined+[]["fill"])[22]', + ')': '([0]+false+[]["fill"])[20]', + '*': USE_CHAR_CODE, + '+': '(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]', + ',': '([]["slice"]["call"](false+"")+"")[1]', + '-': '(+(.+[0000000001])+"")[2]', + '.': '(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]', + '/': '(false+[0])["italics"]()[10]', + ':': '(RegExp()+"")[3]', + ';': '("")["link"](")[14]', + '<': '("")["italics"]()[0]', + '=': '("")["fontcolor"]()[11]', + '>': '("")["italics"]()[2]', + '?': '(RegExp()+"")[2]', + '@': USE_CHAR_CODE, + '[': '([]["entries"]()+"")[0]', + '\\\\': USE_CHAR_CODE, + ']': '([]["entries"]()+"")[22]', + '^': USE_CHAR_CODE, + '_': USE_CHAR_CODE, + '`': USE_CHAR_CODE, + '{': '(true+[]["fill"])[20]', + '|': USE_CHAR_CODE, + '}': '([]["fill"]+"")["slice"]("-1")', + '~': USE_CHAR_CODE + }; + + var GLOBAL = 'Function("return this")()'; + + function fillMissingChars(){ + for (var key in MAPPING){ + if (MAPPING[key] === USE_CHAR_CODE){ + MAPPING[key] = 'Function("return unescape")()("%"'+ key.charCodeAt(0).toString(16).replace(/(\\d+)/g, "+($1)+\\"") + '")'; + } + } + } + + function fillMissingDigits(){ + var output, number, i; + + for (number = 0; number < 10; number++){ + + output = "+[]"; + + if (number > 0){ output = "+!" + output; } + for (i = 1; i < number; i++){ output = "+!+[]" + output; } + if (number > 1){ output = output.substr(1); } + + MAPPING[number] = "[" + output + "]"; + } + } + + function replaceMap(){ + var character = "", value, original, i, key; + + function replace(pattern, replacement){ + value = value.replace( + new RegExp(pattern, "gi"), + replacement + ); + } + + function digitReplacer(_,x) { return MAPPING[x]; } + + function numberReplacer(_,y) { + var values = y.split(""); + var head = +(values.shift()); + var output = "+[]"; + + if (head > 0){ output = "+!" + output; } + for (i = 1; i < head; i++){ output = "+!+[]" + output; } + if (head > 1){ output = output.substr(1); } + + return [output].concat(values).join("+").replace(/(\\d)/g, digitReplacer); + } + + for (i = MIN; i <= MAX; i++){ + character = String.fromCharCode(i); + value = MAPPING[character]; + if(!value) {continue;} + original = value; + + for (key in CONSTRUCTORS){ + replace("\\\\b" + key, CONSTRUCTORS[key] + '["constructor"]'); + } + + for (key in SIMPLE){ + replace(key, SIMPLE[key]); + } + + replace('(\\\\d\\\\d+)', numberReplacer); + replace('\\\\((\\\\d)\\\\)', digitReplacer); + replace('\\\\[(\\\\d)\\\\]', digitReplacer); + + replace("GLOBAL", GLOBAL); + replace('\\\\+""', "+[]"); + replace('""', "[]+[]"); + + MAPPING[character] = value; + } + } + + function replaceStrings(){ + var regEx = /[^\\[\\]\\(\\)\\!\\+]{1}/g, + all, value, missing, + count = MAX - MIN; + + function findMissing(){ + var all, value, done = false; + + missing = {}; + + for (all in MAPPING){ + + value = MAPPING[all]; + + if (value.match(regEx)){ + missing[all] = value; + done = true; + } + } + + return done; + } + + function mappingReplacer(a, b) { + return b.split("").join("+"); + } + + function valueReplacer(c) { + return missing[c] ? c : MAPPING[c]; + } + + for (all in MAPPING){ + MAPPING[all] = MAPPING[all].replace(/\\"([^\\"]+)\\"/gi, mappingReplacer); + } + + while (findMissing()){ + for (all in missing){ + value = MAPPING[all]; + value = value.replace(regEx, valueReplacer); + + MAPPING[all] = value; + missing[all] = value; + } + + if (count-- === 0){ + console.error("Could not compile the following chars:", missing); + } + } + } + + function encode(input, wrapWithEval, runInParentScope){ + var output = []; + + if (!input){ + return ""; + } + + var r = ""; + for (var i in SIMPLE) { + r += i + "|"; + } + r+="."; + + input.replace(new RegExp(r, 'g'), function(c) { + var replacement = SIMPLE[c]; + if (replacement) { + output.push("[" + replacement + "]+[]"); + } else { + replacement = MAPPING[c]; + if (replacement){ + output.push(replacement); + } else { + replacement = + "([]+[])[" + encode("constructor") + "]" + + "[" + encode("fromCharCode") + "]" + + "(" + encode(c.charCodeAt(0) + "") + ")"; + + output.push(replacement); + MAPPING[c] = replacement; + } + } + }); + + output = output.join("+"); + + if (/^\\d$/.test(input)){ + output += "+[]"; + } + + if (wrapWithEval){ + if (runInParentScope){ + output = "[][" + encode("fill") + "]" + + "[" + encode("constructor") + "]" + + "(" + encode("return eval") + ")()" + + "(" + output + ")"; + } else { + output = "[][" + encode("fill") + "]" + + "[" + encode("constructor") + "]" + + "(" + output + ")()"; + } + } + + return output; + } + + fillMissingDigits(); + fillMissingChars(); + replaceMap(); + replaceStrings(); + + var js_fuck_payload = encode(code,1); + return js_fuck_payload; + }; + """) # 获取代码编译完成后的对象 + + result = ctx.call("JSFuck", source_text, '1') + return [1, result,"Jsfuck"] + # f = open('./module/jsfuck.js', 'r') + # jsf_code = f.read() + # js = execjs.get() + # # print(jsf_code) + # # print "Using Engine %s" % js.name + # jsf_int = js.compile(jsf_code) + # return_text = jsf_int.call("JSFuck", text, '1') + # return(return_text) + + def func_jjencode(self, encode_type, source_text): + js = """ + function keyup( t ) + { + var _prev; + var v = "$"; + var p = false; + var r; + + if( _prev != ( t + "\\0" + v + "\\0" + p ) || true ){ + r = jjencode( v, t ); + if( p ){ + r = r.replace( /[,;]$/, "" ); + r = "\\"\\'\\\\\\"+\\'+\\"," + r + ",\\'," + r.split("").reverse().join("") +",\\"+\\'+\\"\\\\\\'\\""; + } + return r + + } + + } + function jjencode( gv, text ) + { + var r=""; + var n; + var t; + var b=[ "___", "__$", "_$_", "_$$", "$__", "$_$", "$$_", "$$$", "$___", "$__$", "$_$_", "$_$$", "$$__", "$$_$", "$$$_", "$$$$", ]; + var s = ""; + for( var i = 0; i < text.length; i++ ){ + n = text.charCodeAt( i ); + if( n == 0x22 || n == 0x5c ){ + s += "\\\\\\\\\\\\" + text.charAt( i ).toString(16); + }else if( (0x21 <= n && n <= 0x2f) || (0x3A <= n && n <= 0x40) || ( 0x5b <= n && n <= 0x60 ) || ( 0x7b <= n && n <= 0x7f ) ){ + //}else if( (0x20 <= n && n <= 0x2f) || (0x3A <= n == 0x40) || ( 0x5b <= n && n <= 0x60 ) || ( 0x7b <= n && n <= 0x7f ) ){ + s += text.charAt( i ); + }else if( (0x30 <= n && n <= 0x39 ) || (0x61 <= n && n <= 0x66 ) ){ + if( s ) r += "\\"" + s +"\\"+"; + r += gv + "." + b[ n < 0x40 ? n - 0x30 : n - 0x57 ] + "+"; + s=""; + }else if( n == 0x6c ){ // 'l' + if( s ) r += "\\"" + s + "\\"+"; + r += "(![]+\\"\\")[" + gv + "._$_]+"; + s = ""; + }else if( n == 0x6f ){ // 'o' + if( s ) r += "\\"" + s + "\\"+"; + r += gv + "._$+"; + s = ""; + }else if( n == 0x74 ){ // 'u' + if( s ) r += "\\"" + s + "\\"+"; + r += gv + ".__+"; + s = ""; + }else if( n == 0x75 ){ // 'u' + if( s ) r += "\\"" + s + "\\"+"; + r += gv + "._+"; + s = ""; + }else if( n < 128 ){ + if( s ) r += "\\"" + s; + else r += "\\""; + r += "\\\\\\\\\\"+" + n.toString( 8 ).replace( /[0-7]/g, function(c){ return gv + "."+b[ c ]+"+" } ); + s = ""; + }else{ + if( s ) r += "\\"" + s; + else r += "\\""; + r += "\\\\\\\\\\"+" + gv + "._+" + n.toString(16).replace( /[0-9a-f]/gi, function(c){ return gv + "."+b[parseInt(c,16)]+"+"} ); + s = ""; + } + } + if( s ) r += "\\"" + s + "\\"+"; + + r = + gv + "=~[];" + + gv + "={___:++" + gv +",$$$$:(![]+\\"\\")["+gv+"],__$:++"+gv+",$_$_:(![]+\\"\\")["+gv+"],_$_:++"+ + gv+",$_$$:({}+\\"\\")["+gv+"],$$_$:("+gv+"["+gv+"]+\\"\\")["+gv+"],_$$:++"+gv+",$$$_:(!\\"\\"+\\"\\")["+ + gv+"],$__:++"+gv+",$_$:++"+gv+",$$__:({}+\\"\\")["+gv+"],$$_:++"+gv+",$$$:++"+gv+",$___:++"+gv+",$__$:++"+gv+"};"+ + gv+".$_="+ + "("+gv+".$_="+gv+"+\\"\\")["+gv+".$_$]+"+ + "("+gv+"._$="+gv+".$_["+gv+".__$])+"+ + "("+gv+".$$=("+gv+".$+\\"\\")["+gv+".__$])+"+ + "((!"+gv+")+\\"\\")["+gv+"._$$]+"+ + "("+gv+".__="+gv+".$_["+gv+".$$_])+"+ + "("+gv+".$=(!\\"\\"+\\"\\")["+gv+".__$])+"+ + "("+gv+"._=(!\\"\\"+\\"\\")["+gv+"._$_])+"+ + gv+".$_["+gv+".$_$]+"+ + gv+".__+"+ + gv+"._$+"+ + gv+".$;"+ + gv+".$$="+ + gv+".$+"+ + "(!\\"\\"+\\"\\")["+gv+"._$$]+"+ + gv+".__+"+ + gv+"._+"+ + gv+".$+"+ + gv+".$$;"+ + gv+".$=("+gv+".___)["+gv+".$_]["+gv+".$_];"+ + gv+".$("+gv+".$("+gv+".$$+\\"\\\\\\"\\"+" + r + "\\"\\\\\\"\\")())();"; + + return r; + }""" # 获取代码编译完成后的对象 + js_dr = js2py.EvalJs() + # 执行js代码 + js_dr.execute(js) + result = js_dr.keyup(source_text) + return [1, result,"JJEncode"] + + def func_aaencode(self, encode_type, source_text): + js = """ + function aaencode( text ) + { + var t; + var b = [ + "(c^_^o)", + "(゚Θ゚)", + "((o^_^o) - (゚Θ゚))", + "(o^_^o)", + "(゚ー゚)", + "((゚ー゚) + (゚Θ゚))", + "((o^_^o) +(o^_^o))", + "((゚ー゚) + (o^_^o))", + "((゚ー゚) + (゚ー゚))", + "((゚ー゚) + (゚ー゚) + (゚Θ゚))", + "(゚Д゚) .゚ω゚ノ", + "(゚Д゚) .゚Θ゚ノ", + "(゚Д゚) ['c']", + "(゚Д゚) .゚ー゚ノ", + "(゚Д゚) .゚Д゚ノ", + "(゚Д゚) [゚Θ゚]" + ]; + var r = "゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); "; + + if( /ひだまりスケッチ×(365|356)\\s*来週も見てくださいね[!!]/.test( text ) ){ + r += "X=_=3; "; + r += "\\r\\n\\r\\n X / _ / X < \\"来週も見てくださいね!\\";\\r\\n\\r\\n"; + } + r += "(゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);"+ + "(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] "+ + ",゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] "+ + ",゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];"+ + "(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];"+ + "(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];"+ + "(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + "+ + "((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+"+ + "((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+"+ + "((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+"+ + "((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];"+ + "(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+"+ + "((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+"+ + "((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; "+ + "(゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\\\\\\\'; "+ + "(゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];"+ + "(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];"+//TODO + "(゚Д゚) [゚o゚]='\\\\\\"';"+ + "(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+"; + r += "(゚Д゚)[゚o゚]+ "; + for( var i = 0; i < text.length; i++ ){ + n = text.charCodeAt( i ); + t = "(゚Д゚)[゚ε゚]+"; + if( n <= 127 ){ + t += n.toString( 8 ).replace( /[0-7]/g, function(c){ return b[ c ] + "+ "; } ); + }else{ + var m = /[0-9a-f]{4}$/.exec( "000" + n.toString(16 ) )[0]; + t += "(o゚ー゚o)+ " + m.replace( /[0-9a-f]/gi, function(c){ return b[ parseInt( c,16 ) ] + "+ "; } ); + } + r += t; + + } + r += "(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');"; + return r; + + + }""" + js_dr = js2py.EvalJs() + # 执行js代码 + js_dr.execute(js) + result = js_dr.aaencode(source_text) + return [1, result,"AAEncode"] + + def func_Socialism(self, encode_type, source_text): + + values = '富强民主文明和谐自由平等公正法治爱国敬业诚信友善' + strs = "0123456789ABCDEF" + pattern = re.compile(r"[A-Za-z0-9\-\_\.\!\~\*\'\(\)]") + str1 = '' + for i in source_text: + if pattern.match(i) == None: + str1 += urllib.parse.quote(i.encode()) + else: + str1 += hex(ord(i))[2:] + + concated = str1.replace('%', '').upper() + duo = [] + for i in concated: + n = strs.index(i) + if n < 10: + duo.append(n) + elif random() >= 0.5: + duo.append(10) + duo.append(n - 10) + else: + duo.append(11) + duo.append(n - 6) + result = ''.join([values[2 * i] + values[2 * i + 1] for i in duo]) + return [1, result,"核心价值观编码"] + + def func_jother(sellf, encode_type, source_text): + a = Jother() + result = (a.toScript(source_text)) + return [1, result,"Jother"] + + def func_baijiaxing(sellf, encode_type, source_text): + CODE = { + "赵": "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", "薛": ".", "伍": "-", "余": "_", "米": "+", "贝": "=", "姚": "/", "孟": "?", "顾": "#", + "尹": "%", "江": "&", "钟": "*" + } + source_text = re.sub('[\u4e00-\u9fa5]', '', source_text) + # source_text = source_text.replace( r"/ ^\s\s * /", '').replace( r"/\s\s *$ /", '') + CODE = dict((value, key) for key, value in CODE.items()) + cc = [CODE[i] for i in source_text] + dd = ''.join(cc) + return [1, dd,"百家姓编码"] diff --git a/module/func_encrypt.py b/module/func_encrypt.py new file mode 100644 index 0000000..07ebeba --- /dev/null +++ b/module/func_encrypt.py @@ -0,0 +1,437 @@ +# coding=utf-8 +import collections +import random +import re +import string + +import base36 +import base58 +import base62 +import base64 +import base91 +import html +import py3base92 +import urllib.parse + +import execjs +import js2py +from Crypto.Cipher import AES + + +class Class_Encrypt: + + def func_rot13(self, encode_type, source_text): + d = {chr(i + c): chr((i + 13) % 26 + c) for i in range(26) for c in (65, 97)} + result_text = ''.join([d.get(c, c) for c in source_text]) + return [1, result_text,"Rot13"] + + def func_kaisa(self, encode_type, source_text): + + t = "" + for c in source_text: + if 'a' <= c <= 'z': # str是可以直接比较的 + t += chr(ord('a') + ((ord(c) - ord('a')) + 3) % 26) + elif 'A' <= c <= 'Z': + t += chr(ord('A') + ((ord(c) - ord('A')) + 3) % 26) + else: + t += c + result_text = t + return [1, result_text,"凯撒密码"] + + def func_peigen(self, encode_type, source_text): + CODE_TABLE = { # 培根字典 + 'aaaaa': 'a', 'aaaab': 'b', 'aaaba': 'c', 'aaabb': 'd', 'aabaa': 'e', 'aabab': 'f', 'aabba': 'g', + 'aabbb': 'h', 'abaaa': 'i', 'abaab': 'j', 'ababa': 'k', 'ababb': 'l', 'abbaa': 'm', 'abbab': 'n', + 'abbba': 'o', 'abbbb': 'p', 'baaaa': 'q', 'baaab': 'r', 'baaba': 's', 'baabb': 't', 'babaa': 'u', + 'babab': 'v', 'babba': 'w', 'babbb': 'x', 'bbaaa': 'y', 'bbaab': 'z' + } + str = source_text.lower() + listStr = '' + for i in str: + if i in CODE_TABLE.values(): + # 将键、值各化为一个列表,取出i在value的位置后根据下标找到对应的键 + listStr += list(CODE_TABLE.keys())[list(CODE_TABLE.values()).index(i)] + result_text = listStr.upper() # 大写输出 + return [1, result_text,"培根密码"] + + def func_mosi(self, encode_type, source_text): + + CODE = {'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': '--..', + '0': '-----', '1': '.----', '2': '..---', + '3': '...--', '4': '....-', '5': '.....', + '6': '-....', '7': '--...', '8': '---..', + '9': '----.', '?': '..--..', '/': '-..-.', + '()': '-.--.-', '-': '-....-', '.': '.-.-.-' + } + msg = '' + for char in source_text.upper(): + if char in CODE: + if char == ' ': + pass + else: + msg += (CODE[char.upper()] + ' ') + else: + return [0, '文本中含有不能识别的字符!',"摩斯密码"] + result_text = msg + + return [1, result_text,"摩斯密码"] + + def func_yunying(self, encode_type, source_text): + charList = [chr(i) for i in range(ord('A'), ord('Z') + 1)] + cipher = [i for i in source_text.upper()] + tmp = [] + ret = [] + for i in range(len(cipher)): + for j in range(len(charList)): + if charList[j] == cipher[i]: + tmp.append(j + 1) + for i in tmp: + res = '' + if i >= 8: + for j in range(0, int(i / 8)): + res += '8' + if i % 8 >= 4: + for j in range(0, int(i % 8 / 4)): + res += '4' + if i % 4 >= 2: + for j in range(0, int(i % 4 / 2)): + res += '2' + if i % 2 >= 1: + for j in range(0, int(i % 2 / 1)): + res += '1' + ret.append(res + '0') + result_text = ''.join(ret)[:-1] + return [1, result_text,"云影密码"] + + def func_dangpu(self, encode_type, source_text): + mapping_data = [['田'], ['由'], ['中'], ['人'], ['工'], ['大'], ['王'], ['夫'], ['井'], ['羊']] + try: + result = [] + for c in source_text: + c_list = mapping_data[int(c)] + c_index = random.randint(0, len(c_list) - 1) + result.append(c_list[c_index]) + result_text = ''.join(result) + except: + return [0, '未找到该字符串对应的中文!',"当铺密码"] + return [1, result_text,"当铺密码"] + + # def yufolunchan_v1(sellf, encode_type, source_text): + # BYTEMARK = ['冥', '奢', '梵', '呐', '俱', '哆', '怯', '諳', '罰', '侄', '缽', '皤'] + # KEY = b'XDXDtudou@KeyFansClub^_^Encode!!' + # IV = b'Potato@Key@_@=_=' + # padding = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16) + # cryptor = AES.new(KEY, AES.MODE_CBC, IV) + # result = cryptor.encrypt(padding(source_text).encode("utf-8")) + # aes_result = base64.b64encode(result).decode("utf-8") + # print(aes_result) + # truth_table = [ + # '东', '殺', '諦', '曰', '至', '住', '藥', '忧', '蒙', '迦', '焰', '度', '謹', '妙', '智', '皂', + # '药', '經', '牟', '麼', '在', '孝', '界', '诵', '婦', '弟', '蘇', '竟', '德', '粟', '路', '茶', + # '栗', '特', '孤', '排', '西', '经', '慈', '行', '游', '訶', '難', '六', '精', '未', '輸', '楞', + # '去', '寂', '盧', '过', '故', '金', '安', '羅', '參', '吼', '橋', '央', '即', '曳', '消', '閦', + # '倒', '造', '稳', '戒', '藐', '親', '數', '普', '中', '朋', '释', '闍', '解', '夢', '鄉', '五', + # '诸', '守', '刚', '彌', '名', '陰', '足', '劫', '帝', '清', '勒', '時', '伊', '求', '戏', '功', + # '月', '除', '便', '贤', '宗', '灯', '夫', '者', '毒', '敬', '憐', '室', '号', '信', '姪', '灭', + # '以', '通', '方', '遮', '穆', '亿', '百', '昼', '睦', '貧', '殊', '说', '積', '高', '利', '沙', + # '僧', '奉', '花', '遠', '他', '亦', '孕', '心', '資', '福', '璃', '毘', '矜', '夷', '惜', '顛', + # '藝', '文', '急', '恤', '令', '阿', '放', '涅', '和', '告', '老', '怖', '山', '尼', '舍', '孫', + # '濟', '琉', '雙', '进', '廣', '想', '施', '師', '礙', '多', '休', '逝', '印', '愛', '友', '薩', + # '先', '槃', '持', '提', '真', '乾', '幽', '此', '尊', '重', '究', '三', '兄', '北', '陵', '瑟', + # '树', '紛', '哈', '善', '捐', '须', '胜', '隸', '困', '依', '創', '陀', '修', '万', '捨', '族', + # '来', '死', '根', '實', '夜', '拔', '首', '虚', '量', '呼', '师', '耨', '祖', '豆', '下', '各', + # '寡', '息', '知', '于', '千', '醯', '殿', '定', '禮', '如', '廟', '王', '数', '宇', '众', '恐', + # '盡', '能', '七', '寫', '弥', '宝', '梭', '害', '生', '及', '开', '空', '教', '念', '凉', '护', + # '色', '命', '乖', '岚', + # ] + # alpha_dict = { + # '+': 0, '/': 4, '0': 8, '1': 12, '2': 16, '3': 20, '4': 24, '5': 28, + # '6': 32, '7': 36, '8': 40, '9': 44, 'A': 48, 'B': 52, 'C': 56, 'D': 60, + # 'E': 64, 'F': 68, 'G': 72, 'H': 76, 'I': 80, 'J': 84, 'K': 88, 'L': 92, + # 'M': 96, 'N': 100, 'O': 104, 'P': 108, 'Q': 112, 'R': 116, 'S': 120, 'T': 124, + # 'U': 128, 'V': 132, 'W': 136, 'X': 140, 'Y': 144, 'Z': 148, 'a': 152, 'b': 156, + # 'c': 160, 'd': 164, 'e': 168, 'f': 172, 'g': 176, 'h': 180, 'i': 184, 'j': 188, + # 'k': 192, 'l': 196, 'm': 200, 'n': 204, 'o': 208, 'p': 212, 'q': 216, 'r': 220, + # 's': 224, 't': 228, 'u': 232, 'v': 236, 'w': 240, 'x': 244, 'y': 248, 'z': 252, + # '=': 256, + # } + # + # newstr = '' + # li = list() + # for i in range(len(aes_result)): + # li.append(alpha_dict[aes_result[i]]) + # for i in range(len(li)): + # li[i] += (i % 4) + # for i in range(len(li)): + # newstr += truth_table[li[i]] + # return newstr + # return msg + + def func_yufolunchan_v2(sellf, encode_type, source_text, key): + + text = source_text.strip().lower() + if len(key) < 1: + key = "qianxiao996" + f = open('./module/yufoluntan_main.js', 'r') + jsf_code = f.read() + js = execjs.get() + # print(jsf_code) + # print "Using Engine %s" % js.name + jsf_int = js.compile(jsf_code) + return_text = jsf_int.call("aes_encrypt", text, key) + # foYue = {"啰": "e", "羯": "E", "婆": "t", "提": "T", "摩": "a", "埵": "A", "诃": "o", "迦": "O", "耶": "i", "吉": "I", + # "娑": "n", + # "佛": "N", "夜": "s", "驮": "S", "那": "h", "谨": "H", "悉": "r", "墀": "R", "阿": "d", "呼": "D", "萨": "l", + # "尼": "L", + # "陀": "c", "唵": "C", "唎": "u", "伊": "U", "卢": "m", "喝": "M", "帝": "w", "烁": "W", "醯": "f", "蒙": "F", + # "罚": "g", + # "沙": "G", "嚧": "y", "他": "Y", "南": "p", "豆": "P", "无": "b", "孕": "B", "菩": "v", "伽": "V", "怛": "k", + # "俱": "K", + # "哆": "j", "度": "J", "皤": "x", "阇": "X", "室": "q", "地": "Q", "利": "z", "遮": "Z", "穆": "0", "参": "1", + # "舍": "2", + # "苏": "3", "钵": "4", "曳": "5", "数": "6", "写": "7", "栗": "8", "楞": "9", "咩": "+", "输": "/", "漫": "=", + # "e": "啰", + # "E": "羯", "t": "婆", "T": "提", "a": "摩", "A": "埵", "o": "诃", "O": "迦", "i": "耶", "I": "吉", "n": "娑", + # "N": "佛", + # "s": "夜", "S": "驮", "h": "那", "H": "谨", "r": "悉", "R": "墀", "d": "阿", "D": "呼", "l": "萨", "L": "尼", + # "c": "陀", + # "C": "唵", "u": "唎", "U": "伊", "m": "卢", "M": "喝", "w": "帝", "W": "烁", "f": "醯", "F": "蒙", "g": "罚", + # "G": "沙", + # "y": "嚧", "Y": "他", "p": "南", "P": "豆", "b": "无", "B": "孕", "v": "菩", "V": "伽", "k": "怛", "K": "俱", + # "j": "哆", + # "J": "度", "x": "皤", "X": "阇", "q": "室", "Q": "地", "z": "利", "Z": "遮", "0": "穆", "1": "参", "2": "舍", + # "3": "苏", + # "4": "钵", "5": "曳", "6": "数", "7": "写", "8": "栗", "9": "楞", "+": "咩", "/": "输", "=": "漫"} + CODE = {"e": "啰", "E": "羯", "t": "婆", "T": "提", + "a": "摩", "A": "埵", "o": "诃", "O": "迦", + "i": "耶", "I": "吉", "n": "娑", "N": "佛", + "s": "夜", "S": "驮", "h": "那", "H": "谨", + "r": "悉", "R": "墀", "d": "阿", "D": "呼", + "l": "萨", "L": "尼", "c": "陀", "C": "唵", + "u": "唎", "U": "伊", "m": "卢", "M": "喝", + "w": "帝", "W": "烁", "f": "醯", "F": "蒙", + "g": "罚", "G": "沙", "y": "嚧", "Y": "他", "p": "南", + "P": "豆", "b": "无", "B": "孕", "v": "菩", + "V": "伽", "k": "怛", "K": "俱", "j": "哆", + "J": "度", "x": "皤", "X": "阇", "q": "室", + "Q": "地", "z": "利", "Z": "遮", "0": "穆", + "1": "参", "2": "舍", "3": "苏", "4": "钵", + "5": "曳", "6": "数", "7": "写", "8": "栗", + "9": "楞", "+": "咩", "/": "输", "=": "漫", + } + msg = '' + for char in return_text: + if char in CODE: + if char == ' ': + pass + else: + msg += (CODE[char]) + else: + return [0, '文本中含有不能识别的字符!',"与佛论禅2.0"] + # result_text = msg + # print(msg) + return [1,"佛又曰:" + msg,"与佛论禅2.0"] + + def func_atbash(self, encode_type, source_text): + str1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + str2 = "zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA" + result_text = "" + for s in source_text: + if s in str1: + if s != ' ': + result_text = result_text + str2[str1.index(s)] + else: + result_text = result_text + ' ' + else: + return [0, "埃特巴什码只能对英文字母加密!","Atbash密码"] + return [1, result_text,"Atbash密码"] + + def func_zhalan_w(self, encode_type, source_text, n): + n = int(n) + '''加密''' + array = self.generate_w(source_text, n) + msg = [] + for row in range(n): # 将每行的字符连起来 + for col in range(len(source_text)): + if array[row][col] != '.': + msg.append(array[row][col]) + return [1, str(''.join(msg)),"栅栏密码(W型)"] + + def generate_w(self, string, n): + '''将字符排列成w型''' + array = [['.'] * len(string) for i in range(n)] # 生成初始矩阵 + row = 0 + upflag = False + for col in range(len(string)): # 在矩阵上按w型画出string + array[row][col] = string[col] + if row == n - 1: + upflag = True + if row == 0: + upflag = False + if upflag: + row -= 1 + else: + row += 1 + return array + + def func_vigenere(self, encode_type, source_text, key): + try: + text = source_text.lower() + ptLen = len(text) + keyLen = len(key) + if keyLen == 0: + return [0, '请输入一个合法的key!',"维吉尼亚密码"] + quotient = ptLen // keyLen # 商 + remainder = ptLen % keyLen # 余 + out = "" + for i in range(0, quotient): + for j in range(0, keyLen): + c = int((ord(text[i * keyLen + j]) - ord('a') + ord(key[j]) - ord('a')) % 26 + ord('a')) + # global output + out += chr(c) + + for i in range(0, remainder): + c = int((ord(text[quotient * keyLen + i]) - ord('a') + ord(key[i]) - ord('a')) % 26 + ord('a')) + # global output + out += chr(c) + + if out != '': + return [1, out,"维吉尼亚密码"] + + else: + return [0, '加密失败!',"维吉尼亚密码"] + except Exception as e: + return [0,str(e),"维吉尼亚密码"] + + def func_sifang(self, encode_type, source_text, key1, key2): + try: + text = source_text.lower() + key1 = key1.upper() + key2 = key2.upper() + matrix = "ABCDEFGHIJKLMNOPRSTUVWXYZ" + pla = "abcdefghijklmnoprstuvwxyz" + key1 = '[' + key1 + "]" + key2 = '[' + key2 + "]" + key1 = ''.join(collections.OrderedDict.fromkeys(key1)) + key2 = ''.join(collections.OrderedDict.fromkeys(key2)) + matrix1 = re.sub('[\[\]]', '', key1) + re.sub(key1, '', matrix) + matrix2 = re.sub('[\[\]]', '', key2) + re.sub(key2, '', matrix) + matrix_list1 = [] + matrix_list2 = [] + pla_list = [] + for i in range(0, len(matrix1), 5): + matrix_list1.append(list(matrix1[i:i + 5])) + for i in range(0, len(matrix2), 5): + matrix_list2.append(list(matrix2[i:i + 5])) + for i in range(0, len(pla), 5): + pla_list.append(list(pla[i:i + 5])) + pla = text.replace(' ', '') + if len(pla) % 2 != 0: + pla += 'x' + cip = "" + for i in range(0, len(pla), 2): + data = pla[i:i + 2] + # 两个子母中第一个字母位置 + first = self.find_index(data[0], pla_list) + # 两个子母中第二个字母位置 + second = self.find_index(data[1], pla_list) + return_cip = "" + return_cip += matrix_list1[first[0]][second[1]] + return_cip += matrix_list2[second[0]][first[1]] + cip += return_cip + if cip != '': + return [1, cip,"四方密码"] + else: + return [0, '加密失败!',"四方密码"] + except Exception as e: + return [0, str(e),"四方密码"] + + def gcd(self, a, b): + if (a < b): + t = a + a = b + b = t + + while (0 != b): + t = a + a = b + b = t % b + return a + + def func_fangshe(self, encode_type, source_text, key1, key2): + try: + letter_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 字母表 + text = (source_text.strip()) + # print(text,key2,key1) + try: + if (0 == int(key1.isdigit()) or 0 == int(key2.isdigit())): + return [0, '输入有误! 密钥为数字!',"仿射密码"] + if (self.gcd(int(key1), 26) != 1): + return [0, '输入有误! key1和26必须互素!',"仿射密码"] + except: + return [0, '输入有误!',"仿射密码"] + else: + ciphertext = "" + for ch in text: # 遍历明文 + if ch.isalpha(): # 明文是否为字母,如果是,则判断大小写,分别进行加密 + if ch.isupper(): + ciphertext += letter_list[(int(key1) * (ord(ch) - 65) + int(key2)) % 26] + else: + ciphertext += letter_list[(int(key1) * (ord(ch) - 97) + int(key2)) % 26].lower() + else: # 如果密文不为字母,直接添加到密文字符串里 + ciphertext += ch + return [1, ciphertext,"仿射密码"] + except Exception as e: + return [0, str(e),"仿射密码"] + + # 查询明文字母位置 + def find_index(self, x, pla_list): + for i in range(len(pla_list)): + for j in range(len(pla_list[i])): + if pla_list[i][j] == x: + return i, j + + def func_zhalan(self, encode_type, source_text, key): + try: + n = int(key) + ans = '' + for i in range(n): + for j in range(int(source_text.__len__() / n + 0.5)): + try: + ans += source_text[j * n + i] + except: + pass + except: + return [0, '请输入正确的分组!',"栅栏密码"] + if ans != '': + return [1, ans,"栅栏密码"] + else: + return [0, '加密失败!',"栅栏密码"] + def func_Polybius(self, encode_type, source_text): + Polybius_dic = { + 'A': '11', 'B': '12', 'C': '13', 'D': '14', 'E': '15', + 'F': '21', 'G': '22', 'H': '23', 'I': '24', 'J': '24', 'K': '25', + 'L': '31', 'M': '32', 'N': '33', 'O': '34', 'P': '35', + 'Q': '41', 'R': '42', 'S': '43', 'T': '44', 'U': '45', + 'V': '51', 'W': '52', 'X': '53', 'Y': '54', 'Z': '55' + } + result = '' + for i in source_text: + result += Polybius_dic.get(i.upper()) + return [1, result,"棋盘密码(ADFGX)"] + + def func_a1z26(self, encode_type, source_text): + str1 = string.ascii_lowercase + s = "" + for i in source_text.lower(): + s += "-{}".format(str1.index(i) + 1) + result = s[1:] + return [1, result,"A1z26密码"] diff --git a/module/func_tools.py b/module/func_tools.py new file mode 100644 index 0000000..d8bdd30 --- /dev/null +++ b/module/func_tools.py @@ -0,0 +1,70 @@ +# coding=utf-8 +import base36 +import base58 +import base62 +import base64 +import base91 +import html +import py3base92 +import urllib.parse + +import execjs +import js2py + + +class Class_Tools: + + + def func_str_chaifen(self,encode_type,source_text,length): + try: + changdu = int(length) + except: + return [0, '请输入一个数字!',"字符拆分"] + + if changdu > len(source_text): + return [0, '分割长度大于字符串长度!',"字符拆分"] + else: + text = [source_text[i:i + changdu] for i in range(0, len(source_text), changdu)] + # text = re.findall(r'.{'+str(changdu)+'}', text) + return_text = ' '.join(text) + return [1, str(return_text),"字符拆分"] + def func_str_split(self,encode_type,source_text,split_str): + text = source_text.split(split_str) + return_text = ' '.join(text) + return [1, str(return_text.strip()),"字符分割"] + + def func_str_tongji(self,encode_type,source_text): + s = '' + l = len(source_text) + for x in range(0, l): + if not source_text[x] in s: + s += source_text[x] + result = {d: 0 for d in s} + for d in source_text: + for alpha in s: + if d == alpha: + result[alpha] = result[alpha] + 1 + + result1 = sorted(result.items(), key=lambda x: x[1], reverse=True) + return_text = '大->小:\n字符:' + for x in result1: + return_text += str(x[0]) + return_text+='\n次数:' + for x in result1: + return_text += str(x[1]) + return_text += '\n\n小->大:\n字符:' + result2 = sorted(result.items(), key=lambda x: x[1], reverse=False) + for x in result2: + return_text += str(x[0]) + result2 = sorted(result.items(), key=lambda x: x[1], reverse=False) + return_text+='\n次数:' + for x in result2: + return_text += str(x[1]) + return_text += '\n\n' + for x in result1: + return_text += x[0] + ":" + str(x[1]) + '\n' + return [1, return_text,"字符统计"] + + def func_str_re(self,encode_type,source_text): + text = source_text.strip() + return [1, str(text[::-1]),"字符替换"] diff --git a/module/jjdecode.py b/module/jjdecode.py new file mode 100644 index 0000000..98d8244 --- /dev/null +++ b/module/jjdecode.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python +# +# Python version of the jjdecode function written by Syed Zainudeen +# http://csc.cs.utm.my/syed/images/files/jjdecode/jjdecode.html +# +# +NCR/CRC! [ReVeRsEr] - crackinglandia@gmail.com +# Thanks to Jose Miguel Esparza (@EternalTodo) for the final push to make it work! +# +#result = JJDecoder(cryptostr) + + +import re + +class JJDecoder(object): + + def __init__(self, jj_encoded_data): + self.encoded_str = jj_encoded_data + + + def clean(self): + return re.sub('^\s+|\s+$', '', self.encoded_str) + + + def checkPalindrome(self, Str): + startpos = -1 + endpos = -1 + gv, gvl = -1, -1 + + index = Str.find('"\'\\"+\'+",') + + if index == 0: + startpos = Str.find('$$+"\\""+') + 8 + endpos = Str.find('"\\"")())()') + gv = Str[Str.find('"\'\\"+\'+",')+9:Str.find('=~[]')] + gvl = len(gv) + else: + gv = Str[0:Str.find('=')] + gvl = len(gv) + startpos = Str.find('"\\""+') + 5 + endpos = Str.find('"\\"")())()') + + return (startpos, endpos, gv, gvl) + + + def decode(self): + + self.encoded_str = self.clean() + startpos, endpos, gv, gvl = self.checkPalindrome(self.encoded_str) + + if startpos == endpos: + raise Exception('No data!') + + data = self.encoded_str[startpos:endpos] + + b = ['___+', '__$+', '_$_+', '_$$+', '$__+', '$_$+', '$$_+', '$$$+', '$___+', '$__$+', '$_$_+', '$_$$+', '$$__+', '$$_$+', '$$$_+', '$$$$+'] + + str_l = '(![]+"")[' + gv + '._$_]+' + str_o = gv + '._$+' + str_t = gv + '.__+' + str_u = gv + '._+' + + str_hex = gv + '.' + + str_s = '"' + gvsig = gv + '.' + + str_quote = '\\\\\\"' + str_slash = '\\\\\\\\' + + str_lower = '\\\\"+' + str_upper = '\\\\"+' + gv + '._+' + + str_end = '"+' + + out = '' + while data != '': + # l o t u + if data.find(str_l) == 0: + data = data[len(str_l):] + out += 'l' + continue + elif data.find(str_o) == 0: + data = data[len(str_o):] + out += 'o' + continue + elif data.find(str_t) == 0: + data = data[len(str_t):] + out += 't' + continue + elif data.find(str_u) == 0: + data = data[len(str_u):] + out += 'u' + continue + + # 0123456789abcdef + if data.find(str_hex) == 0: + data = data[len(str_hex):] + + for i in range(len(b)): + if data.find(b[i]) == 0: + data = data[len(b[i]):] + out += '%x' % i + break + continue + + # start of s block + if data.find(str_s) == 0: + data = data[len(str_s):] + + # check if "R + if data.find(str_upper) == 0: # r4 n >= 128 + data = data[len(str_upper):] # skip sig + ch_str = '' + for i in range(2): # shouldn't be more than 2 hex chars + # gv + "."+b[ c ] + if data.find(gvsig) == 0: + data = data[len(gvsig):] + for k in range(len(b)): # for every entry in b + if data.find(b[k]) == 0: + data = data[len(b[k]):] + ch_str = '%x' % k + break + else: + break + + out += chr(int(ch_str, 16)) + continue + + elif data.find(str_lower) == 0: # r3 check if "R // n < 128 + data = data[len(str_lower):] # skip sig + + ch_str = '' + ch_lotux = '' + temp = '' + b_checkR1 = 0 + for j in range(3): # shouldn't be more than 3 octal chars + if j > 1: # lotu check + if data.find(str_l) == 0: + data = data[len(str_l):] + ch_lotux = 'l' + break + elif data.find(str_o) == 0: + data = data[len(str_o):] + ch_lotux = 'o' + break + elif data.find(str_t) == 0: + data = data[len(str_t):] + ch_lotux = 't' + break + elif data.find(str_u) == 0: + data = data[len(str_u):] + ch_lotux = 'u' + break + + # gv + "."+b[ c ] + if data.find(gvsig) == 0: + temp = data[len(gvsig):] + for k in range(8): # for every entry in b octal + if temp.find(b[k]) == 0: + if int(ch_str + str(k), 8) > 128: + b_checkR1 = 1 + break + + ch_str += str(k) + data = data[len(gvsig):] # skip gvsig + data = data[len(b[k]):] + break + + if b_checkR1 == 1: + if data.find(str_hex) == 0: # 0123456789abcdef + data = data[len(str_hex):] + # check every element of hex decode string for a match + for i in range(len(b)): + if data.find(b[i]) == 0: + data = data[len(b[i]):] + ch_lotux = '%x' % i + break + break + else: + break + + out += chr(int(ch_str,8)) + ch_lotux + continue + + else: # "S ----> "SR or "S+ + # if there is, loop s until R 0r + + # if there is no matching s block, throw error + + match = 0; + n = None + + # searching for matching pure s block + while True: + n = ord(data[0]) + if data.find(str_quote) == 0: + data = data[len(str_quote):] + out += '"' + match += 1 + continue + elif data.find(str_slash) == 0: + data = data[len(str_slash):] + out += '\\' + match += 1 + continue + elif data.find(str_end) == 0: # reached end off S block ? + + if match == 0: + raise '+ no match S block: ' + data + data = data[len(str_end):] + break # step out of the while loop + elif data.find(str_upper) == 0: # r4 reached end off S block ? - check if "R n >= 128 + if match == 0: + raise 'no match S block n>128: ' + data + data = data[len(str_upper):] # skip sig + + ch_str = '' + ch_lotux = '' + + for j in range(10): # shouldn't be more than 10 hex chars + if j > 1: # lotu check + if data.find(str_l) == 0: + data = data[len(str_l):] + ch_lotux = 'l' + break + elif data.find(str_o) == 0: + data = data[len(str_o):] + ch_lotux = 'o' + break + elif data.find(str_t) == 0: + data = data[len(str_t):] + ch_lotux = 't' + break + elif data.find(str_u) == 0: + data = data[len(str_u):] + ch_lotux = 'u' + break + + # gv + "."+b[ c ] + if data.find(gvsig) == 0: + data = data[len(gvsig):] # skip gvsig + for k in range(len(b)): # for every entry in b + if data.find(b[k]) == 0: + data = data[len(b[k]):] + ch_str += '%x' % k + break + else: + break # done + out += chr(int(ch_str, 16)) + break # step out of the while loop + elif data.find(str_lower) == 0: # r3 check if "R // n < 128 + if match == 0: + raise 'no match S block n<128: ' + data + + data = data[len(str_lower):] # skip sig + + ch_str = '' + ch_lotux = '' + temp = '' + b_checkR1 = 0 + + for j in range(3): # shouldn't be more than 3 octal chars + if j > 1: # lotu check + if data.find(str_l) == 0: + data = data[len(str_l):] + ch_lotux = 'l' + break + elif data.find(str_o) == 0: + data = data[len(str_o):] + ch_lotux = 'o' + break + elif data.find(str_t) == 0: + data = data[len(str_t):] + ch_lotux = 't' + break + elif data.find(str_u) == 0: + data = data[len(str_u):] + ch_lotux = 'u' + break + + # gv + "."+b[ c ] + if data.find(gvsig) == 0: + temp = data[len(gvsig):] + for k in range(8): # for every entry in b octal + if temp.find(b[k]) == 0: + if int(ch_str + str(k), 8) > 128: + b_checkR1 = 1 + break + + ch_str += str(k) + data = data[len(gvsig):] # skip gvsig + data = data[len(b[k]):] + break + + if b_checkR1 == 1: + if data.find(str_hex) == 0: # 0123456789abcdef + data = data[len(str_hex):] + # check every element of hex decode string for a match + for i in range(len(b)): + if data.find(b[i]) == 0: + data = data[len(b[i]):] + ch_lotux = '%x' % i + break + else: + break + out += chr(int(ch_str, 8)) + ch_lotux + break # step out of the while loop + elif (0x21 <= n and n <= 0x2f) or (0x3A <= n and n <= 0x40) or ( 0x5b <= n and n <= 0x60 ) or ( 0x7b <= n and n <= 0x7f ): + out += data[0] + data = data[1:] + match += 1 + continue + print('No match : ' + data) + break + return out \ No newline at end of file diff --git a/module/jjencode.py b/module/jjencode.py new file mode 100644 index 0000000..46f1f53 --- /dev/null +++ b/module/jjencode.py @@ -0,0 +1,123 @@ +# Python port of the Javascript function written by Yosuke HASEGAWA (@hasegawayosuke) +# http://utf-8.jp/public/jjencode.html +# result = (JJEncoder(cryptostr).encoded_text).encode() +# +__author__ = 'nriva' + +import re +from struct import unpack + +class JJEncoder(object): + + def __init__(self, text, var_name = "$", palindrome = False): + if text: + self.encoded_text = self.__encode(var_name, text) + + if palindrome: + self.encoded_text = re.split("[,;]$", self.encoded_text)[0] + self.encoded_text = """\"\'\\\"+\'+\",""" + self.encoded_text + "".join(list(self.encoded_text)[::-1]) + + def __encode(self, gv, text): + r = "" + n = None + t = None + b = [ "___", "__$", "_$_", "_$$", "$__", "$_$", "$$_", "$$$", "$___", "$__$", "$_$_", "$_$$", "$$__", "$$_$", "$$$_", "$$$$"] + s = "" + + for i in range(len(text)): + n = ord(text[i]) + if (n == 0x22 or n == 0x5c): + s += "\\\\\\" + chr(unpack("b", text[i])[0]) + elif ((0x21 <= n and n <= 0x2f) or (0x3A <= n and n <= 0x40) or ( 0x5b <= n and n <= 0x60 ) or ( 0x7b <= n and n <= 0x7f)): + s += text[i] + + elif ((0x30 <= n and n <= 0x39) or (0x61 <= n and n <= 0x66)): + if s: + r += '"' + s + '"+' + + if n < 0x40: + tmp_index = n - 0x30 + else: + tmp_index = n - 0x57 + + r += gv + "." + b[ tmp_index ] + "+" + s = "" + + elif n == 0x6c: # 'l' + if s: + r += '"' + s + '"+' + + r += '(![]+"")[' + gv + '._$_]+' + s = "" + + elif n == 0x6f: # 'o' + if s: + r += '"' + s + '"+' + + r += gv + "._$+" + s = "" + elif n == 0x74: # 'u' + if s: + r += '"' + s + '"+' + + r += gv + ".__+" + s = "" + elif n == 0x75: # 'u' + if s: + r += '"' + s + '"+' + + r += gv + "._+" + s = "" + elif n < 128: + if s: + r += '"' + s + else: + r += '"' + + r += '\\\\"+' + "".join([self.__f(gv, b, i) for i in [int(x) for x in re.findall("[0-7]", oct(n))[1:]]]) + s = "" + else: + if s: + r += '"' + s + else: + r += '"' + + r += '\\\\"+' + gv + "._+" + "".join([self.__g(gv, b, i) for i in [int(x) for x in re.findall("[0-9a-f]", oct(n), re.I)[1:]]]) + s = "" + + if s: + r += '"' + s + '"+' + + r = (gv + "=~[];" + + gv + "={___:++" + gv +',$$$$:(![]+"")['+gv+"],__$:++"+gv+',$_$_:(![]+"")['+gv+"],_$_:++"+ + gv+',$_$$:({}+"")['+gv+"],$$_$:("+gv+"["+gv+"""]+"")["""+gv+"],_$$:++"+gv+',$$$_:(!""+"")['+ + gv+"],$__:++"+gv+",$_$:++"+gv+',$$__:({}+"")['+gv+"],$$_:++"+gv+",$$$:++"+gv+",$___:++"+gv+",$__$:++"+gv+"};"+ + gv+".$_="+ + "("+gv+".$_="+gv+'+"")['+gv+".$_$]+"+ + "("+gv+"._$="+gv+".$_["+gv+".__$])+"+ + "("+gv+".$$=("+gv+'.$+"")['+gv+".__$])+"+ + "((!"+gv+')+"")['+gv+"._$$]+"+ + "("+gv+".__="+gv+".$_["+gv+".$$_])+"+ + "("+gv+'.$=(!""+"")['+gv+".__$])+"+ + "("+gv+'._=(!""+"")['+gv+"._$_])+"+ + gv+".$_["+gv+".$_$]+"+ + gv+".__+"+ + gv+"._$+"+ + gv+".$;"+ + gv+".$$="+ + gv+".$+"+ + '(!""+"")['+gv+"._$$]+"+ + gv+".__+"+ + gv+"._+"+ + gv+".$+"+ + gv+".$$;"+ + gv+".$=("+gv+".___)["+gv+".$_]["+gv+".$_];"+ + gv+".$("+gv+".$("+gv+'.$$+"\\""+' + r + '"\\"")())();') + + return r + + def __f(self, a, b, c): + return a + "." + b[c] + "+" + + def __g(self, a, b, c): + return a + "." + b[int(c, 16)] + "+" \ No newline at end of file diff --git a/module/jother.py b/module/jother.py new file mode 100644 index 0000000..8b9c7e1 --- /dev/null +++ b/module/jother.py @@ -0,0 +1,142 @@ +# python3 +# Jother Encode +# +# a = Jother() +# b =a.toStr("abcd") +# c = a.toScript("abcd") + +class Jother(): + def __init__(self): + self.base = [ + "[]", + "{}", + "![]", + "!![]", + "~[]", + "+{}", + "{}[[]]" + ] + self.nums = [ + "+[]", + "+!![]", + "!![]+!![]", + "!![]+!![]+!![]", + "!![]+!![]+!![]+!![]", + "!![]+!![]+!![]+!![]+!![]", + "!![]+!![]+!![]+!![]+!![]+!![]", + "!![]+!![]+!![]+!![]+!![]+!![]+!![]", + "!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]", + "!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]" + ] + + self.base.append(self.q1(self.q3(self.nums[1]+self.q4(self.q1(self.base[3])+self.q2(self.nums[3])) + + self.q3(self.nums[1])+self.q3(self.nums[0])+self.q3(self.nums[0])+self.q3(self.nums[0])))) + self.chars = { + "0": self.q1(self.nums[0]), + "1": self.q1(self.nums[1]), + "2": self.q1(self.nums[2]), + "3": self.q1(self.nums[3]), + "4": self.q1(self.nums[4]), + "5": self.q1(self.nums[5]), + "6": self.q1(self.nums[6]), + "7": self.q1(self.nums[7]), + "8": self.q1(self.nums[8]), + "9": self.q1(self.nums[9]), + "a": self.q1(self.base[2])+self.q2(self.nums[1]), + "b": self.q1(self.base[1])+self.q2(self.nums[2]), + "c": self.q1(self.base[1])+self.q2(self.nums[5]), + "d": self.q1(self.base[6])+self.q2(self.nums[2]), + "e": self.q1(self.base[3])+self.q2(self.nums[3]), + "f": self.q1(self.base[2])+self.q2(self.nums[0]), + "i": self.q1(self.base[6])+self.q2(self.nums[5]), + "j": self.q1(self.base[1])+self.q2(self.nums[3]), + "l": self.q1(self.base[2])+self.q2(self.nums[2]), + "n": self.q1(self.base[6])+self.q2(self.nums[1]), + "o": self.q1(self.base[1])+self.q2(self.nums[1]), + "r": self.q1(self.base[3])+self.q2(self.nums[1]), + "s": self.q1(self.base[2])+self.q2(self.nums[3]), + "t": self.q1(self.base[3])+self.q2(self.nums[0]), + "u": self.q1(self.base[6])+self.q2(self.nums[0]), + "y": self.q1(self.base[7])+self.q2(self.nums[7]), + "I": self.q1(self.base[7])+self.q2(self.nums[0]), + "N": self.q1(self.base[5])+self.q2(self.nums[0]), + "O": self.q1(self.base[1])+self.q2(self.nums[8]), + " ": self.q1(self.base[1])+self.q2(self.nums[7]), + "[": self.q1(self.base[1])+self.q2(self.nums[0]), + "]": self.q1(self.base[1])+self.q2(self.nums[7]+self.q4(self.nums[7])), + "-": self.q1(self.base[4])+self.q2(self.nums[0]), + "+": self.q1(self.q3(self.nums[1]+self.q4(self.q1(self.base[3])+self.q2(self.nums[3]))+self.q3(self.nums[1])+self.q3(self.nums[0])+self.q3(self.nums[0])))+self.q2(self.nums[2]) + } + self.f = "[]["+self.toStr("sort")+"]["+self.toStr("constructor")+"]" + self.localstr = "[]+"+self.toScript("return location") + self.chars["h"] = self.q5(self.localstr)+self.q2(self.nums[0]) + self.chars["p"] = self.q5(self.localstr)+self.q2(self.nums[3]) + self.chars[":"] = self.q5(self.localstr)+self.q2(self.nums[4]) + self.chars["/"] = self.q5(self.localstr)+self.q2(self.nums[6]) + self.rc_unescape = self.toScript("return unescape") + self.rc_escape = self.toScript("return escape") + self.chars["%"] = self.rc_escape + \ + "("+self.toStr("[")+")"+self.q2(self.nums[0]) + + def q1(self, s): + return "("+s+"+[])" + + def q2(self, s): + return "["+s+"]" + + def q3(self, s): + return "+("+s+"+[])" + + def q4(self, s): + return "+"+s + + def q5(self, s): + return "("+s+")" + + def toScript(self, script): + return self.f+"("+self.toStr(script)+")()" + + def toUnescape(self, charCode): + return self.rc_unescape + "(" + self.toStr("%" + self.toHex(charCode, 2)) + ")" + + def toHexs(self, charCode): + return self.toStr("\\x" + self.toHex(charCode, 2)) + + def toUnicode(self, charCode): + return self.toStr("\\u" + self.toHex(charCode, 4)) + + def toHex(self, num, d): + hexs = num.self.toString(16) + while(len(hexs) < d): + hexs = "0{}".format(hexs) + return hexs + + def toChar(self, char): + charCode = ord(char) + if self.chars[char] != '': + return self.chars[char] + if char == "\\" or char == "x": + self.chars[char] = self.toUnescape(charCode) + return self.chars[char] + + unis = self.toUnicode(charCode) + if charCode < 128: + unes = self.toUnescape(charCode) + if len(unis) > len(unes): + unis = unes + hexs = self.toHexs(charCode) + if len(unis) > len(hexs): + unis = hexs + self.chars[char] = unis + return unis + + def toStr(self, str): + s = '' + for i in range(len(str)): + if i == 0: + s += '' + else: + s += "+" + s += self.toChar(str[i]) + return s + \ No newline at end of file diff --git a/module/yufoluntan_main.js b/module/yufoluntan_main.js new file mode 100644 index 0000000..6e709aa --- /dev/null +++ b/module/yufoluntan_main.js @@ -0,0 +1,202 @@ +// JavaScript Documen +const CryptoJS = require('./module/crypto-js.min') +// import CryptoJS from "./crypto-js.min.js"; +String.prototype.replaceAll = function (s1, s2) { + var reg = new RegExp(s1, "g"); + return this.replace(reg, s2); +} +function aes_encrypt(msg,key) { + + var str = CryptoJS.AES.encrypt(msg, key).toString(); + // console.log(str) + str = str.substring(10); + return str + +} +function encrypt() { + var msg = $("#text-decryped").val(); + var key = $("#text-key").val(); + + if (msg.length < 1) { + $("#error-alert").show(); + $("#copy-alert").hide(); + $("#error-alert").text("�����ߣ����������٣��಻�ɶɡ�������������ܵ����ģ�"); + } else { + if (key.length < 1) { + key = password; + } + + $("#text-encryped").val(togod(msg, key)); + $("#error-alert").hide(); + $("#copy-alert").hide(); + } + +} +function aes_decrypto(msg,key) { + return CryptoJS.AES.decrypt("U2FsdGVkX1" + msg, key).toString(CryptoJS.enc.Utf8); +} +function decrypt(msg,key) { + + if (msg.length < 1) { + return "�����ߣ����������٣��಻�ɶɡ�������������ܵ����ģ�"; + } else { + if (msg.substring(0, 4) !== "����Ի��" || msg.substring(0, 3) !== "����Ի��" ) { + return "ʩ�������ǵô�Ϊ�θ�ɮ���ԣ������Ƿ����ȷ��������Դ����վ���������ԡ���Ի�����򡰷���Ի������ͷ����"; + } else { + try { + var str = toman(msg, key); + } catch (err) { + return "ʩ�������ǵô�Ϊ�θ�ɮ���ԣ�������������ȷ����Կ��ȷ��δ���۸ģ�"; + } finally { + } + return str + } + } +} + + + +function togod(msg, key) { + var str = CryptoJS.AES.encrypt(msg, key).toString(); + // console.log(str) + str = str.substring(10); + + str = str.replaceAll("e", "��"); + str = str.replaceAll("E", "��"); + str = str.replaceAll("t", "��"); + str = str.replaceAll("T", "��"); + str = str.replaceAll("a", "Ħ"); + str = str.replaceAll("A", "��"); + str = str.replaceAll("o", "ڭ"); + str = str.replaceAll("O", "��"); + str = str.replaceAll("i", "Ү"); + str = str.replaceAll("I", "��"); + str = str.replaceAll("n", "�"); + str = str.replaceAll("N", "��"); + str = str.replaceAll("s", "ҹ"); + str = str.replaceAll("S", "��"); + str = str.replaceAll("h", "��"); + str = str.replaceAll("H", "��"); + str = str.replaceAll("r", "Ϥ"); + str = str.replaceAll("R", "ܯ"); + str = str.replaceAll("d", "��"); + str = str.replaceAll("D", "��"); + str = str.replaceAll("l", "��"); + str = str.replaceAll("L", "��"); + str = str.replaceAll("c", "��"); + str = str.replaceAll("C", "��"); + str = str.replaceAll("u", "�o"); + str = str.replaceAll("U", "��"); + str = str.replaceAll("m", "¬"); + str = str.replaceAll("M", "��"); + str = str.replaceAll("w", "��"); + str = str.replaceAll("W", "˸"); + str = str.replaceAll("f", "��"); + str = str.replaceAll("F", "��"); + str = str.replaceAll("g", "��"); + str = str.replaceAll("G", "ɳ"); + str = str.replaceAll("y", "��"); + str = str.replaceAll("Y", "��"); + str = str.replaceAll("p", "��"); + str = str.replaceAll("P", "��"); + str = str.replaceAll("b", "��"); + str = str.replaceAll("B", "��"); + str = str.replaceAll("v", "��"); + str = str.replaceAll("V", "٤"); + str = str.replaceAll("k", "��"); + str = str.replaceAll("K", "��"); + str = str.replaceAll("j", "��"); + str = str.replaceAll("J", "��"); + str = str.replaceAll("x", "�"); + str = str.replaceAll("X", "�^"); + str = str.replaceAll("q", "��"); + str = str.replaceAll("Q", "��"); + str = str.replaceAll("z", "��"); + str = str.replaceAll("Z", "��"); + str = str.replaceAll("0", "��"); + str = str.replaceAll("1", "��"); + str = str.replaceAll("2", "��"); + str = str.replaceAll("3", "��"); + str = str.replaceAll("4", "��"); + str = str.replaceAll("5", "ҷ"); + str = str.replaceAll("6", "��"); + str = str.replaceAll("7", "д"); + str = str.replaceAll("8", "��"); + str = str.replaceAll("9", "��"); + str = str.replaceAll("\\+", "��"); + str = str.replaceAll("/", "��"); + str = str.replaceAll("=", "��"); + return "��Ի��" + str; +} + +function toman(msg, key) { + + str = msg.substring(4); + str = str.replaceAll("��", "e"); + str = str.replaceAll("��", "E"); + str = str.replaceAll("��", "t"); + str = str.replaceAll("��", "T"); + str = str.replaceAll("Ħ", "a"); + str = str.replaceAll("��", "A"); + str = str.replaceAll("ڭ", "o"); + str = str.replaceAll("��", "O"); + str = str.replaceAll("Ү", "i"); + str = str.replaceAll("��", "I"); + str = str.replaceAll("�", "n"); + str = str.replaceAll("��", "N"); + str = str.replaceAll("ҹ", "s"); + str = str.replaceAll("��", "S"); + str = str.replaceAll("��", "h"); + str = str.replaceAll("��", "H"); + str = str.replaceAll("Ϥ", "r"); + str = str.replaceAll("ܯ", "R"); + str = str.replaceAll("��", "d"); + str = str.replaceAll("��", "D"); + str = str.replaceAll("��", "l"); + str = str.replaceAll("��", "L"); + str = str.replaceAll("��", "c"); + str = str.replaceAll("��", "C"); + str = str.replaceAll("�o", "u"); + str = str.replaceAll("��", "U"); + str = str.replaceAll("¬", "m"); + str = str.replaceAll("��", "M"); + str = str.replaceAll("��", "w"); + str = str.replaceAll("˸", "W"); + str = str.replaceAll("��", "f"); + str = str.replaceAll("��", "F"); + str = str.replaceAll("��", "g"); + str = str.replaceAll("ɳ", "G"); + str = str.replaceAll("��", "y"); + str = str.replaceAll("��", "Y"); + str = str.replaceAll("��", "p"); + str = str.replaceAll("��", "P"); + str = str.replaceAll("��", "b"); + str = str.replaceAll("��", "B"); + str = str.replaceAll("��", "v"); + str = str.replaceAll("٤", "V"); + str = str.replaceAll("��", "k"); + str = str.replaceAll("��", "K"); + str = str.replaceAll("��", "j"); + str = str.replaceAll("��", "J"); + str = str.replaceAll("�", "x"); + str = str.replaceAll("�^", "X"); + str = str.replaceAll("��", "q"); + str = str.replaceAll("��", "Q"); + str = str.replaceAll("��", "z"); + str = str.replaceAll("��", "Z"); + str = str.replaceAll("��", "0"); + str = str.replaceAll("��", "1"); + str = str.replaceAll("��", "2"); + str = str.replaceAll("��", "3"); + str = str.replaceAll("��", "4"); + str = str.replaceAll("ҷ", "5"); + str = str.replaceAll("��", "6"); + str = str.replaceAll("д", "7"); + str = str.replaceAll("��", "8"); + str = str.replaceAll("��", "9"); + str = str.replaceAll("��", "+"); + str = str.replaceAll("��", "/"); + str = str.replaceAll("��", "="); + return CryptoJS.AES.decrypt("U2FsdGVkX1" + str, key).toString(CryptoJS.enc.Utf8); +} +