web-dev-qa-db-ja.com

Python追加モジュールなしのAES暗号化

追加のモジュールをインストールせずにAESでデータを暗号化/復号化することは可能ですか? C#からデータを送受信する必要があります。これはSystem.Security.Cryptography参照で暗号化されています。

[〜#〜] update [〜#〜] PyAESを使用しようとしましたが、古すぎます。それを機能させるためにいくつか更新しましたが、機能しませんでした。また、最新バージョンは3.3ですが、私のバージョンは3.4であるため、インストールできません。

12
Anton

標準ライブラリで利用可能な暗号化サービスは those です。ご覧のとおり、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 を確認してください。

9
enrico.bacis

Cryptography ライブラリを使用しています。

暗号化は、暗号化のレシピとプリミティブを提供する、活発に開発されているライブラリです。 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'
7
Vlad Bezden

PYAESは、Python3.xのどのバージョンでも動作します。ライブラリを変更する必要はありません。

Python3.xのPyaes CTRモードの完全な動作例を次に示します( 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)

エラーが発生した場合はお知らせください

6
Alecz

Python と互換性のあるAESの自己完結型の実装です。

使用例:

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)
4
snowcrash09

@ enrico.bacisの回答に追加するには:AESは標準ライブラリに実装されていません。 PyCryptoライブラリに実装されており、安定しており、十分にテストされています。 AESが必要な場合は、コードの依存関係としてPyCryptoを追加します。

AESプリミティブは理論的には単純なものなので、純粋なPythonでの実装を記述できますが、stronglyを使用しないことをお勧めします。これが暗号の最初のルールです。自分で実装しないでください。特に、独自の暗号化ライブラリをローリングしているだけの場合は、ほぼ確実に何らかのサイドチャネル攻撃にさらされることになります。

3
MSmedberg

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)