def encrypt(data, key, iv):
    if (type(data) != str) & (type(data) != bytes):
        raise ValueError('Data is neither string nor bytes!')

    bsize = len(key)

    if len(data) % bsize != 0:
        raise ValueError('Length of data is not multiple of length of key!')

    if len(iv) != bsize:
        raise ValueError('Length of iv is not same as length of key!')

    blocks = [
        data[i:i + bsize] for i in range(0,
                                         len(data) - bsize + 1, bsize)
    ]
    cipher = Cipher(algorithms.AES(key),
                    modes.ECB(),
                    backend=default_backend())

    ctext_blocks = [iv]
    for i in range(0, len(blocks)):
        cur = blocks[i]
        prev = ctext_blocks[i]

        cur = bxor(cur, prev)
        cur = cipher.encryptor().update(cur)
        ctext_blocks.append(cur)

    ctext_blocks.pop(0)  # because this would be the iv block
    return b''.join(ctext_blocks)
def decrypt(data, desired):
    dat = data[len(data) - bsize:len(data)]
    result = [dat]
    for i in range(len(data), 0, -bsize):
        des = desired[i - bsize:i]
        decrypted_dat = CBC.decrypt(dat, key, iv)
        dat = bxor(des, decrypted_dat)
        result.append(dat)

    result.reverse()
    result = b"".join(result)
    return CBC.decrypt(result, key, iv)
示例#3
0
def main():
    filename = '10.txt'
    with open(filename, 'r') as f:
        data = b''.join((base64.b64decode(x.strip()) for x in f.readlines()))
        key = b'YELLOW SUBMARINE'
        iv = b'\x00' * len(key)

        # decrypt the test file
        d = decrypt(data, key, iv)
        with open(filename + '.out', 'wb') as outf:
            outf.write(d)

        # then encrypt it again and diff
        e = encrypt(d, key, iv)

        if e == data:
            print("VERIFIED!")
        else:
            print("ERROR - original differs from encrypted")
            print(bxor(d, e))
示例#4
0
def encrypt(data, key, iv):
    bsize = len(key)
    blocks = [
        data[i:i + bsize] for i in range(0,
                                         len(data) - bsize + 1, bsize)
    ]
    cipher = Cipher(algorithms.AES(key),
                    modes.ECB(),
                    backend=default_backend())

    ctext_blocks = [iv]
    for i in range(0, len(blocks)):
        cur = blocks[i]
        prev = ctext_blocks[i]

        cur = bxor(cur, prev)
        cur = cipher.encryptor().update(cur)
        ctext_blocks.append(cur)

    ctext_blocks.pop(0)  # because this would be the iv block
    return b''.join(ctext_blocks)
def decrypt(data, key, iv):

    if type(data) != bytes:
        raise ValueError('Data is not bytes type!')

    if type(key) != bytes:
        raise ValueError('Key is not bytes type!')

    if type(iv) != bytes:
        raise ValueError('iv is not bytes type!')

    data = iv + data
    bsize = len(key)

    if len(data) % bsize != 0:
        raise ValueError('Length of data is not a multiple of length of key!')

    if len(iv) != bsize:
        raise ValueError('Length of iv is not same as length of key!')

    blocks = [
        data[i:i + bsize] for i in range(0,
                                         len(data) - bsize + 1, bsize)
    ]
    cipher = Cipher(algorithms.AES(key),
                    modes.ECB(),
                    backend=default_backend())

    ptext_blocks = []
    for i in range(len(blocks) - 1, 0, -1):
        cur = blocks[i]
        prev = blocks[i - 1]

        cur = cipher.decryptor().update(cur)
        cur = bxor(cur, prev)
        ptext_blocks.append(cur)

    ptext_blocks.reverse()
    return b''.join(ptext_blocks)
示例#6
0
def decrypt(data, key, iv):
    data = iv + data
    bsize = len(key)
    blocks = [
        data[i:i + bsize] for i in range(0,
                                         len(data) - bsize + 1, bsize)
    ]
    cipher = Cipher(algorithms.AES(key),
                    modes.ECB(),
                    backend=default_backend())

    ptext_blocks = []
    for i in range(len(blocks) - 1, 0, -1):
        cur = blocks[i]
        prev = blocks[i - 1]

        cur = cipher.decryptor().update(cur)
        cur = bxor(cur, prev)
        ptext_blocks.append(cur)

    ptext_blocks.reverse()
    return b''.join(ptext_blocks)