Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from Crypto.Cipher import AES
- import os
- def AesBlockEncrypt(key, data, isFinalBlock = 0, padding = ''):
- if isFinalBlock and len(data) // 16 == 0:
- if padding == '':
- p = bytes(chr(16 - len(data) % 16), 'utf-8')
- data = data + p * (16 - len(data) % 16)
- else:
- data = data + bytes(padding, 'utf-8')
- return AES.new(key, AES.MODE_ECB).encrypt(data)
- def AesBlockDecrypt(key, data):
- return AES.new(key, AES.MODE_ECB).decrypt(data)
- def AesEncrypt(key, data, mode, iv = ''):
- ans = b''
- finalblock = data[16 * (len(data) // 16):]
- data = data[:16 * (len(data)) // 16]
- blocks = [data[i:i + 16] for i in range(0, len(data) - 15, 16)]
- if mode == 'ECB':
- for block in blocks:
- ans = ans + AesBlockEncrypt(key, block)
- if finalblock != b'':
- ans = ans + AesBlockEncrypt(key, finalblock, 1)
- elif mode == 'CBC':
- if iv == '':
- iv = os.urandom(16)
- blocks[0] = (int(blocks[0].hex(), 16) ^ int(iv.hex(), 16)).to_bytes(16, 'big')
- c = AesBlockEncrypt(key, blocks[0])
- ans = iv + c
- for i in range(1, len(blocks)):
- c = AesBlockEncrypt(key, (int(blocks[i].hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big'))
- ans = ans + c
- if finalblock != b'':
- p = bytes(chr(16 - len(finalblock) % 16), 'utf-8')
- finalblock = finalblock + p * (16 - len(finalblock) % 16)
- ans = ans + AesBlockEncrypt(key, (int(finalblock.hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big'))
- elif mode == 'CFB':
- if iv == '':
- iv = os.urandom(16)
- ans = ans + iv
- c = AesBlockEncrypt(key, iv)
- for i in range(0, len(blocks)):
- c = (int(blocks[i].hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big')
- ans = ans + c
- c = AesBlockEncrypt(key, c)
- if finalblock != b'':
- p = bytes(chr(16 - len(finalblock) % 16), 'utf-8')
- finalblock = finalblock + p * (16 - len(finalblock) % 16)
- ans = ans + (int(finalblock.hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big')
- elif mode == 'OFB':
- if iv == '':
- iv = os.urandom(16)
- ans = ans + iv
- c = AesBlockEncrypt(key, iv)
- for i in range(0, len(blocks)):
- ans = ans + (int(blocks[i].hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big')
- c = AesBlockEncrypt(key, c)
- if finalblock != b'':
- p = bytes(chr(16 - len(finalblock) % 16), 'utf-8')
- finalblock = finalblock + p * (16 - len(finalblock) % 16)
- ans = ans + (int(finalblock.hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big')
- elif mode == 'CTR':
- if iv == '':
- iv = os.urandom(16)
- ans = ans + iv
- for block in blocks:
- ans = ans + AesBlockEncrypt(key, (int(iv.hex(), 16) ^ int(block.hex(), 16)).to_bytes(16, 'big'))
- iv = (int(iv.hex(), 16) + 1).to_bytes(16, 'big')
- if finalblock != b'':
- p = bytes(chr(16 - len(finalblock) % 16), 'utf-8')
- finalblock = finalblock + p * (16 - len(finalblock) % 16)
- ans = ans + AesBlockEncrypt(key, (int(iv.hex(), 16) ^ int(finalblock.hex(), 16)).to_bytes(16, 'big'))
- return ans
- def AesDecrypt(key, data, mode):
- ans = b''
- blocks = [data[i:i + 16] for i in range(0, len(data) - 15, 16)]
- if mode == 'ECB':
- for block in blocks:
- ans = ans + AesBlockDecrypt(key, block)
- elif mode == 'CBC':
- for i in range(1, len(blocks)):
- c = (int(AesBlockDecrypt(key, blocks[i]).hex(), 16) ^ int(blocks[i - 1].hex(), 16)).to_bytes(16, 'big')
- ans = ans + c
- elif mode == 'CFB':
- for i in range(1, len(blocks)):
- ans = ans + (int(blocks[i].hex(), 16) ^ int(AesBlockEncrypt(key, blocks[i - 1]).hex(), 16)).to_bytes(16, 'big')
- elif mode == 'OFB':
- iv = blocks[0]
- c = AesBlockEncrypt(key, iv)
- for i in range(1, len(blocks)):
- ans = ans + (int(blocks[i].hex(), 16) ^ int(c.hex(), 16)).to_bytes(16, 'big')
- c = AesBlockEncrypt(key, c)
- elif mode == 'CTR':
- iv = blocks[0]
- for i in range(1, len(blocks)):
- ans = ans + (int(AesBlockDecrypt(key, blocks[i]).hex(), 16) ^ int(iv.hex(), 16)).to_bytes(16, 'big')
- iv = (int(iv.hex(), 16) + 1).to_bytes(16, 'big')
- return ans
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement