76 lines
2.0 KiB
Python
76 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
# Coded by [email protected]
|
|
|
|
# Import modules
|
|
from base64 import b64encode, b64decode
|
|
# Import packages
|
|
from core.models.accounts import clients_db
|
|
|
|
# Get encryption key
|
|
def GetEncryptionKey(owner: str) -> str:
|
|
response = clients_db.execute(
|
|
sql="SELECT key FROM encryption WHERE owner = ?",
|
|
values=[owner],
|
|
commit_changes=False
|
|
)
|
|
# Skip if empty
|
|
if len(response) == 0:
|
|
return ""
|
|
# Return values
|
|
else:
|
|
return response[0][0]
|
|
|
|
# Change encryption key
|
|
def SetEncryptionKey(owner: str, key: str):
|
|
clients_db.execute(
|
|
sql="UPDATE encryption SET key = ? WHERE owner = ?",
|
|
values=[key, owner],
|
|
commit_changes=True
|
|
)
|
|
|
|
class RC4Cipher:
|
|
""" RC4 encrypt/decrypt """
|
|
def __init__(self, key):
|
|
assert(isinstance(key, (bytes, bytearray)))
|
|
|
|
# key scheduling
|
|
S = list(range(0x100))
|
|
j = 0
|
|
for i in range(0x100):
|
|
j = (S[i] + key[i % len(key)] + j) & 0xff
|
|
S[i], S[j] = S[j], S[i]
|
|
self.S = S
|
|
|
|
def CryptBytes(self, data):
|
|
"""
|
|
Encrypts/decrypts data (It's the same thing!)
|
|
"""
|
|
assert(isinstance(data, (bytes, bytearray)))
|
|
return bytes([a ^ b for a, b in zip(data, self._keystream_generator())])
|
|
|
|
def Encrypt(self, string):
|
|
"""
|
|
Encrypts string
|
|
"""
|
|
return b64encode(self.CryptBytes(string.encode('utf8'))).decode('utf8')
|
|
|
|
def Decrypt(self, string):
|
|
"""
|
|
Decrypts string
|
|
"""
|
|
return self.CryptBytes(b64decode(string)).decode('utf8')
|
|
|
|
def _keystream_generator(self):
|
|
"""
|
|
Generator that returns the bytes of keystream
|
|
"""
|
|
S = self.S.copy()
|
|
x = y = 0
|
|
while True:
|
|
x = (x + 1) & 0xff
|
|
y = (S[x] + y) & 0xff
|
|
S[x], S[y] = S[y], S[x]
|
|
i = (S[x] + S[y]) & 0xff
|
|
yield S[i]
|