yazdmich

Untitled

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