initial commit
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
#!/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]
|
||||
Reference in New Issue
Block a user