yazdmich

assembler.py

Nov 19th, 2014
391
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.38 KB | None | 0 0
  1. # -------------------------------------------------------------------------
  2. # Name              Crypto
  3. # Purpose:          Vernam cipher with hex output module
  4. # Author:           Michael Yazdani
  5. # Copyright:        Michael M. Yazdani 2014
  6. # -------------------------------------------------------------------------
  7. import random
  8. random.seed()
  9.  
  10.  
  11. def csr(x):
  12.     if x % 2 == 1:
  13.         return (x >> 1) + 64
  14.     elif x % 2 == 0:
  15.         return x >> 1
  16.  
  17.  
  18. def csl(x):
  19.     if x < 64:
  20.         return x << 1
  21.     else:
  22.         return ((x - 64) << 1) + 1
  23.  
  24.  
  25. class LFSR:
  26.  
  27.     def __init__(self, seed, nbits):
  28.         self.seed = seed
  29.         self.nbits = nbits
  30.  
  31.     def lfsr2(self):
  32.         sr = self.seed
  33.         while True:
  34.             xor = 1
  35.             for t in (1, 2, 3):
  36.                 if (sr & (1 << (t - 1))) != 0:
  37.                     xor ^= 1
  38.             sr = (xor << self.nbits - 1) + (sr >> 1)
  39.             yield sr
  40.             if sr == self.seed:
  41.                 break
  42.  
  43.     def lfsr(self, msg):
  44.         register = [x for x in self.lfsr2()]
  45.         out = ''
  46.         for char in range(len(msg)):
  47.             out += hex(ord(msg[char]) ^ register[char % len(register)]) + ' '
  48.         return out
  49.  
  50.     def key_out(self, key):
  51.         key = key.split(' ')
  52.         out = ''
  53.         register = list(self.lfsr2())
  54.         del key[-1]
  55.         for n in range(0, len(key)):
  56.             out += chr(int(key[n], 16) ^ register[n % len(register)])
  57.         return out
  58.  
  59.  
  60. class Crypto:
  61.  
  62.     def __init__(self, name, msg, seed):
  63.         self.decoded = ""
  64.         self.encoded = ""
  65.         self.alphas = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
  66.        ,.?\"'()[]{}1234567890<>;:!@#$%^&*`~/\\-=_+ "
  67.         self.name = name
  68.         self.msg = msg
  69.         self.feedback = LFSR(seed, 8)
  70.         if not(self.name == 'gen'):
  71.             stream = open("keys/" + self.name)
  72.             if (stream):
  73.                 self.key = stream.read()
  74.                 stream.close()
  75.             else:
  76.                 print(
  77.                     "Error, key not found, make sure its in the key folder\
  78.                    and you spelled it right")
  79.                 stream.close()
  80.  
  81.     def update(self, msg):
  82.         self.msg = msg
  83.  
  84.     def lfsr_key_in(self):
  85.         return self.feedback.lfsr(self.key)
  86.  
  87.     def lfsr_key_out(self):
  88.         return self.feedback.key_out(self.key)
  89.  
  90.     def reset_key(self):
  91.         return self.lfsr_key_out()
  92.  
  93.     def gen_key(self, name):
  94.         self.key = ""
  95.         used = [False for i in range(len(self.alphas) + 1)]
  96.         check = []
  97.         for _ in range(len(self.alphas)):
  98.             var = True
  99.             while var:
  100.                 num = random.randint(0, len(self.alphas) - 1)
  101.                 if used[num] is False:
  102.                     check.append(num)
  103.                     var = False
  104.             used[num] = True
  105.             self.key += self.alphas[num]
  106.         check = sorted(check)
  107.         print(check)
  108.         print("New key: " + self.key)
  109.         stream = open("keys/" + name, mode='w')
  110.         self.key = self.lfsr_key_in()
  111.         stream.write(self.key)
  112.         stream.close()
  113.  
  114.     def get_key(self):
  115.         stream = open("keys/" + self.name)
  116.         if (stream):
  117.             self.key = stream.read()
  118.             stream.close()
  119.             return self.key
  120.         else:
  121.             print(
  122.                 "Error, key not found, make sure its in the key folder and\
  123.                you spelled it right")
  124.             stream.close()
  125.  
  126.     def In(self):
  127.         encode = self.msg
  128.         self.encoded = ""
  129.         key = self.lfsr_key_out()
  130.         for x in range(0, len(encode)):
  131.             self.encoded += hex(
  132.                 csl(csr(ord(key[x % len(key)])) ^ ord(encode[x]))) + " "
  133.         return self.encoded
  134.  
  135.     def Out(self):
  136.         self.encoded = self.msg.split(' ')
  137.         self.decoded = ""
  138.         key = self.lfsr_key_out()
  139.         del self.encoded[len(self.encoded) - 1]
  140.         for x in range(0, len(self.encoded)):
  141.             self.decoded += chr(
  142.                 csr(int(self.encoded[x], base=16)) ^ csr(ord(key[x % len(key)])
  143.                                                          )
  144.             )
  145.         return self.decoded
  146.  
  147.  
  148. class CryptIO:
  149.  
  150.     def __init__(self, fin, fout):
  151.         self.file = open(fin)
  152.         self.file2 = open(fout, 'w')
  153.  
  154.     def close(self):
  155.         self.file.close()
  156.         self.file2.close()
  157.  
  158.     def In(self, key, seed):
  159.         crypto = Crypto(key, '', seed)
  160.         self.file2.write(crypto.lfsr_key_in() + '\n')
  161.         self.file2.write('begin' + '\n')
  162.         for line in self.file:
  163.             crypto.update(line)
  164.             fin = crypto.In()
  165.             self.file2.write(fin + '\n')
  166.         self.file2.write('\n')
  167.         self.close()
  168.         del crypto
  169.  
  170.     def Out(self, seed):
  171.         check = False
  172.         shift = LFSR(seed, 8)
  173.         for line in self.file:
  174.             if (not check) and (line != 'begin\n'):
  175.                 print(line)
  176.                 crypto = Crypto('gen', '', seed)
  177.                 crypto.key = shift.key_out(line)
  178.             elif check:
  179.                 crypto.update(line)
  180.                 fout = crypto.Out()
  181.                 print(line)
  182.                 print(fout)
  183.                 self.file2.write(fout)
  184.             elif line == 'begin\n':
  185.                 check = True
  186.                 continue
  187.  
  188.         self.close()
Advertisement
Add Comment
Please, Sign In to add comment