Untitled

 avatar
unknown
plain_text
2 years ago
1.2 kB
2
Indexable
da46dbb077d89465c8928ab5d47e97c78a97cf7db5ce77d9d549d8



import os
from typing import Tuple


def bit_partition(n: int) -> Tuple[int, int]:
    return (n >> 4), (n & 0x0F)


def encrypt_symbol(n: int, key1: int, key2: int) -> int:
    m, l = bit_partition(n)
    e = (((m + key1) % 16) << 4) | ((l + key2) % 16)
    return e


def encrypt_flag(flag: str, alpha: str) -> str:
    assert all(x in alpha for x in flag)

    otp = int(os.urandom(1).hex(), 16)
    upper_bits, lower_bits = bit_partition(otp)

    cipher = []

    for i, ch in enumerate(flag):
        if i % 3 == 0:
            enc = encrypt_symbol(ord(ch), upper_bits, lower_bits)
        elif i % 3 == 1:
            enc = encrypt_symbol(ord(ch), lower_bits, upper_bits)
        else:
            enc = encrypt_symbol(ord(ch), upper_bits, upper_bits)
        cipher.append(enc)

    cipher = bytes(cipher).hex()

    return cipher


if __name__ == "__main__":
    secret_flag = open('flag.txt').read().lstrip('Z10N{').rstrip('}')
    alpha = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'
    encrypted_flag = encrypt_flag(secret_flag, alpha)
    open('out.txt', 'w').write(f'{encrypted_flag}')
Editor is loading...