是否可以在不安装额外模块的情况下使用AES加密/解密数据?我需要发送/接收使用 System.Security.Cryptography
引用进行加密的数据到 C#
。
更新
我尝试使用了PyAES,但它太旧了。我更新了一些东西使其工作,但没有成功。
我也不能安装,因为它的最新版本是3.3
,而我的版本是3.4
。
是否可以在不安装额外模块的情况下使用AES加密/解密数据?我需要发送/接收使用 System.Security.Cryptography
引用进行加密的数据到 C#
。
更新
我尝试使用了PyAES,但它太旧了。我更新了一些东西使其工作,但没有成功。
我也不能安装,因为它的最新版本是3.3
,而我的版本是3.4
。
我正在使用 加密 库。
加密是一个活跃开发的库,提供了密码学配方和基元。它支持 Python 2.6-2.7、Python 3.3+ 和 PyPy。
{{link2:请参阅此文档} }以获取如何使用该库的示例:
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
# Pseudo-random key and initialisation vector
key = os.urandom(32) # (32*8=256-bit. AES also accepts 128/192-bit)
init_vector = os.urandom(16) # (16*8=128-bit. AES only accepts this size)
# Setup module-specific classes
cipher = Cipher(algorithms.AES(key), modes.CBC(init_vector))
encryptor = cipher.encryptor()
decryptor = cipher.decryptor()
# Encrypt and decrypt data
cyphertext = encryptor.update(b"a secret message") + encryptor.finalize()
plaintext = decryptor.update(cyphertext) + decryptor.finalize()
print(plaintext) # 'a secret message'
一些解释示例代码的注释:
os.urandom
来进行安全操作,而不是Python的random
模块。更多详情请参见此答案。cryptography
模块相关的类,例如algorithms
或modes
:“Cipher对象将AES等算法与CBC或CTR等模式结合起来。”backend
对象。自36.0版本以来,该对象已弃用。PYAES可以与任何版本的Python3.x一起使用,不需要修改库。
以下是pyaes CTR模式的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)
如果您遇到任何错误,请告诉我。
AES
没有列出,但建议使用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)
如果不使用额外的模块,唯一的另一种方法就是自己编写这个函数,但下载一个额外的模块并使用它有什么区别呢?
如果您想要一个纯Python实现的AES,可以下载和导入pyaes,请查看pyaes。
使用示例:
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)
print plaintext
,所以在 Python 3 中会出现问题。我认为你需要将其作为一个函数调用。 - ElectronPython 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)
ctypes
访问Windows加密API,或者使用openssl
。但使用一个易于操作的模块会更好。您不想使用这样的模块有原因吗?(请注意,官方文档明确指出pycrypto
可用于此类操作。) - abarnertC#
部分已经可以工作,问题出在 Python 上。我总是在安装 Python 模块时遇到麻烦,所以如果有可能不使用额外的模块来使用 AES 就最好了。加密/解密的速度最多可以达到 200ms,这是为了聊天而设计的。 - Antonpip
或Christoph Gohlke 的Windows二进制包仓库,那就了解一下它们。 - abarnertSystem.Security.Cryptography
。 - abarnert