def ctr_encrypt(key, data, iv): num_of_get_blocks = 0 if iv is None: nonce = os.urandom(4) iv = init_vec_ctr(nonce, 0, num_of_get_blocks) encrypt_arr = bytearray() start = 0 last = 16 is_final_block = False num_of_blocks = how_many_blocks(data) encrypt_arr.extend(bytearray(iv)) while num_of_get_blocks != num_of_blocks: if num_of_get_blocks == num_of_blocks - 1: is_final_block = True if is_final_block is False: encrypt_arr.extend( bytearray( xor_two_arr( data[start:last], aes_block_encrypt(key, iv, is_final_block, None)))) num_of_get_blocks += 1 start += 16 last += 16 iv = iv[0:12] + (int_to_bytes_4(bytes_to_int(iv[12:16]) + 1)) if is_final_block is True: encrypt_arr.extend( bytearray( xor_two_arr( data[start:], aes_block_encrypt(key, iv, is_final_block, None)))) num_of_get_blocks += 1 return encrypt_arr
def ctr_decrypt(key, data, iv): if iv is None: iv = data[0:16] data = data[16:] num_of_get_blocks = 0 decrypt_arr = bytearray() start = 0 last = 16 is_final_block = False num_of_blocks = how_many_blocks(data) while num_of_get_blocks != num_of_blocks: if num_of_get_blocks == num_of_blocks - 1: is_final_block = True if is_final_block is False: decrypt_arr.extend( bytearray( xor_two_arr( data[start:last], aes_block_encrypt(key, iv, is_final_block, None)))) num_of_get_blocks += 1 start += 16 last += 16 iv = iv[0:12] + (int_to_bytes_4(bytes_to_int(iv[12:16]) + 1)) if is_final_block is True: decrypt_arr.extend( bytearray( xor_two_arr( data[start:], aes_block_encrypt(key, iv, is_final_block, None)))) num_of_get_blocks += 1 return decrypt_arr
def compute_mac(self, data): start = 0 last = block_size num_of_blocks = how_many_blocks(data) while self.__num_of_get_blocks != num_of_blocks - 1: self._mac_add_block(data[start:last]) start += block_size last += block_size self._mac_add_block(data[start:]) result = self._mac_finalize() return result
def cbc_decrypt(key, data, iv): decrypt_arr = bytearray() if iv is None: iv = data[0:16] data = data[16:] start = 0 last = 16 is_final_block = False num_of_blocks = how_many_blocks(data) num_of_get_blocks = 0 if num_of_blocks == 1: is_final_block = True padding = get_pad_pkcs_7(data, block_size) help_arr = aes_block_decrypt(key, data, is_final_block, padding) decrypt_arr.extend(bytearray(xor_two_arr(iv, help_arr))) else: padding = get_pad_pkcs_7(data[start:last], block_size) decrypt_arr.extend( xor_two_arr( iv, aes_block_decrypt(key, data[start:last], is_final_block, padding))) start += 16 last += 16 num_of_get_blocks += 1 while num_of_get_blocks != num_of_blocks: if num_of_get_blocks == num_of_blocks - 1: is_final_block = True if is_final_block is False: padding = None help_arr = data[start - 16:last - 16] decrypt_arr.extend( bytearray( xor_two_arr( help_arr, aes_block_decrypt(key, data[start:last], is_final_block, padding)))) start += 16 last += 16 num_of_get_blocks += 1 if is_final_block is True: help_arr = data[start - 16:last - 16] padding = get_pad_pkcs_7(data[start:], block_size) decrypt_arr.extend( bytearray( xor_two_arr( help_arr, aes_block_decrypt(key, data[start:], is_final_block, padding)))) num_of_get_blocks += 1 return decrypt_arr
def cbc_encrypt(key, data, iv): encrypt_arr = bytearray() if iv is None: iv = os.urandom(16) num_of_get_blocks = 0 start = 0 last = 16 is_final_block = False num_of_blocks = how_many_blocks(data) encrypt_arr.extend(bytearray(iv)) if num_of_blocks == 1: is_final_block = True padding = get_pad_pkcs_7(data, block_size) data = arr_pad(data, padding) data = xor_two_arr(data, iv) padding = get_pad_pkcs_7(data, block_size) encrypt_arr.extend( bytearray(aes_block_encrypt(key, data, is_final_block, padding))) else: padding = None help_arr = aes_block_encrypt(key, xor_two_arr(data[start:last], iv), is_final_block, padding) encrypt_arr.extend(bytearray(help_arr)) num_of_get_blocks += 1 start += 16 last += 16 while num_of_get_blocks != num_of_blocks: if num_of_get_blocks == num_of_blocks - 1: is_final_block = True if is_final_block is False: padding = None help_arr = aes_block_encrypt( key, xor_two_arr(help_arr, data[start:last]), is_final_block, padding) encrypt_arr.extend(bytearray(help_arr)) num_of_get_blocks += 1 start += 16 last += 16 if is_final_block is True: padding = get_pad_pkcs_7(data[start:], block_size) help_arr = aes_block_encrypt( key, xor_two_arr(help_arr, arr_pad(data[start:], padding)), is_final_block, None) encrypt_arr.extend(bytearray(help_arr)) num_of_get_blocks += 1 return encrypt_arr
def cfb_decrypt(key, data, iv): if iv is None: iv = data[0:16] data = data[16:] decrypt_arr = bytearray() num_of_get_blocks = 0 start = 0 last = 16 is_final_block = False num_of_blocks = how_many_blocks(data) if num_of_blocks == 1: help_arr = xor_two_arr( data[start:], aes_block_encrypt(key, iv, is_final_block, None)) decrypt_arr.extend(bytearray(help_arr)) else: help_arr = data[start:last] decrypt_arr.extend( bytearray( xor_two_arr(help_arr, aes_block_encrypt(key, iv, is_final_block, None)))) num_of_get_blocks += 1 start += 16 last += 16 while num_of_get_blocks != num_of_blocks: if num_of_get_blocks == num_of_blocks - 1: is_final_block = True if is_final_block is False: decrypt_arr.extend( bytearray( xor_two_arr( data[start:last], aes_block_encrypt(key, help_arr, is_final_block, None)))) help_arr = data[start:last] num_of_get_blocks += 1 start += 16 last += 16 if is_final_block is True: decrypt_arr.extend( bytearray( xor_two_arr( data[start:], aes_block_encrypt(key, help_arr, is_final_block, None)))) num_of_get_blocks += 1 return decrypt_arr
def compute_mac(self, data): num_of_get_blocks = 0 start = 0 last = block_size num_of_blocks = how_many_blocks(data) while num_of_get_blocks != num_of_blocks: if num_of_get_blocks == num_of_blocks - 1: self.__is_finalized = True if num_of_get_blocks != num_of_blocks - 1: self._mac_add_block(data[start:last]) start += block_size last += block_size num_of_get_blocks += 1 else: padding = get_pad_pkcs_5(data[start:], block_size) final_block = arr_concat_pad(data[start:], padding) self._mac_add_block(final_block) num_of_get_blocks += 1 return self.mac_finalize()
def cfb_encrypt(key, data, iv): if iv is None: iv = os.urandom(16) encrypt_arr = bytearray() num_of_get_blocks = 0 start = 0 last = 16 is_final_block = False num_of_blocks = how_many_blocks(data) encrypt_arr.extend(bytearray(iv)) if num_of_blocks == 1: help_arr = aes_block_encrypt(key, iv, is_final_block, None) encrypt_arr.extend(bytearray(xor_two_arr(data[start:], help_arr))) else: help_arr = xor_two_arr( data[start:last], aes_block_encrypt(key, iv, is_final_block, None)) encrypt_arr.extend(bytearray(help_arr)) num_of_get_blocks += 1 start += 16 last += 16 while num_of_get_blocks != num_of_blocks: if num_of_get_blocks == num_of_blocks - 1: is_final_block = True if is_final_block is False: help_arr = xor_two_arr( data[start:last], aes_block_encrypt(key, help_arr, is_final_block, None)) encrypt_arr.extend(bytearray(help_arr)) num_of_get_blocks += 1 start += 16 last += 16 if is_final_block is True: help_arr = xor_two_arr( data[start:], aes_block_encrypt(key, help_arr, is_final_block, None)) encrypt_arr.extend(bytearray(help_arr)) num_of_get_blocks += 1 return encrypt_arr
def ecb_encrypt(key, data, iv=None): decrypt_arr = bytearray() num_of_blocks = how_many_blocks(data) num_of_get_blocks = 0 start = 0 last = 16 is_final_block = False while num_of_get_blocks != num_of_blocks: if num_of_get_blocks == num_of_blocks - 1: is_final_block = True if is_final_block is False: padding = None decrypt_arr.extend(bytearray(aes_block_decrypt(key, data[start:last], is_final_block, padding))) num_of_get_blocks += 1 start += 16 last += 16 if is_final_block is True: padding = get_pad_pkcs_7(data[start:], block_size) decrypt_arr.extend(bytearray(aes_block_decrypt(key, data[start:], is_final_block, padding))) num_of_get_blocks += 1 return decrypt_arr
def process_data(self, data): if self.__is_encrypt_arr: is_final_block = False num_of_get_blocks = 0 start = 0 last = 16 encrypt_arr = bytearray() num_of_blocks = how_many_blocks(data) encrypt_arr.extend(self.__iv) while num_of_get_blocks != num_of_blocks: if num_of_get_blocks == num_of_blocks - 1: is_final_block = True if is_final_block is False: encrypt_arr.extend( self._add_block(data[start:last], self.__iv, is_final_block, None)) num_of_get_blocks += 1 start += 16 last += 16 self.__iv = self.__iv[0:12] + ( int_to_bytes_4(bytes_to_int(self.__iv[12:16]) + 1)) if is_final_block is True: encrypt_arr.extend( self._add_block(data[start:], self.__iv, is_final_block, None)) num_of_get_blocks += 1 encrypt_arr.extend(self.__Hmac_encrypt.digest()) return encrypt_arr elif self.__is_encrypt_arr is False: decrypt_arr = bytearray() get_hmac = data[len(data) - 16:] iv = data[0:16] data = data[16:len(data) - 16] num_of_get_blocks = 0 start = 0 last = 16 is_final_block = False num_of_blocks = how_many_blocks(data) while num_of_get_blocks != num_of_blocks: if num_of_get_blocks == num_of_blocks - 1: is_final_block = True if is_final_block is False: decrypt_arr.extend( self._add_block(data[start:last], iv, is_final_block, None)) num_of_get_blocks += 1 start += 16 last += 16 iv = iv[0:12] + ( int_to_bytes_4(bytes_to_int(iv[12:16]) + 1)) if is_final_block is True: final = self._add_block(data[start:], iv, is_final_block, get_hmac) if final is not None: decrypt_arr.extend(final) else: decrypt_arr = [] num_of_get_blocks += 1 if len(decrypt_arr) != 0: return decrypt_arr else: return []