Расшифровка заменой ключа - Python - PullRequest
0 голосов
/ 07 ноября 2018

[После написания этого я понял, что я заменяю уже частично расшифрованное сообщение, поэтому я, кажется, нашел ошибку, но теперь я не могу понять, как заменить буквы по одной без используя кучу операторов if-else, которые кажутся очень неэффективными. Есть предложения?]

Часть зашифрованного сообщения

THEXMUNITIONSXFACTORYXREPORTEDXDAMAGEDXINXBOMBINGXRAIDXSTOPXKEEPXLOWXPROFILEXSTOPXURGENTXMESSAGESXCOMPROMISEDXSWITCHXTOXENCRYPTEDXURGENTXSTOPASJHXBLDZBLVZJXWZBHDFFVMYHSJYDMBJDOSUBGJDKBFSPWBHDMJSHJBAYJXBSRWMJBDZSMRWBGJDKBSNDYOBJXWBDJXWZBHDMJSHJBSJBSIIBHDGJGBGJDKBSHJYNSJWBDKWZSJYDMBEIVWBGKDDMBGJDKBZWKDZJBDMBJXWBKDIYHWBGJSJYDMBGJDKBSHJYNSJWBDKWZSJYDMBMDZJXADDOGBGJDKBZWKDZJBDMBUDVZBGJSJVGBGJDKBSBESJJIWGXYKBGWWMBOWKSZJYMRBLZDFBOWWKBXSZEDVZBGJDKBMWBJBFWWJYMRBSJBCICCBTVIVBJDMYRXJBJXWBKSZPBVMOWZBJXWBDSPBGJDKBPWWKBIDABKZDLYIWBGJDKBOYGZWRSZOBISGJBFWGGSRWBGJDKBYMNWGJYRSJWBZVFDVZGBDLBGJZYPWGBGJDKBPWWKBIDABKZDLYIWBGJDKBVMPMDAMBNWGGWIBYGBODHPWOBSJBOWWKBXSZEDVZBGJDKBJXWBODRBJZSYMWZBFSUBEWBODVEIWBSRWMJBWBWZHYGWBHSVJYDMBGJDKBDKWZSJYDMBMDZ

Мне нужно расшифровать сообщение путем замены ключа. Мне дают упорядоченную строку по тому, как часто каждая буква появляется в ранее незашифрованных сообщениях, а затем мне говорят, что для расшифровки все, что нужно сделать, это заменить самую частую букву в зашифрованном тексте самой частой в прошлые незашифрованные тексты и т. д.

Мне также сказали игнорировать первые 141 символ, поскольку они уже были расшифрованы.

Как видно из кода выше, я сделал следующее:

  1. Скопируйте зашифрованную строку из 142-го символа и далее, чтобы иметь дело только с битом, который все еще зашифрован

  2. Создать словарь с буквами и числом их встреч в сообщении

  3. Преобразовать этот словарь в список и отсортировать его в порядке убывания

  4. Наконец, я перебираю «частотную строку» (которая, по сути, является ключом, который мне дали, указывающий, как часто появляются буквы в незашифрованных сообщениях), и сопоставляю его с буквами в сообщении в порядке их частоты список. И используйте строковый метод replace () замените их

encrypted = message [142:] quenString = "XTOEASRINPDCLHUMGBFYWVKZJQ" print (orderChars) # для отладки

def counter(chars):
    d = {}
    for char in message:
        d[char] = d.get(char,0) + 1
    return d

charCount = counter(message)

def sortChars(charCount):
    orderedChars = []
    for k in charCount:
        orderedChars.append([charCount[k],k])
    orderedChars = sorted(orderedChars, reverse=True)
    return orderedChars

orderedChars = sortChars(charCount)

def charMatch(orderedChars, frequencyString):
    global encrypted
    i=-1
    for char in frequencyString:
        i+=1
        print(orderedChars[i][1]+"->"+char,end=" $ ") #for debuging purposes
        encrypted = encrypted.replace(orderedChars[i][1],char)
    encrypted = encrypted.replace("X"," ")
    print()
    print()#for debuging purposes
    print(encrypted) #for debuging purposes
    return encrypted
