Шифрование 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)