Advertisement
Guest User

lab3

a guest
Nov 12th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.55 KB | None | 0 0
  1. from Crypto.Cipher import AES
  2. import os
  3.  
  4. def AesBlockEncrypt(key, data, isFinalBlock = 0, padding = ''):
  5.     if isFinalBlock and len(data) // 16 == 0:
  6.         if padding == '':
  7.             p = bytes(chr(16 - len(data) % 16), 'utf-8')
  8.             data = data + p * (16 - len(data) % 16)
  9.         else:
  10.             data = data + bytes(padding, 'utf-8')
  11.     return AES.new(key, AES.MODE_ECB).encrypt(data)
  12.  
  13. def AesBlockDecrypt(key, data):
  14.     return AES.new(key, AES.MODE_ECB).decrypt(data)
  15.  
  16. def AesEncrypt(key, data, mode, iv = ''):
  17.     ans = b''
  18.     finalblock = data[16 * (len(data) // 16):]
  19.     data = data[:16 * (len(data)) // 16]
  20.     blocks = [data[i:i + 16] for i in range(0, len(data) - 15, 16)]
  21.     if mode == 'ECB':
  22.         for block in blocks:
  23.             ans = ans + AesBlockEncrypt(key, block)
  24.         if finalblock != b'':
  25.             ans = ans + AesBlockEncrypt(key, finalblock, 1)
  26.        
  27.     elif mode == 'CBC':
  28.         if iv == '':
  29.             iv = os.urandom(16)
  30.         blocks[0] = (int(blocks[0].hex(), 16) ^ int(iv.hex(), 16)).to_bytes(16, 'big')
  31.         c = AesBlockEncrypt(key, blocks[0])
  32.         ans = iv + c
  33.         for i in range(1, len(blocks)):
  34.             c = AesBlockEncrypt(key, (int(blocks[i].hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big'))
  35.             ans = ans + c
  36.         if finalblock != b'':
  37.             p = bytes(chr(16 - len(finalblock) % 16), 'utf-8')
  38.             finalblock = finalblock + p * (16 - len(finalblock) % 16)
  39.             ans = ans + AesBlockEncrypt(key, (int(finalblock.hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big'))
  40.            
  41.     elif mode == 'CFB':
  42.         if iv == '':
  43.             iv = os.urandom(16)
  44.         ans = ans + iv
  45.         c = AesBlockEncrypt(key, iv)
  46.         for i in range(0, len(blocks)):
  47.             c = (int(blocks[i].hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big')
  48.             ans = ans + c
  49.             c = AesBlockEncrypt(key, c)
  50.         if finalblock != b'':
  51.             p = bytes(chr(16 - len(finalblock) % 16), 'utf-8')
  52.             finalblock = finalblock + p * (16 - len(finalblock) % 16)
  53.             ans = ans + (int(finalblock.hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big')
  54.        
  55.     elif mode == 'OFB':
  56.         if iv == '':
  57.             iv = os.urandom(16)
  58.         ans = ans + iv
  59.         c = AesBlockEncrypt(key, iv)
  60.         for i in range(0, len(blocks)):
  61.             ans = ans + (int(blocks[i].hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big')
  62.             c = AesBlockEncrypt(key, c)
  63.         if finalblock != b'':
  64.             p = bytes(chr(16 - len(finalblock) % 16), 'utf-8')
  65.             finalblock = finalblock + p * (16 - len(finalblock) % 16)
  66.             ans = ans + (int(finalblock.hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big')
  67.        
  68.     elif mode == 'CTR':
  69.         if iv == '':
  70.             iv = os.urandom(16)
  71.         ans = ans + iv
  72.         for block in blocks:
  73.             ans = ans + AesBlockEncrypt(key, (int(iv.hex(), 16) ^ int(block.hex(), 16)).to_bytes(16, 'big'))
  74.             iv = (int(iv.hex(), 16) + 1).to_bytes(16, 'big')
  75.         if finalblock != b'':
  76.             p = bytes(chr(16 - len(finalblock) % 16), 'utf-8')
  77.             finalblock = finalblock + p * (16 - len(finalblock) % 16)
  78.             ans = ans + AesBlockEncrypt(key, (int(iv.hex(), 16) ^ int(finalblock.hex(), 16)).to_bytes(16, 'big'))
  79.    
  80.     return ans
  81.  
  82. def AesDecrypt(key, data, mode):
  83.     ans = b''
  84.     blocks = [data[i:i + 16] for i in range(0, len(data) - 15, 16)]
  85.    
  86.     if mode == 'ECB':
  87.         for block in blocks:
  88.             ans = ans + AesBlockDecrypt(key, block)
  89.        
  90.     elif mode == 'CBC':
  91.         for i in range(1, len(blocks)):
  92.             c = (int(AesBlockDecrypt(key, blocks[i]).hex(), 16) ^ int(blocks[i - 1].hex(), 16)).to_bytes(16, 'big')
  93.             ans = ans + c
  94.            
  95.     elif mode == 'CFB':
  96.         for i in range(1, len(blocks)):
  97.             ans = ans + (int(blocks[i].hex(), 16) ^ int(AesBlockEncrypt(key, blocks[i - 1]).hex(), 16)).to_bytes(16, 'big')
  98.        
  99.     elif mode == 'OFB':
  100.         iv = blocks[0]
  101.         c = AesBlockEncrypt(key, iv)
  102.         for i in range(1, len(blocks)):
  103.             ans = ans + (int(blocks[i].hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big')
  104.             c = AesBlockEncrypt(key, c)
  105.        
  106.     elif mode == 'CTR':
  107.         iv = blocks[0]
  108.         for i in range(1, len(blocks)):
  109.             ans = ans + (int(AesBlockDecrypt(key, blocks[i]).hex(), 16) ^ int(iv.hex(), 16)).to_bytes(16, 'big')
  110.             iv = (int(iv.hex(), 16) + 1).to_bytes(16, 'big')
  111.    
  112.     return ans
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement