Files
Python-Obfuscation/utils/encryption.py
T
2025-08-15 20:12:35 -07:00

83 lines
2.9 KiB
Python

import base64
import hashlib
import random
from typing import Tuple
class StringEncryptor:
def __init__(self, primary_key: bytes, secondary_key: bytes, salt: bytes):
self.primary_key = primary_key
self.secondary_key = secondary_key
self.salt = salt
def hide_byte(self, b: int) -> str:
"""
Obfuscates a single byte as a random arithmetic or bitwise expression.
Used in the string encryption code to hide key bytes.
"""
pattern = random.randint(1, 5)
if pattern == 1:
x1, x2, x3 = [random.randint(65, 90) for _ in range(3)]
result = x1 ^ x2 ^ x3 ^ b
return f"({x1}^{x2}^{x3}^{result})"
elif pattern == 2:
base = random.randint(65, 90)
multiplier = random.randint(2, 4)
adjusted = (base * multiplier - b)
return f"(({base}*{multiplier}-{adjusted}))"
elif pattern == 3:
shift = random.randint(1, 3)
modified = (b << shift) >> shift
diff = b - modified
return f"((({b << shift})>>{shift})+{diff})"
elif pattern == 4:
char1, char2 = random.sample(range(65, 91), 2)
result = char1 + char2 - b
return f"({char1}+{char2}-{result})"
else:
mod_base = random.randint(91, 100)
result = b % mod_base
factor = b // mod_base
return f"({factor}*{mod_base}+{result})"
def encrypt_string(self, s: str) -> Tuple[str, str, str]:
"""
Encrypts a string with a multi-layer XOR scheme
and base85-encodes the result. Returns:
- encoded string,
- the code snippet that re-creates the keys in Python,
- the hex digest for the 'modifier'.
"""
data = s.encode('utf-8')
modifier = hashlib.sha256(self.salt + data).digest()[:8]
layer1 = bytes(
d ^ k ^ m
for d, k, m in zip(
data,
self.primary_key * ((len(data) // len(self.primary_key)) + 1),
modifier * ((len(data) // len(modifier)) + 1)
)
)
final_data = bytes(
d ^ k
for d, k in zip(
layer1,
self.secondary_key * ((len(layer1) // len(self.secondary_key)) + 1)
)
)
encoded = base64.b85encode(final_data).decode()
primary_key_code = f"bytes([{','.join(self.hide_byte(b) for b in self.primary_key)}])"
secondary_key_code = f"bytes([{','.join(self.hide_byte(b) for b in self.secondary_key)}])"
salt_code = f"bytes([{','.join(self.hide_byte(b) for b in self.salt)}])"
key_setup = (
f"_pk = {primary_key_code}\n"
f"_sk = {secondary_key_code}\n"
f"_st = {salt_code}"
)
return encoded, key_setup, modifier.hex()