我正在研究一种破译方法。我想通过用户输入手动破译一个句子。
import random
class Cryptography:
def __init__(self, input_file):
self.input_file = input_file
with open(self.input_file, 'r+') as file:
self.content = file.read()
self.sentence = ''
self.code = {
'A': 'A', 'Ą': 'A', 'B': 'A', 'C': 'A',
'Ć': 'A', 'D': 'A', 'E': 'A', 'Ę': 'A',
'F': 'A', 'G': 'A', 'H': 'A', 'I': 'A',
'J': 'A', 'K': 'A', 'L': 'A', 'Ł': 'A',
'M': 'A', 'N': 'A', 'Ń': 'A', 'O': 'A',
'Ó': 'A', 'P': 'A', 'R': 'A', 'S': 'A',
'Ś': 'A', 'T': 'A', 'U': 'A', 'W': 'A',
'Y': 'A', 'Z': 'A', 'Ż': 'A', 'Ź': 'A',
}
self.replaced_sentence = ''
self.welcome = '\nWITAJ\nMASZ TERAZ OKAZJE ODSZYFROWAĆ POWYŻSZĄ WIADOMOSĆ\nZA KAŻDYM RAZEM JAK ZAMIENISZ ' \
'LITERKI WYSWIETLONA ZOSTANIE\nCZĘŚCIOWO ODSZYFROWANA WIADOMOŚĆ.\nPOWODZENIA!\n '
# repair converts whatever is in self.content to self.sentence, so it is one line of text without large whitespaces.
def repair(self):
for char in self.content:
if char == '\n':
char = char.replace('\n', ' ')
char = char.capitalize()
self.sentence += char
self.sentence = " ".join(self.sentence.split())
print(self.sentence)
def encrypt(self):
numbers = list(range(32))
random.shuffle(numbers)
letters = list(self.code.keys())
encrypted_code = {}
for i, letter in enumerate(letters):
encrypted_code[letter] = letters[numbers[i]]
self.code = encrypted_code
print(f"Encrypted successfully!")
def transform(self):
special_char = [' ', ',', '!', '.', '(', ')', ';',]
for char in self.sentence:
if char in special_char:
replaced_char = char
else:
replaced_char = self.code.get(char)
self.replaced_sentence += replaced_char
def decode(self):
guessed_sentence = self.replaced_sentence
spec_char = zip([' ', ',', '!', '.', '(', ')', ';'], [' ', ',', '!', '.', '(', ')', ';'])
self.code.update(spec_char)
while True:
print(guessed_sentence)
guess = input('please type eg. A = S : ')
guess = guess.strip()
guess = guess.replace(' ', '')
letter1 = guess[0].upper()
letter2 = guess[2].upper()
char_mapping = self.code
char_mapping[letter1] = letter2
old_string = self.replaced_sentence
guessed_sentence = ''
for char in old_string:
guessed_sentence += char_mapping[char]
if guessed_sentence == self.sentence:
break
test = Cryptography('message')
test.repair()
test.encrypt()
test.transform()
test.decode()
__init__(self, input_file)
:使用输入文件初始化 Cryptography 类。它读取输入文件的内容并初始化属性,例如 sentence
、code
、replaced_sentence
和 welcome
。
repair(self)
:处理从输入文件读取的内容,去除多余的空格,将字符大写,并将处理后的句子存储在self.sentence
属性中。
encrypt(self)
:根据self.code
中提供的原始映射生成字母的随机映射,有效加密消息。
transform(self)
:应用encrypt
方法中生成的加密映射将原始句子转换为加密句子,并将结果存储在self.replaced_sentence
中。
decode(self)
:启动解密过程。它提示用户输入字母替换,将这些替换应用于加密的消息,并打印部分解密的消息,直到它与原始句子匹配。
self.welcome
在这个版本中没有使用,这只是美学,也是波兰语所以没关系。
我想要一个显示加密消息的输出,但仅在实施时进行更改。
为了澄清,这是整个函数的输出(句子是波兰语,但我认为这不会干扰对案例的理解):
LITWO! OJCZYZNO MOJA! TY JESTEŚ JAK ZDROWIE.
Encrypted successfully!
UDŹHĘ! ĘJZMŻMEĘ TĘJŃ! ŹŻ JAGŹAI JŃŁ MBĆĘHDA.
please type eg. A = S : U=L
LBCRL! LJMTWTAL ŹLJÓ! CW JŃOCŃD JÓF TĄSLRBŃ.
please type eg. A = S : D=I
LICRL! LJMTWTAL ŹLJÓ! CW JŃOCŃD JÓF TĄSLRIŃ.
please type eg. A = S : Ź=T
LITRL! LJMTWTAL ŹLJÓ! TW JŃOTŃD JÓF TĄSLRIŃ.
please type eg. A = S :
正如您所看到的,每次我进行更改时,加密消息都会发生变化。这就是我追求的结果:
LITWO! OJCZYZNO MOJA! TY JESTEŚ JAK ZDROWIE.
Encrypted successfully!
UDŹHĘ! ĘJZMŻMEĘ TĘJŃ! ŹŻ JAGŹAI JŃŁ MBĆĘHDA.
please type eg. A = S : U=L
LDŹHĘ! ĘJZMŻMEĘ TĘJŃ! ŹŻ JAGŹAI JŃŁ MBĆĘHDA.
please type eg. A = S : D=I
LIŹHĘ! ĘJZMŻMEĘ TĘJŃ! ŹŻ JAGŹAI JŃŁ MBĆĘHIA.
please type eg. A = S : Ź=T
LITHĘ! ĘJZMŻMEĘ TĘJŃ! TŻ JAGTAI JŃŁ MBĆĘHIA.
please type eg. A = S :
如何更改代码以产生所需的结果?
str.translate
以及当前的替换列表来从加密消息生成部分解码的消息。因为将一个字母翻译成“A”可能会与未翻译的“A”混淆,所以我每次都会打印当前的翻译和原始句子,以使其更易于使用(无论如何,对我来说):
import random
class Cryptography:
def __init__(self, message):
self.sentence = message.upper()
self.alphabet = 'AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUWYZŻŹ'
keys = [ord(a) for a in self.alphabet] # keys must be ordinals
values = list(keys) # need mutable list for shuffle
random.shuffle(values)
self.code = dict(zip(keys, values)) # build translation table
self.replaced_sentence = self.sentence.translate(self.code) # translate
print(f'Encrypted successfully!')
def decode(self):
guessed_sentence = self.replaced_sentence
# build up a translation table. Start with hyphens for unknowns.
guessed_code = dict(zip([ord(a) for a in self.alphabet], '-' * len(self.alphabet)))
while True:
print(self.replaced_sentence)
guess = input('please type eg. A = S : ')
guess = guess.strip()
guess = guess.replace(' ', '')
letter1 = guess[0].upper()
letter2 = guess[2].upper()
guessed_code[ord(letter1)] = ord(letter2) # update translation table
guessed_sentence = self.replaced_sentence.translate(guessed_code) # translate
print(guessed_sentence)
if guessed_sentence == self.sentence:
print('Success!')
break
test = Cryptography('Litwo! Ojczyzno moja! Ty jesteś jak zdrowie.')
test.decode()
输出:
Encrypted successfully!
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : s=l
L----! -------- ----! -- ------ --- -------.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : w=i
LI---! -------- ----! -- ------ --- -----I-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : Ź=i
LII--! -------- ----! I- ---I-- --- -----I-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : Ź=t
LIT--! -------- ----! T- ---T-- --- -----I-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : j=w
LITW-! -------- ----! T- ---T-- --- ----WI-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : i=o
LITWO! O------O -O--! T- ---T-- --- ---OWI-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : o=j
LITWO! OJ-----O -OJ-! T- J--T-- J-- ---OWI-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : z=c
LITWO! OJC----O -OJ-! T- J--T-- J-- ---OWI-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : b=z
LITWO! OJCZ-Z-O -OJ-! T- J--T-- J-- Z--OWI-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : m=y
LITWO! OJCZYZ-O -OJ-! TY J--T-- J-- Z--OWI-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : f=n
LITWO! OJCZYZNO -OJ-! TY J--T-- J-- Z--OWI-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : k=m
LITWO! OJCZYZNO MOJ-! TY J--T-- J-- Z--OWI-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : Ł=a
LITWO! OJCZYZNO MOJA! TY J--T-- JA- Z--OWI-.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : a=e
LITWO! OJCZYZNO MOJA! TY JE-TE- JA- Z--OWIE.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : r=s
LITWO! OJCZYZNO MOJA! TY JESTE- JA- Z--OWIE.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : y=ś
LITWO! OJCZYZNO MOJA! TY JESTEŚ JA- Z--OWIE.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : h=k
LITWO! OJCZYZNO MOJA! TY JESTEŚ JAK Z--OWIE.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : Ć=d
LITWO! OJCZYZNO MOJA! TY JESTEŚ JAK ZD-OWIE.
SWŹJI! IOZBMBFI KIOŁ! ŹM OARŹAY OŁH BĆĘIJWA.
please type eg. A = S : Ę=r
LITWO! OJCZYZNO MOJA! TY JESTEŚ JAK ZDROWIE.
Success!