def mixcolumn(datalist):
    # according to the block length we do 2, 4 or 8 times the mix
    datalistmix = []
    for i in range(0, len(datalist) - 1, 2):
        m11 = Arithmod.add_64bits(Conversions.int2bin_str(datalist[i]), Conversions.int2bin_str(datalist[i + 1]))
        m11 = Conversions.bin_str2int(m11)

        rotation = Util.rotate_right(Conversions.int2bin_str(datalist[(i + 1)]), R)

        m22 = Arithmod.xor_bin_str(Conversions.int2bin_str(m11), Conversions.int2bin_str(rotation))
        m22 = Conversions.bin_str2int(m22)
        datalistmix.append(m11)
        datalistmix.append(m22)
    return datalistmix
def inv_mixcolumn(datalist):
    # according to the block length we do 2, 4 or 8 times the mix
    datalist_unmix = []
    for i in range(0, len(datalist) - 1, 2):
        xor = Arithmod.xor_bin_str(Conversions.int2bin_str(datalist[i]), Conversions.int2bin_str(datalist[(i + 1)]))
        m2 = Util.rotate_left(xor, R)
        m1 = Arithmod.subtract_64bits(Conversions.int2bin_str(datalist[i]), Conversions.int2bin_str(m2))
        m1 = Conversions.bin_str2int(m1)
        datalist_unmix.append(m1)
        datalist_unmix.append(m2)
    return datalist_unmix