Шифрование Python AES без дополнительного модуля
Можно ли шифровать/дешифровать данные с помощью AES без установки дополнительных модулей? Мне нужно отправить/получить данные из C#
, который зашифрован с помощью ссылки System.Security.Cryptography
.
ОБНОВЛЕНИЕ Я попытался использовать PyAES, но это слишком старо. Я обновил некоторые вещи, чтобы сделать эту работу, но это не так. Я также не могу установить, потому что последняя версия - 3.3
а моя версия - 3.4
.
Ответы
Ответ 1
Доступные криптографические услуги, доступные в стандартной библиотеке являются теми. Как видите, AES
отсутствует в списке, но предлагается использовать pycrypto
который является дополнительным модулем.
Вам просто нужно установить его с помощью pip или easy_install, а затем, как показано на странице pycrypto:
from Crypto.Cipher import AES
obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
message = "The answer is no"
print obj.encrypt(message)
Единственный другой способ без использования дополнительного модуля состоял бы в том, чтобы закодировать функцию самостоятельно, но какая разница в загрузке дополнительного модуля и использовать его вместо этого?
Если вам нужна чистая реализация AES на Python, которую вы можете загрузить и импортировать, проверьте pyaes.
Ответ 2
Я использую библиотеку криптографии.
Криптография - это активно развивающаяся библиотека, которая обеспечивает криптографические рецепты и примитивы. Поддерживает Python 2.6-2.7, Python 3. 3+ и PyPy.
Вот пример того, как использовать эту библиотеку:
>>> import os
>>> from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
>>> from cryptography.hazmat.backends import default_backend
>>> backend = default_backend()
>>> key = os.urandom(32)
>>> iv = os.urandom(16)
>>> cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
>>> encryptor = cipher.encryptor()
>>> ct = encryptor.update(b"a secret message") + encryptor.finalize()
>>> decryptor = cipher.decryptor()
>>> decryptor.update(ct) + decryptor.finalize()
'a secret message'
Ответ 3
PYAES должен работать с любой версией Python3.x. Нет необходимости изменять библиотеку.
Вот полный рабочий пример для режима PTR для Pyaes для Python3.x(https://github.com/ricmoo/pyaes)
import pyaes
# A 256 bit (32 byte) key
key = "This_key_for_demo_purposes_only!"
plaintext = "Text may be any length you wish, no padding is required"
# key must be bytes, so we convert it
key = key.encode('utf-8')
aes = pyaes.AESModeOfOperationCTR(key)
ciphertext = aes.encrypt(plaintext)
# show the encrypted data
print (ciphertext)
# DECRYPTION
# CRT mode decryption requires a new instance be created
aes = pyaes.AESModeOfOperationCTR(key)
# decrypted data is always binary, need to decode to plaintext
decrypted = aes.decrypt(ciphertext).decode('utf-8')
# True
print (decrypted == plaintext)
Дайте мне знать, если вы получите какие-либо ошибки
Ответ 4
Ниже приведена автономная реализация AES, совместимая с Python 3.
Пример использования:
aesmodal = AESModeOfOperation()
key = [143,194,34,208,145,203,230,143,177,246,97,206,145,92,255,84]
iv = [103,35,148,239,76,213,47,118,255,222,123,176,106,134,98,92]
size = aesmodal.aes.keySize["SIZE_128"]
mode,orig_len,ciphertext = aesmodal.encrypt("Hello, world!", aesmodal.modeOfOperation["OFB"], key, size, iv)
print(ciphertext)
plaintext = aesmodal.decrypt(ciphertext, orig_len, mode, key, size, iv)
print(plaintext)
Ответ 5
Чтобы добавить к ответу @enrico.bacis: AES не реализована в стандартной библиотеке. Он реализован в библиотеке PyCrypto, которая стабильна и хорошо протестирована. Если вам нужен AES, добавьте PyCrypto в зависимости от вашего кода.
Хотя примитивы AES, теоретически, достаточно просты, что вы могли бы написать их реализацию в чистом Python, настоятельно рекомендуется, чтобы вы этого не делали. Это первое правило криптографии: не реализуйте его самостоятельно. В частности, если вы просто сворачиваете свою собственную криптографическую библиотеку, вы почти наверняка оставите себя открытой для какой-то атаки бокового канала.
Ответ 6
Python 3.6 с модулем криптографии
from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b"my deep dark secret")
print(token)
f.decrypt(token)