Лучший способ сохранить данные — это шифрование. В статье рассмотрим асимметричное шифрование в Python на примере шифрования сообщений.
Еще по теме: Взлом WiFi на Python
Генерация ключа в Python
Асимметричное шифрование имеет два отличающихса друг от друга ключа. Один — открытый ключ для шифрования сообщения, а другой — закрытый ключ для дешифрования сообщения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
''' pip install pycryptodome ''' from Crypto.PublicKey import RSA key = RSA.generate(2048) privateKey = key.export_key() publicKey = key.publickey().export_key() # save private key to file with open('private.pem', 'wb') as f: f.write(privateKey) # save public key to file with open('public.pem', 'wb') as f: f.write(publicKey) print('Private key saved to private.pem') print('Public key saved to public.pem') print('Done') |
Приведенный выше код создаст два файла: private.pem и public.pem.
Сохраните открытый ключ (public.pem) для шифрования данных и закрытый ключ (private.pem) для расшифровки данных.
Функция шифрования
Эта функция имеет два аргумента для ввода: путь к файлу сообщения и путь к открытому ключу. Когда эта функция запущена, программа откроет файл сообщения и преобразует данные в байты. А также откроет публичный ключ, создат ключ со случайным значением и прикрепит его к зашифрованному файлу сообщения.
После того, как у нас есть ключ сеанса, шифруем его с помощью открытого ключа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
def encrypt(dataFile, publicKeyFile): ''' use EAX mode to allow detection of unauthorized modifications ''' # read data from file with open(dataFile, 'rb') as f: data = f.read() # convert data to bytes data = bytes(data) # read public key from file with open(publicKeyFile, 'rb') as f: publicKey = f.read() # create public key object key = RSA.import_key(publicKey) sessionKey = os.urandom(16) # encrypt the session key with the public key cipher = PKCS1_OAEP.new(key) encryptedSessionKey = cipher.encrypt(sessionKey) # encrypt the data with the session key cipher = AES.new(sessionKey, AES.MODE_EAX) ciphertext, tag = cipher.encrypt_and_digest(data) [] # save the encrypted data to file [ fileName, fileExtension ] = dataFile.split('.') encryptedFile = fileName + '_encrypted.' + fileExtension with open(encryptedFile, 'wb') as f: [ f.write(x) for x in (encryptedSessionKey, cipher.nonce, tag, ciphertext) ] print('Encrypted file saved to ' + encryptedFile) |
Функция расшифровки
Концепция такая же, как и у функции шифрования, но функция расшифровки работает наоборот.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
def decrypt(dataFile, privateKeyFile): ''' use EAX mode to allow detection of unauthorized modifications ''' # read private key from file with open(privateKeyFile, 'rb') as f: privateKey = f.read() # create private key object key = RSA.import_key(privateKey) # read data from file with open(dataFile, 'rb') as f: # read the session key encryptedSessionKey, nonce, tag, ciphertext = [ f.read(x) for x in (key.size_in_bytes(), 16, 16, -1) ] # decrypt the session key cipher = PKCS1_OAEP.new(key) sessionKey = cipher.decrypt(encryptedSessionKey) # decrypt the data with the session key cipher = AES.new(sessionKey, AES.MODE_EAX, nonce) data = cipher.decrypt_and_verify(ciphertext, tag) # save the decrypted data to file [ fileName, fileExtension ] = dataFile.split('.') decryptedFile = fileName + '_decrypted.' + fileExtension with open(decryptedFile, 'wb') as f: f.write(data) print('Decrypted file saved to ' + decryptedFile) |
Код в моем репозитории GitHub.
Заключение
Это простой проект на Python для асимметричного шифрования. Подобный способ шифрования используется шифровальщиками (см. также Как написать шифровальщик на Python).
Еще по теме: Использование pynput для создания кейлоггера на Python