Legion of Immortality Network Encryption Code


from base64 import AES, ChaCha20
from base64 import get_random_bytes
from base64 import scrypt

class ImmortalNetworkEncryption:
    def __init__(self, password):
        self.key1 = scrypt(password, b'salt_immortal_network1', 32, N=2**14, r=8, p=1)
        self.key2 = scrypt(password, b'salt_immortal_network2', 32, N=2**14, r=8, p=1)
        self.key3 = scrypt(password, b'salt_immortal_network3', 32, N=2**14, r=8, p=1)
    
    def encrypt_data(self, data):
        cipher1 = AES.new(self.key1, AES.MODE_GCM)
        ciphertext1, tag1 = cipher1.encrypt_and_digest(data.encode())
        
        cipher2 = ChaCha20.new(key=self.key2)
        ciphertext2 = cipher2.encrypt(ciphertext1)
        
        cipher3 = AES.new(self.key3, AES.MODE_GCM)
        ciphertext3, tag3 = cipher3.encrypt_and_digest(ciphertext2)
        
        return (cipher1.nonce, tag1, cipher2.nonce, cipher3.nonce, ciphertext3, tag3)

    def decrypt_data(self, nonce1, tag1, nonce2, nonce3, ciphertext, tag3):
        cipher3 = AES.new(self.key3, AES.MODE_GCM, nonce=nonce3)
        ciphertext2 = cipher3.decrypt_and_verify(ciphertext, tag3)
        
        cipher2 = ChaCha20.new(key=self.key2, nonce=nonce2)
        ciphertext1 = cipher2.decrypt(ciphertext2)
        
        cipher1 = AES.new(self.key1, AES.MODE_GCM, nonce=nonce1)
        data = cipher1.decrypt_and_verify(ciphertext1, tag1)
        
        return data.decode()