simplecrack / main.py
Jack698's picture
Upload folder using huggingface_hub
b3aa249 verified
import random
import gradio as gr
from ngram_score import ngram_score
def get_keydict(key_dict, current_key, original_alphabet):
for i in range(len(current_key)):
key_dict[current_key[i]] = original_alphabet[i] # 这是将当前的密文进行映射
return key_dict
def exchange(mydict, message):
message = list(message)
cnt = 0
for i in message:
if i in mydict:
message[cnt] = mydict[i]
cnt = cnt + 1
return "".join(message)
def solve_cipher(ciphertext):
S_new = ciphertext.replace(" ", "")
S_new = S_new.replace(",", "")
S_new = S_new.replace("-", "")
S_new = S_new.replace(".", "")
# 参数初始化
m_message = S_new.upper() # 这是全部改变为大写的密文
current_key = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ') # 这是当前的密文
original_alphabet = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
key_dict = dict() # 这是一个字典,用来将字母映射到上面字母表上去
fitness = ngram_score('english_quadgrams.txt')
last_score = -2 ** 31
current_max_score = -2 ** 31
generation = 0 # generation就是迭代的数量
best_plaintext = ""
while generation < 10:
# 上面是迭代最高次数,一般10以内就能出结果
generation = generation + 1
# 随机改变顺序
random.shuffle(current_key)
key_dict = get_keydict(key_dict, current_key, original_alphabet) # 获得明密文映射
last_score = fitness.score(exchange(key_dict, m_message)) # 计算适应度
count = 0
while count < 1000:
a = random.randint(0, 25)
b = random.randint(0, 25)
# 随机交换并进行比较
child_current_key = current_key[:]
child_current_key[a], child_current_key[b] = child_current_key[b], child_current_key[a]
child_key_dict = dict()
child_key_dict = get_keydict(child_key_dict, child_current_key, original_alphabet)
score = fitness.score(exchange(child_key_dict, m_message))
# 说明新的key_dict更高效
if score > last_score:
last_score = score
current_key = child_current_key
count = 0
count = count + 1
# 输出结果
if last_score > current_max_score:
current_max_score = last_score
maxkey = current_key
key_dict = get_keydict(key_dict, current_key, original_alphabet)
best_plaintext = exchange(key_dict, ciphertext.upper()).lower()
return best_plaintext
iface = gr.Interface(
fn=solve_cipher,
inputs=gr.Textbox(lines=10, placeholder="Enter ciphertext here..."),
outputs="text",
title="Substitution Cipher Solver",
description="Enter the ciphertext and see the decrypted plaintext."
)
if __name__ == "__main__":
iface.launch()