38 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import base64
 | 
						|
import hashlib
 | 
						|
from Crypto.Cipher import AES
 | 
						|
from Crypto import Random
 | 
						|
from Crypto.Util.Padding import pad, unpad
 | 
						|
from codes.common import clibs
 | 
						|
 | 
						|
 | 
						|
class PassCipher:
 | 
						|
    def __init__(self, salt):
 | 
						|
        salt = salt.encode("utf-8")
 | 
						|
        self.key = hashlib.sha256(salt).digest()
 | 
						|
 | 
						|
    def encrypt(self, plaintext):
 | 
						|
        plaintext = plaintext.encode("utf-8")
 | 
						|
        iv = Random.new().read(AES.block_size)
 | 
						|
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
 | 
						|
        ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))
 | 
						|
        return base64.b64encode(iv + ciphertext).decode("utf-8")
 | 
						|
 | 
						|
    def decrypt(self, ciphertext):
 | 
						|
        ciphertext = base64.b64decode(ciphertext)
 | 
						|
        iv = ciphertext[:AES.block_size]
 | 
						|
        ciphertext = ciphertext[AES.block_size:]
 | 
						|
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
 | 
						|
        plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)
 | 
						|
        return plaintext.decode("utf-8")
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def gen_salt(text: str):
 | 
						|
        key = ""
 | 
						|
        passwd = {idx: char for idx, char in enumerate(text * 4)}
 | 
						|
        for idx in range(32):
 | 
						|
            char_i = 0 if ord(passwd[idx]) - clibs.code_dict[idx] < 0 else ord(passwd[idx]) - clibs.code_dict[idx]
 | 
						|
            key += chr(char_i)
 | 
						|
        salt = base64.urlsafe_b64encode(key.encode()).decode()
 | 
						|
        return salt
 |