You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

306 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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