Guest User

z13_poc_1.py

a guest
Dec 24th, 2020
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.77 KB | None | 0 0
  1. """
  2. $ python z13_poc_1.py
  3. MATCHING CIPHER LINE
  4. >VUZ5-+|c.3zBK(Op^.fMqG2RcT+L16C<+
  5.  
  6. MATCHING CIPHER LINE MIRRORED
  7. <VUZ5-+|C.4zbk(OP^.FMQG2rCT+l16c>+
  8.  
  9. MATCHING CIPHER LINE MIRRORED DECIPHERED
  10. I O S R V S H E Y N E A E I T A I O N F O Q T M r Y R H A R D E N H
  11. """
  12.  
  13. import re
  14.  
  15. import numpy as np
  16.  
  17. left_right = {
  18.     None: "Z",
  19.     "!": "!",
  20.     "#": "#",
  21.     "%": "*",
  22.     "&": None,
  23.     "(": "(",
  24.     ")": ")",
  25.     "*": "%",
  26.     "+": "+",
  27.     "-": "-",
  28.     ".": ".",
  29.     "/": "\\",
  30.     "0": None,
  31.     "1": "1",
  32.     "2": "2",
  33.     "3": "4",
  34.     "4": "3",
  35.     "5": "5",
  36.     "6": "6",
  37.     "7": "7",
  38.     "8": "8",
  39.     "9": "9",
  40.     ":": ";",
  41.     ";": ":",
  42.     "<": ">",
  43.     "=": "=",
  44.     ">": "<",
  45.     "?": "?",
  46.     "@": "@",
  47.     "A": "A",
  48.     "B": "b",
  49.     "C": "c",
  50.     "D": "d",
  51.     "E": "e",
  52.     "F": "f",
  53.     "G": None,
  54.     "H": "H",
  55.     "I": "I",
  56.     "J": None,
  57.     "K": "k",
  58.     "L": "l",
  59.     "M": "M",
  60.     "N": None,
  61.     "O": "O",
  62.     "P": "p",
  63.     "Q": "q",
  64.     "R": "r",
  65.     "S": None,
  66.     "T": "T",
  67.     "U": None,
  68.     "V": "V",
  69.     "W": "W",
  70.     "X": "X",
  71.     "Y": "y",
  72.     "Z": None,
  73.     "\\": "/",
  74.     "b": "B",
  75.     "c": "C",
  76.     "d": "D",
  77.     "e": "E",
  78.     "f": "F",
  79.     "k": "K",
  80.     "l": "L",
  81.     "p": "P",
  82.     "q": "Q",
  83.     "r": "R",
  84.     "y": "Y",
  85. }
  86.  
  87.  
  88. z340_key = {
  89.     "A": ["K", "*", "z", "O", "l"],
  90.     "B": ["f", "_"],
  91.     "C": ["p"],
  92.     "D": ["S", "A", "6"],
  93.     "E": ["|", "B", "b", "4", "c", "N"],
  94.     "F": ["F"],
  95.     "G": ["L"],
  96.     "H": ["+"],
  97.     "I": ["H", "k", "<", "P", "y"],
  98.     "J": [],
  99.     "K": [],
  100.     "L": ["d", "7", "t"],
  101.     "M": ["2"],
  102.     "N": [".", "9", ">", "D", "Y"],
  103.     "O": ["M", "V", "R", "^"],
  104.     "P": ["8", "j"],
  105.     "Q": [],
  106.     "R": ["E", "Z", "1", "T"],
  107.     "S": ["U", "&", "J", "-"],
  108.     "T": ["(", "#", "G", "%", ";", ":"],
  109.     "U": ["@", "/", "q"],
  110.     "V": ["5"],
  111.     "W": ["W", ")"],
  112.     "X": [],
  113.     "Y": ["C", "3", "X"],
  114.     "Z": [],
  115. }
  116.  
  117.  
  118. def load_z340(fix=True):
  119.     z340 = r"""
  120.        HER>pl^VPk|1LTG2d
  121.        Np+B(#O%DWY.<*Kf)
  122.        By:cM+UZGW()L#zHJ
  123.        Spp7^l8*V3pO++RK2
  124.        _9M+ztjd|5FP+&4k/
  125.        p8R^FlO-*dCkF>2D(
  126.        #5+Kq%;2UcXGV.zL|
  127.        (G2Jfj#O+_NYz+@L9
  128.        d<M+b+ZR2FBcyA64K
  129.        -zlUV+^J+Op7<FBy-
  130.        U+R/5tE|DYBpbTMKO
  131.        2<clRJ|*5T4M.+&BF
  132.        z69Sy#+N|5FBc(;8R
  133.        lGFN^f524b.cV4t++
  134.        yBX1*:49CE>VUZ5-+
  135.        |c.3zBK(Op^.fMqG2
  136.        RcT+L16C<+FlWB|)L
  137.        ++)WCzWcPOSHT/()p
  138.        |FkdW<7tB_YOB*-Cc
  139.        >MDHNpkSzZO8A|K;+
  140.    """
  141.     lines = [list(y) for y in (x.strip() for x in z340.split("\n")) if y]
  142.     if fix:
  143.         lines[14] = list("yBX+1*:49CE>VUZ5-")
  144.     return np.array(lines)
  145.  
  146.  
  147. def substitute(key, alias):
  148.     for letter, aliases in key.items():
  149.         if alias in aliases:
  150.             return letter
  151.  
  152.  
  153. def find_z13_pattern(cipher):
  154.     z13_pattern = re.compile(".{13}K.{6}M.{13}")
  155.     return z13_pattern.findall("".join(cipher.flatten()))
  156.  
  157.  
  158. def demo():
  159.     z340 = load_z340(fix=False)
  160.     matching_lines = find_z13_pattern(cipher=z340)
  161.     second_line = matching_lines[1]
  162.     plaintext = []
  163.     line_mirror = []
  164.  
  165.     print("MATCHING CIPHER LINE")
  166.     print(second_line, "\n")
  167.  
  168.     for char in second_line:
  169.         char_mirror = left_right.get(char) or char
  170.         line_mirror.append(char_mirror)
  171.  
  172.     print("MATCHING CIPHER LINE MIRRORED")
  173.     print("".join(line_mirror), "\n")
  174.  
  175.     for char_mirror in line_mirror:
  176.         char_plain = substitute(key=z340_key, alias=char_mirror) or char_mirror
  177.         plaintext.append(char_plain)
  178.  
  179.     plaintext = " ".join(plaintext)
  180.     print("MATCHING CIPHER LINE MIRRORED DECIPHERED")
  181.     print(plaintext)
  182.  
  183.     assert "T M r Y R H A R D E N" in plaintext
  184.  
  185.  
  186. if __name__ == "__main__":
  187.     demo()
  188.  
Advertisement
Add Comment
Please, Sign In to add comment