crypt.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. # pycrypto необходим для AES
  2. # pip3 install pycrypto
  3. from Crypto.Cipher import AES
  4. import base64
  5. # Выравнивание шифруемой строки
  6. def paddingSetup(text):
  7. nLength = 16 - (len(text.encode('utf-8')) % 16)
  8. text += chr(nLength) * nLength
  9. return text
  10. # Удаление символов выравнивания
  11. def paddingRemove(text):
  12. textLen = len(text)
  13. if textLen == 0:
  14. return text
  15. asc = ord(text[-1])
  16. if asc >= 16:
  17. return text
  18. return text[0:-asc]
  19. # Алгоритм симметричного шифрования AES
  20. # Ключем шифрования является точка секрета, полученная из приватного и публичного ключа
  21. class CipherAES:
  22. def __init__(self, curve, secretPoint):
  23. # в качестве ключа используется хэш точки секрета
  24. self.key = secretPoint.md5()
  25. # в качестве инициализирующего вектора - урезанный хэш базовой точки подгруппы эллиптической кривой
  26. self.iv = curve.g.md5()
  27. # инициализация шировальщика
  28. def cipher(self):
  29. return AES.new(key=self.key, mode=AES.MODE_CBC, IV=self.iv)
  30. # Шифровка сообщения
  31. def encrypt(self, text):
  32. data = self.cipher().encrypt(bytes(paddingSetup(text), 'utf-8'))
  33. return str(base64.b64encode(data), 'utf-8')
  34. # Расшифровка сообщения
  35. def decrypt(self, encryptedText):
  36. data = base64.b64decode(encryptedText)
  37. bytes = self.cipher().decrypt(data)
  38. blank = str(bytes, 'utf-8').strip()
  39. return paddingRemove(blank)