print()
charMatch(orderedChars,frequencyString)

OUTPUT

[[1449, «B»], [830, «J»], [784, «D»], [748, «W»], [578, «S»], [530, «G» ], [469, 'Z'], [413, 'Y'], [403, 'M'], [343, 'K'], [251, 'O'], [233, 'X'], [232, 'H'], [229, 'I'], [191, 'V'], [190, 'F'], [145, 'E'], [142, 'R'], [111 , 'L'], [95, 'U'], [86, 'A'], [77, 'N'], [70, 'P'], [22, 'T'], [11, ' C '], [6,' Q ']]

B-> X $ J-> T $ D-> O $ W-> E $ S-> A $ G-> S $ Z-> R $ Y-> I $ M-> N $ K- > P $ O-> D $ X-> C $ H-> L $ I-> H $ V-> U $ F-> M $ E-> G $ R-> B $ L-> F $ U- > Y $ A-> W $ N-> V $ P-> K $ T-> Z $ C-> J $ Q-> Q $

WZFJJFDBJFYBZJGBJFDMMYVHFWZHDVJZDDWYJSZDKJMWKGJFDVZWFZJWHZJJWBGVZJDBWVBGJSZDKJWVDHDJZJGJDZJGBJFDVZWFZJWZJWHHJFDSZSJSZDKJWFZHVWZGJDKGBWZHDVJGHYGJSKDDVJSZDKJBGKDBZJDVJZJGJKDHHFGJSZWZHDVJSZDKJWFZHVWZGJDKGBWZHDVJVDBZJWDDDSJSZDKJBGKDBZJDVJYDYBJSZWZYSJSZDKJWJGWZZHGSJHKJSGGVJDGKWBZHVBJFBDMJDGGKJJWBGDYBJSZDKJVGJZJMGGZHVBJWZJJHJJJZYHYJZDVHBJZJZJGJKWBKJYVDGBJZJGJDWKJSZDKJKGGKJHDWJKBDFHHGJSZDKJDHSBGBWBDJHWSZJMGSSWBGJSZDKJHVVGSZHBWZGJBYMDYBSJDFJSZBHKGSJSZDKJKGGKJHDWJKBDFHHGJSZDKJYVKVDWVJVGSSGHJHSJDDFKGDJWZJDGGKJJWBGDYBJSZDKJZJGJDDBJZBWHVGBJMWYJGGJDDYGHGJWBGVZJGJGBFHSGJFWYZHDVJSZDKJDKGBWZHDVJVDBZJWDDDSJJWSJGGGVJSYFFGSSFYHJSZDKJVGJZJMGGZHVBJWZJKBJJJZYHYJZDMDBBDWJWZJZJGJDHDJHHDVJSZDKJDDJVDZJMWKGJFDVZWFZJYVZHHJZJGJYSYWHJDWYJSZDKJDDJVDZJMWKGJ

1 Ответ

0 голосов
/ 07 ноября 2018

У вас есть большая часть кода, чтобы найти частоты символов. Вы упомянули, что поняли, что замена на месте не работает. Таким образом, вам нужно создать отдельный буфер для хранения расшифрованного сообщения. Мне было проще создать карту из 2 частотных строк:

# Your other code....
# orderedChars needs to be converted to string like frequencyString...
# Zip the 2 frequency strings to a dictionary
letterMap = dict(zip(orderedChars, frequencyString))
# Create an empty array to hold decrypted msg
decrypted = [''] * len(encrypted)
# Decrypt the message letter by letter
for i,c in enumerate(encrypted):
    decrypted[i] = letterMap[c]
# Convert to string and print   
print(''.join(decrypted).replace('X', ' '))

Как уже упоминалось в комментариях, вы также можете сделать это с помощью translate.

# Build the translation table
translationTable = str.maketrans(orderedChars, frequencyString)
# Decrypt and print
print(encrypted.translate(translationTable).replace('X', ' '))

Оба кода выдают одинаковый вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...