# pyJustinBieberDecryptionExercise

May 18th, 2022 (edited)
385
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. # Encoded Text Decyphering Project
2.
3. # The encryption process is done like this. Each letter in the alphabet is given a number based on its offset from "a",
4. # plus some additional offset. So for example if the additional offset is 10, then 'a' is numbered 10, 'b' is 11 etc.
5. # The resulting number is doubled. Each character in an odd position within the text, is replaced with this 2-digit number.
6. # Then each character at an even position within the text, is similary replaced by the 2-digit number, but these are inserted in reverse order,
7. # so for example for an 8-character piece of text, the 2nd character is replaced with the number derived from the 8th character in the text,
8. # the 3rd is replaced by the number from the 6th character etc.
9.
10. intercept = "1242263422322626121816404638362648184618341226364644"          # Encoded text
11.
12. LetterDistr = "?qjzxvkwyfbghmpduclsntoirae"         # letter distribution in English. Right characters are commoner
13.
14. fwd = []
15. back = []
16. # build two lists, one with odd numbered pairs going forwards, and 2nd with even numbered pairs going backwards
17. for x in range(0, len(intercept), 4):
18.     f = intercept[x: x+2]
19.     b = intercept[x+2: x + 4]
20.     fwd.append(int(f) // 2)         # divide by 2
21.     back = [int(b) // 2] + back     # arrange integers backwards
22.
23. combo = []
24. # Combine the 2 lists
25. for x in range(len(fwd)):
26.     combo.append(fwd[x])
27.     combo.append(back[x])
28.
29. bestscore = 0
30. bestoffset = 0
31. bestresult = ""
32. # For each possible offset 0 thru 25, decode the test, and decide which offset gives an output most like English
33. for offset in range(26):
34.     res = ""
35.     score = 0
36.     for i in combo:
37.         i -= offset
38.         if i < 0:                   # wrap around the alphabet
39.             i += 26
40.         ch = chr(i + ord('a'))      # add offset to the ascii value of 'a'
41.         res += ch
42.         if ch in LetterDistr:
43.             score += LetterDistr.index(ch)      # accumulate a score based on letter frequency in English
44.     if score > bestscore:
45.         bestscore = score
46.         bestoffset = offset
47.         bestresult = res
48. print(f"The best offset was {bestoffset} which gave the following text\n{bestresult}")
49.
50. # Output:-
51. #
52. # The best offset was 5 which gave the following text
53. # bringbiebedisonptesimlimsq
54.
55.
56.
57.
58.
RAW Paste Data Copied