1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- # pycrypto необходим для AES
- # pip3 install pycrypto
- from Crypto.Cipher import AES
- import base64
- # Выравнивание шифруемой строки
- def paddingSetup(text):
- nLength = 16 - (len(text.encode('utf-8')) % 16)
- text += chr(nLength) * nLength
- return text
- # Удаление символов выравнивания
- def paddingRemove(text):
- textLen = len(text)
- if textLen == 0:
- return text
- asc = ord(text[-1])
- if asc >= 16:
- return text
- return text[0:-asc]
- # Алгоритм симметричного шифрования AES
- # Ключем шифрования является точка секрета, полученная из приватного и публичного ключа
- class CipherAES:
- def __init__(self, curve, secretPoint):
- # в качестве ключа используется хэш точки секрета
- self.key = secretPoint.md5()
- # в качестве инициализирующего вектора - урезанный хэш базовой точки подгруппы эллиптической кривой
- self.iv = curve.g.md5()
- # инициализация шировальщика
- def cipher(self):
- return AES.new(key=self.key, mode=AES.MODE_CBC, IV=self.iv)
- # Шифровка сообщения
- def encrypt(self, text):
- data = self.cipher().encrypt(bytes(paddingSetup(text), 'utf-8'))
- return str(base64.b64encode(data), 'utf-8')
- # Расшифровка сообщения
- def decrypt(self, encryptedText):
- data = base64.b64decode(encryptedText)
- bytes = self.cipher().decrypt(data)
- blank = str(bytes, 'utf-8').strip()
- return paddingRemove(blank)
|