diff --git a/gui.py b/gui.py new file mode 100644 index 0000000..313b8cc --- /dev/null +++ b/gui.py @@ -0,0 +1,305 @@ +import PySimpleGUI as sg +from padding_oracle_demo import po_main +import time # 引入time模块 +import AES_CBC as CBC +import AES_CFB as CFB +import AES_CTR as CTR +import AES_ECB as ECB +import AES_OFB as OFB +import time + +# 密钥设置,请设置为16.24.32 +ENCKEY = '' +user_get_enc = '' + + +# 定义窗口 +def PO_attack(): + layout = [ + [sg.T('密文填塞攻击')], + [sg.T('正常用户:')], + [sg.Text('请输入需要加密的明文 :'), sg.InputText('', size=(32, 1), key='-user_mw-')], + [sg.Text('请输入使用的密钥 :'), sg.InputText('', size=(32, 1), key='-user_key-')], + [sg.Text('请输入使用的IV :'), sg.InputText('', size=(32, 1), key='-user_iv-')], + [sg.Button('开始加密', key='-user_start-')], + [sg.Text('加密密文:')], + [sg.Output(size=(80, 2), key='-user_enc-', echo_stdout_stderr=True)], + # [sg.Output(size=(100, 5))], + [sg.Text('')], + [sg.T('攻击者:')], + [sg.Text('请输入需要攻击的密文 :')], + [sg.Multiline('', size=(80, 2), key='-attacker_enc-')], + [sg.Text('请输入需要攻击的IV :'), sg.InputText('', size=(32, 1), key='-attacker_iv-')], + [sg.Text('请输入需要加密的明文 :'), sg.InputText('', size=(32, 1), key='-attacker_mw-')], + [sg.Button('开始攻击', key='-attacker_start-')], + [sg.Output(size=(80, 3), key='-attacker_output-', echo_stdout_stderr=True)], + [sg.Text('')] + ] + return sg.Window('密文填塞攻击攻击', layout) + + +class GUI: + # 主窗口 + def __init__(self): + sg.theme('DefaultNoMoreNagging') + list1 = ['ECB模式', 'CBC模式', 'CFB模式', 'OFB模式', 'CTR模式'] + list2 = ['加密', '解密'] + layout = [ + [sg.Text('请选择加密/解密'), sg.Combo(list2, key='-crypt-', size=5, enable_events=True)], + [sg.Text('请输入密钥'), sg.InputText('', key='-key_text-')], + + [sg.FileBrowse('选择文件', target='-FilePath-', file_types=(('ALL Files', '*.txt'),)), + sg.InputText('', size=(100, 1), key='-FilePath-')], + + [sg.Button('开始执行加密/解密', size=(50, 2), key='-start-')], + [sg.Text('采用ECB模式'), sg.Text('', size=5, key='-ECBkey-', border_width=1, relief='ridge'), sg.Text('的结果是:'), + sg.InputText('', key='-ECB-'), sg.T('用时:'), sg.InputText('', key='ECBtime', )], + [sg.Text('采用CBC模式'), sg.Text('', size=5, border_width=1, relief='ridge', key='-CBCkey-'), sg.Text('的结果是:'), + sg.InputText('', key='-CBC-'), sg.T('用时:'), sg.InputText('', key='CBCtime')], + [sg.Text('采用CFB模式'), sg.Text('', size=5, border_width=1, relief='ridge', key='-CFBkey-'), sg.Text('的结果是:'), + sg.InputText('', key='-CFB-'), sg.T('用时:'), sg.InputText('', key='CFBtime')], + [sg.Text('采用OFB模式'), sg.Text('', size=5, border_width=1, relief='ridge', key='-OFBkey-'), sg.Text('的结果是:'), + sg.InputText('', key='-OFB-'), sg.T('用时:'), sg.InputText('', key='OFBtime')], + [sg.Text('采用CTR模式'), sg.Text('', size=5, border_width=1, relief='ridge', key='-CTRkey-'), sg.Text('的结果是:'), + sg.InputText('', key='-CTR-'), sg.T('用时:'), sg.InputText('', key='CTRtime')], + [sg.Button('Padding_Oracle_Attack', size=(50, 1), key='-PO_Attack-')] + ] + self.window = sg.Window('AES', layout, size=(1200, 500), element_padding=(5, 10), font='宋体', grab_anywhere=True, + resizable=True, element_justification='left') + + # 事件 + def run(self): + while True: + event, values = self.window.read() + print(event) + if event == None: + break + + elif event == '-crypt-': + print('加密模式') + self.window['-ECBkey-'].update(values['-crypt-']) + self.window['-CBCkey-'].update(values['-crypt-']) + self.window['-CFBkey-'].update(values['-crypt-']) + self.window['-OFBkey-'].update(values['-crypt-']) + self.window['-CTRkey-'].update(values['-crypt-']) + print('111') + + elif event == '-start-': + + print("开始执行") + + with open(values['-FilePath-'], 'r', encoding='utf-8') as fp: + + M = fp.read() + + print(M) + + # 加密 + + if values['-crypt-'] == '加密': + + # CBC模式 + + cbc = CBC.aestest(values['-key_text-']) + + T1_CBC = time.time() + + for i in range(1000): + C_CBC = cbc.encrypt(M) + + T2_CBC = time.time() + + T_CBC = T2_CBC - T1_CBC # CBC加密时间 + + print(T_CBC) + # print(C_CBC) + + self.window['-CBC-'].update(C_CBC) + + self.window['CBCtime'].update(T_CBC) + + # CFB模式 + + cfb = CFB.aestest(values['-key_text-']) + + T1_CFB = time.time() + + for i in range(1000): + C_CFB = cfb.encrypt(M) + + T2_CFB = time.time() + + T_CFB = T2_CFB - T1_CFB # CFB加密时间 + + print(T_CFB) + + self.window['-CFB-'].update(C_CFB) + + self.window['CFBtime'].update(T_CFB) + + # CTR模式 + + ctr = CTR.aestest(values['-key_text-']) + + T1_CTR = time.time() + + for i in range(1000): + C_CTR = ctr.encrypt(M) + + T2_CTR = time.time() + + T_CTR = T2_CTR - T1_CTR # CTR加密时间 + + print(T_CTR) + + self.window['-CTR-'].update(C_CTR) + + self.window['CTRtime'].update(T_CTR) + + # ECB模式 + + ecb = ECB.aestest(values['-key_text-']) + + T1_ECB = time.time() + + for i in range(1000): + C_ECB = ecb.encrypt(M) + + T2_ECB = time.time() + + T_ECB = T2_ECB - T1_ECB # ECB加密时间 + + print(T_ECB) + + self.window['-ECB-'].update(C_ECB) + + self.window['ECBtime'].update(T_ECB) + + # OFB模式 + + ofb = OFB.aestest(values['-key_text-']) + + T1_OFB = time.time() + + for i in range(1000): + C_OFB = ofb.encrypt(M) + + T2_OFB = time.time() + + T_OFB = T2_OFB - T1_OFB # OFB加密时间 + + print(T_OFB) + + self.window['-OFB-'].update(C_OFB) + + self.window['OFBtime'].update(T_OFB) + + elif values['-crypt-'] == '解密': + + # CBC模式 + cbc = CBC.aestest(values['-key_text-']) + T1_CBC = time.time() + for i in range(1000): + C_CBC = cbc.decrypt(M) + + T2_CBC = time.time() + T_CBC = T2_CBC - T1_CBC # CBC解密时间 + print(T_CBC) + self.window['-CBC-'].update(C_CBC) + self.window['CBCtime'].update(T_CBC) + + # CFB模式 + cfb = CFB.aestest(values['-key_text-']) + T1_CFB = time.time() + for i in range(1000): + C_CFB = cfb.decrypt(M) + T2_CFB = time.time() + T_CFB = T2_CFB - T1_CFB # CFB解密时间 + print(T_CFB) + + self.window['-CFB-'].update(C_CFB) + self.window['CFBtime'].update(T_CFB) + + # CTR模式 + ctr = CTR.aestest(values['-key_text-']) + T1_CTR = time.time() + for i in range(1000): + C_CTR = ctr.decrypt(M) + + T2_CTR = time.time() + T_CTR = T2_CTR - T1_CTR # CTR解密时间 + print(T_CTR) + self.window['-CTR-'].update(C_CTR) + self.window['CTRtime'].update(T_CTR) + + # ECB模式 + ecb = ECB.aestest(values['-key_text-']) + T1_ECB = time.time() + for i in range(1000): + C_ECB = ecb.decrypt(M) + + T2_ECB = time.time() + T_ECB = T2_ECB - T1_ECB # ECB解密时间 + print(T_ECB) + self.window['-ECB-'].update(C_ECB) + self.window['ECBtime'].update(T_ECB) + + # OFB模式 + ofb = OFB.aestest(values['-key_text-']) + T1_OFB = time.time() + for i in range(1000): + C_OFB = ofb.decrypt(M) + + T2_OFB = time.time() + T_OFB = T2_OFB - T1_OFB # OFB解密时间 + print(T_OFB) + self.window['-OFB-'].update(C_OFB) + self.window['OFBtime'].update(T_OFB) + + elif event == '-key_text-': + print(values['-key_text-']) # 打印出密钥 + + elif event == '-PO_Attack-': + print('Padding模式') + win1 = PO_attack() + while True: + event1, value1 = win1.read() + + if event1 == '-user_start-': + print(value1['-user_mw-']) + user_mw = value1['-user_mw-'] + user_iv = value1['-user_iv-'] + ENCKEY = value1['-user_key-'].encode('utf-8') + user_enc = po_main(user_mw, user_iv, ENCKEY) + print(user_enc) + user_get_enc = user_enc + # 给攻击者使用,因为输出的是字符串包裹的bytes难以转换 + win1['-user_enc-'].update(f'正常用户密文: {user_enc}') + win1['-attacker_output-'].update('') + + if event1 == '-attacker_start-': + + try: + attacker_enc = value1['-attacker_enc-'] + print(attacker_enc) + print(type(attacker_enc), '\n') + except: + print('change failed!\n') + + attacker_enc = user_get_enc + attacker_iv = value1['-attacker_iv-'] + attacker_mw = value1['-attacker_mw-'] + attacker_user_mw, attacker_enc_mw = po_main(None, attacker_iv, ENCKEY, attacker_enc, + attacker_mw) + print(attacker_user_mw, attacker_enc_mw) + win1['-attacker_output-'].update(f'正常用户明文: {attacker_user_mw}\n攻击者生成的密文: {attacker_enc_mw}') + + elif event1 is None: + break + + self.window.close() + + +if __name__ == '__main__': + BaseW = GUI() + BaseW.run()