Files
NetAlertX/server/utils/crypto_utils.py
jokob-sk a98bac331d MERGE: resolve conflicts
Signed-off-by: jokob-sk <jokob.sk@gmail.com>
2025-11-10 10:11:34 +11:00

73 lines
2.3 KiB
Python

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
import os
import hashlib
import uuid
# SIMPLE CRYPT - requeres C compiler -------------------------------------------------------------------------
# def prepare_key(encryption_key):
# if len(encryption_key) < 32:
# encryption_key = (encryption_key * ((32 // len(encryption_key)) + 1))[:32]
# return encryption_key
# def encrypt_data(data, encryption_key):
# key = prepare_key(encryption_key)
# encrypted_data = encrypt(key, data)
# return encrypted_data
# def decrypt_data(data, encryption_key):
# key = prepare_key(encryption_key)
# decrypted_data = decrypt(key, data).decode('utf-8')
# return decrypted_data
# pycryptodome -------------------------------------------------------------------------
def prepare_key(encryption_key):
key = hashlib.sha256(encryption_key.encode()).digest()
return key
def encrypt_data(data, encryption_key):
key = prepare_key(encryption_key)
cipher = AES.new(key, AES.MODE_CBC)
ct_bytes = cipher.encrypt(pad(data.encode("utf-8"), AES.block_size))
iv = base64.b64encode(cipher.iv).decode("utf-8")
ct = base64.b64encode(ct_bytes).decode("utf-8")
return iv + ct
def decrypt_data(data, encryption_key):
key = prepare_key(encryption_key)
iv = base64.b64decode(data[:24])
ct = base64.b64decode(data[24:])
cipher = AES.new(key, AES.MODE_CBC, iv)
pt = unpad(cipher.decrypt(ct), AES.block_size)
return pt.decode("utf-8")
# -------------------------------------------------------------------------------
def get_random_bytes(length):
# Generate random bytes
random_bytes = os.urandom(length)
# Convert bytes to hexadecimal string
hex_string = random_bytes.hex()
# Format hexadecimal string with hyphens
formatted_hex = "-".join(
hex_string[i : i + 2] for i in range(0, len(hex_string), 2)
)
return formatted_hex
# -------------------------------------------------------------------------------
def generate_deterministic_guid(plugin, primary_id, secondary_id):
"""Generates a deterministic GUID based on plugin, primary ID, and secondary ID."""
data = f"{plugin}-{primary_id}-{secondary_id}".encode("utf-8")
return str(uuid.UUID(hashlib.md5(data).hexdigest()))