from Cryptodome.Cipher import DES3
from Cryptodome.Util import Padding
from Cryptodome.Random.random import choice
[docs]
def get_random_key(bytes: int) -> str:
"""Generate a random key from a list of characters.
Parameters
----------
bytes : int
The number of bytes of the key.
Returns
-------
str
Random key.
"""
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_abcdefghijklmnopqrstuvwxyz"
return ''.join([choice(chars) for _ in range(bytes)])
[docs]
def des_encrypt(plain_text: str):
"""Encrypt text with a random key using Triple DES.
Parameters
----------
plain_text : str
Text to be encrypted.
Returns
-------
str
Encrypted text.
"""
key = get_random_key(24)
cipher = DES3.new(key.encode("ascii"), DES3.MODE_ECB)
encrypted = cipher.encrypt(Padding.pad(plain_text.encode("utf8"), 8))
return f"{(encrypted).hex()}@{key}"
[docs]
def des_decrypt(encrypted : str):
"""Decrypt text using Triple DES.
Parameters
----------
encrypted : str
Encrypted text.
Returns
-------
str
Decrypted plain text.
"""
encrypted_text, key = encrypted.split("@")
cipher = DES3.new(key.encode("ascii"), DES3.MODE_ECB)
decrypted = cipher.decrypt(bytes.fromhex(encrypted_text))
return Padding.unpad(decrypted, 8).decode("utf8")
[docs]
def roc_year_to_wastern(date_text : str) -> str:
"""Convert ROC year to wastern year.
Parameters
----------
date_text : str
`yyy...`.
Returns
-------
str
`yyyy...`
"""
assert len(date_text) >= 7, "The `date_text` should be in `yyy...` format."
return f"{ str( 1911 + int(date_text[0:3])) }{date_text[3:]}"