Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.42 KB | None | 0 0
  1. from Crypto.Cipher import DES3, DES
  2. from Crypto import Random
  3. import time
  4.  
  5.  
  6. class DES3Crypto(object):
  7.         def __init__(self):
  8.             self.block_size = 8
  9.  
  10.         def __getPadding(self, data):
  11.             pad_len = self.block_size - (len(data) % self.block_size)
  12.             return data + bytes([pad_len] * pad_len)
  13.  
  14.         def __rmPadding(self, data):
  15.             pad_len = data[-1]
  16.             return data[:-pad_len]
  17.  
  18.         def __innernCBCtripleDES(self, data, key, iv, crypt='ENCRYPT'):
  19.             result = b''
  20.             iv1 = iv2 = iv3 = iv
  21.             key1 = key[:8]
  22.             key2 = key[8:16]
  23.             if len(key) == 16:
  24.                 key3 = key1
  25.             else:
  26.                 key3 = key[16:]
  27.             for x in range(0, len(data), self.block_size):
  28.                 if crypt == 'ENCRYPT':
  29.                     cipher = DES.new(key1, DES.MODE_CBC, iv1)
  30.                     block = cipher.encrypt(data[x:x+self.block_size])
  31.                     iv1 = block
  32.                     cipher = DES.new(key2, DES.MODE_CBC, iv2)
  33.                     block = cipher.decrypt(block)
  34.                     iv2 = block
  35.                     cipher = DES.new(key3, DES.MODE_CBC, iv3)
  36.                     block = cipher.encrypt(block)
  37.                     iv3 = block
  38.                     result += block
  39.                 else:
  40.                     cipher = DES.new(key1, DES.MODE_CBC, iv1)
  41.                     block = cipher.decrypt(data[x:x+self.block_size])
  42.                     iv1 = data[x:x+8]
  43.                     cipher = DES.new(key2, DES.MODE_CBC, iv2)
  44.                     iv2 = block
  45.                     block = cipher.encrypt(block)
  46.                     cipher = DES.new(key3, DES.MODE_CBC, iv3)
  47.                     iv3 = block
  48.                     block = cipher.decrypt(block)
  49.                     result += block
  50.             return result
  51.  
  52.         def __padTripleDES(self, data, key, crypt='ENCRYPT'):
  53.             key1 = key[:8]
  54.             key2 = key[8:16]
  55.             if len(key) == 16:
  56.                 key3 = key1
  57.             else:
  58.                 key3 = key[16:]
  59.             if crypt == 'ENCRYPT':
  60.                 cipher = DES.new(key1, DES.MODE_ECB)
  61.                 data = cipher.encrypt(data)
  62.                 padding = Random.new().read(DES3.block_size // 2)
  63.                 data = self.__getPadding(padding + data)
  64.                 cipher = DES.new(key2, DES.MODE_ECB)
  65.                 data = cipher.decrypt(data)
  66.                 padding = Random.new().read(DES3.block_size // 2)
  67.                 data = self.__getPadding(padding + data)
  68.                 cipher = DES.new(key3, DES.MODE_ECB)
  69.                 data = cipher.decrypt(data)
  70.             else:
  71.                 cipher = DES.new(key3, DES.MODE_ECB)
  72.                 data = cipher.decrypt(data)
  73.                 data = self.__rmPadding(data[self.block_size//2:])
  74.                 cipher = DES.new(key2, DES.MODE_ECB)
  75.                 data = cipher.encrypt(data)
  76.                 data = self.__rmPadding(data[self.block_size//2:])
  77.                 cipher = DES.new(key1, DES.MODE_ECB)
  78.                 data = cipher.decrypt(data)
  79.             return data
  80.  
  81.         def getMode(self):
  82.             print('1 - ECB, 2 - CBC, 3 - CFB,\n4 - PGP, 5 - OFB,'
  83.                   ' 6 - CTR,\n7 - OPENPGP, 8 - innerCBC, 9 - ECBpad')
  84.  
  85.         def tripleDESencrypt(self, data, key, mode, iv):
  86.             data = self.__getPadding(data)
  87.             if mode == 8:
  88.                 encrypt = self.__innernCBCtripleDES(data, key, iv, 'ENCRYPT')
  89.             elif mode == 9:
  90.                 encrypt = self.__padTripleDES(data, key, 'ENCRYPT')
  91.             else:
  92.                 cipher = DES3.new(key, mode, iv)
  93.                 encrypt = cipher.encrypt(data)
  94.             return encrypt
  95.  
  96.         def tripleDESdecrypt(self, encrypt, key, mode, iv):
  97.             if mode == 8:
  98.                 data = self.__innernCBCtripleDES(encrypt, key, iv, 'DECRYPT')
  99.             elif mode == 9:
  100.                 data = self.__padTripleDES(encrypt, key, 'DECRYPT')
  101.             else:
  102.                 cipher = DES3.new(key, mode, iv)
  103.                 data = cipher.decrypt(encrypt)
  104.             return self.__rmPadding(data)
  105.  
  106.  
  107.         def testTime(self, data, key, iv):
  108.             start = time.time()
  109.             encrypt = self.tripleDESencrypt(data, key, 1, iv)
  110.             self.tripleDESdecrypt(encrypt, key, 1, iv)
  111.             print('Time ECB: {0} sec'.format(time.time() - start))
  112.             start = time.time()
  113.             encrypt = self.tripleDESencrypt(data, key, 2, iv)
  114.             self.tripleDESdecrypt(encrypt, key, 2, iv)
  115.             print('Time CBC: {0} sec'.format(time.time() - start))
  116.             start = time.time()
  117.             encrypt = self.tripleDESencrypt(data, key, 8, iv)
  118.             self.tripleDESdecrypt(encrypt, key, 8, iv)
  119.             print('Time innerCBC: {0} sec'.format(time.time() - start))
  120.             start = time.time()
  121.             encrypt = self.tripleDESencrypt(data, key, 9, iv)
  122.             self.tripleDESdecrypt(encrypt, key, 9, iv)
  123.             print('Time ECBpad: {0} sec'.format(time.time() - start))
  124.  
  125.  
  126.  
  127.  
  128.  
  129. if __name__ == "__main__":
  130.     cipher = DES3Crypto()
  131.     cipher.getMode()
  132.     iv = Random.new().read(DES3.block_size)
  133.     key = '\1'*16
  134.     data = open('add.png', 'rb').read()
  135.     cipher.testTime(data, key, iv)
  136.     #cipher.tripleDESencrypt('input.docx', 'encrypt.txt', key, 1, iv)
  137.     #cipher.tripleDESdecrypt('encrypt.txt', 'decrypt.docx', key, 1, iv)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement