Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.41 KB | None | 0 0
  1. from Crypto.Cipher import AES
  2. from Crypto import Random
  3.  
  4. class NodeKM:
  5.  
  6.     def __init__(self, k1, k2, k3, iv):
  7.         self.key_ecb = k1
  8.         self.key_cbc = k2
  9.         self.key_g = k3
  10.         self.iv = iv
  11.  
  12.     def get_key(self, mode):
  13.         if mode == "ECB":
  14.             cipher = AES.new(self.key_g, AES.MODE_ECB)
  15.             return cipher.encrypt(self.key_ecb)
  16.  
  17.         if mode == "CBC":
  18.             cipher = AES.new(self.key_g, AES.MODE_CBC, self.iv)
  19.             return cipher.encrypt(self.key_cbc)
  20.        
  21.    
  22. class NodeA:
  23.     def __init__(self, k, iv):
  24.         self.key_g = k
  25.         self.iv = iv
  26.  
  27.     def send_to_B_operating_mode(self, mode):
  28.         global node_b
  29.  
  30.         self.mode = mode
  31.         node_b.set_mode(mode)
  32.  
  33.     def get_key_from_KM(self, mode):
  34.         global node_km
  35.  
  36.         if mode == "ECB":
  37.             cipher = AES.new(self.key_g, AES.MODE_ECB)
  38.         if mode == "CBC":
  39.             cipher = AES.new(self.key_g, AES.MODE_CBC, self.iv)
  40.  
  41.         self.key_m = cipher.decrypt(node_km.get_key(mode))
  42.  
  43.     def encrypt(self):
  44.         global node_b
  45.  
  46.         if mode == "ECB":
  47.             cipher = AES.new(self.key_m, AES.MODE_ECB)
  48.         if mode == "CBC":
  49.             cipher = AES.new(self.key_m, AES.MODE_CBC, self.iv)
  50.  
  51.         enc_file = cipher.encrypt(_pad(open('data.txt', 'rb').read()))
  52.         enc_key = cipher.encrypt(_pad(self.key_m))
  53.         enc_mode = cipher.encrypt(_pad(self.mode))
  54.  
  55.         print('enc_file: ', enc_file)
  56.         print('enc_key: ', enc_key)
  57.         print('enc_mode: ', enc_mode)
  58.  
  59.         print('\ndec_file: ', node_b.decrypt(enc_file))
  60.         print('dec_key: ', node_b.decrypt(enc_key))
  61.         print('dec_mode: ', node_b.decrypt(enc_mode))
  62.  
  63. class NodeB:
  64.     def __init__(self, k, iv):
  65.         self.key_g = k
  66.         self.iv = iv
  67.  
  68.     def set_mode(self, mode):
  69.         global node_km
  70.         global node_a
  71.  
  72.         self.mode = mode
  73.  
  74.         if mode == "ECB":
  75.             cipher = AES.new(self.key_g, AES.MODE_ECB)
  76.             self.key_m = cipher.decrypt(node_km.get_key(mode))
  77.  
  78.         if mode == "CBC":
  79.             cipher = AES.new(self.key_g, AES.MODE_CBC, iv)
  80.             self.key_m = cipher.decrypt(node_km.get_key(mode))
  81.  
  82.     def decrypt(self, content):
  83.         if self.mode == "ECB":
  84.             cipher = AES.new(self.key_m, AES.MODE_ECB)
  85.         if self.mode == "CBC":
  86.             cipher = AES.new(self.key_m, AES.MODE_CBC, self.iv)
  87.  
  88.         return _unpad(cipher.decrypt(content))
  89.  
  90.        
  91.  
  92. def fill_with_space(key):
  93.     while len(key) < 16:
  94.         key += "."
  95.     return key
  96.  
  97.  
  98. def _pad(s):
  99.     if type(s) is bytes:
  100.         s = s.decode("utf-8")
  101.     return s + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)
  102.  
  103. def _unpad(s):
  104.     return s[:-ord(s[len(s)-1:])]
  105.  
  106. mode = "ECB"
  107.  
  108. key_ecb = fill_with_space("ecb_key")
  109. key_cbc = fill_with_space("cbc_key")
  110. key_general = fill_with_space("general_key")
  111. iv = Random.new().read(AES.block_size)
  112.  
  113. node_km = NodeKM(key_ecb, key_cbc, key_general, iv)
  114. node_a = NodeA(key_general, iv)
  115. node_b = NodeB(key_general, iv)
  116.  
  117. node_a.send_to_B_operating_mode(mode)
  118. node_a.get_key_from_KM(mode)
  119. node_a.encrypt()
  120.  
  121. print("\nNode A")
  122. print(f"mode: {node_a.mode}")
  123. print(f"key: {node_a.key_g}")
  124. print(f"key mode: {node_a.key_m}")
  125.  
  126. print("\nNode B")
  127. print(f"mode: {node_b.mode}")
  128. print(f"key: {node_b.key_g}")
  129. print(f"key mode: {node_b.key_m}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement