예제 #1
0
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
예제 #2
0
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
예제 #3
0
    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
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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
예제 #7
0
 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()
예제 #8
0
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
예제 #9
0
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
예제 #10
0
    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 []