Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的AES加密_Python_Aes_Python 3.7 - Fatal编程技术网

Python中的AES加密

Python中的AES加密,python,aes,python-3.7,Python,Aes,Python 3.7,我的主要目标是将此javascript重写为python password = "AAAABBBBCCCC"; passwordMd5 = CryptoJS.MD5(password); //e1b6b2b3211076a71632bbf2ad0edc05 passwordKey = CryptoJS.SHA256(CryptoJS.SHA256(passwordMd5 + data.v1) + data.v2); //4a5148da63f40e1bcd3e3225f9b7

我的主要目标是将此javascript重写为python

password = "AAAABBBBCCCC";
passwordMd5 = CryptoJS.MD5(password); 
    //e1b6b2b3211076a71632bbf2ad0edc05
passwordKey = CryptoJS.SHA256(CryptoJS.SHA256(passwordMd5 + data.v1) + data.v2); 
    //4a5148da63f40e1bcd3e3225f9b79412b7aee745f4b7f831b9d0893d0d6d666f
encryptedPassword = CryptoJS.AES.encrypt(passwordMd5, passwordKey, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.NoPadding});
    //U2FsdGVkX198V2FiYyEGAKISlXBcmad7V0scbooxQ8QMSmp84vtyAfHytynX2mrw
encryptedPassword = CryptoJS.enc.Base64.parse(encryptedPassword.toString()).toString(CryptoJS.enc.Hex);
//53616c7465645f5f7c57616263210600a21295705c99a77b574b1c6e8a3143c40c4a6a7ce2fb7201f1f2b729d7da6af0
这是我用python编写的代码

passwordMd5 = hashlib.md5(password.encode("utf-8")).hexdigest()
# e1b6b2b3211076a71632bbf2ad0edc05
passwordKey = hashlib.sha256((hashlib.sha256((passwordMd5 + prelogin["v1"]).encode("utf-8")).hexdigest() + prelogin["v2"]).encode("utf-8")).hexdigest()
# 4a5148da63f40e1bcd3e3225f9b79412b7aee745f4b7f831b9d0893d0d6d666f
cipher = AESCipher(passwordKey)
encryptedPassword = cipher.encrypt(passwordMd5)
print(encryptedPassword)
AESCipher.py(原件:)

当我尝试运行它时,它会给我错误:

 Traceback (most recent call last):
  File "main.py", line 97, in <module>
    encryptedPassword = cipher.encrypt(passwordMd5)
  File "AESCipher.py", line 31, in encrypt
    cipher = AES.new(self.key, AES.MODE_ECB)
  File "python\lib\site-packages\Crypto\Cipher\AES.py", line 206, in new
    return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs)
File "python\lib\site-packages\Crypto\Cipher\__init__.py", line 79, in _create_cipher
    return modes[mode](factory, **kwargs)
  File "python\lib\site-packages\Crypto\Cipher\_mode_ecb.py", line 177, in _create_ecb_cipher
    cipher_state = factory._create_base_cipher(kwargs)
  File "python\lib\site-packages\Crypto\Cipher\AES.py", line 92, in _create_base_cipher
    raise ValueError("Incorrect AES key length (%d bytes)" % len(key))
ValueError: Incorrect AES key length (64 bytes)
回溯(最近一次呼叫最后一次):
文件“main.py”,第97行,在
encryptedPassword=cipher.encrypt(密码MD5)
encrypt中第31行的文件“aesciper.py”
密码=AES.new(self.key,AES.MODE_ECB)
文件“python\lib\site packages\Crypto\Cipher\AES.py”,第206行,新格式
返回\u创建\u密码(sys.modules[\uuuuuuuu name\uuuuuuuuu],key,mode,*args,**kwargs)
文件“python\lib\site packages\Crypto\Cipher\\uuuu init\uuuu.py”,第79行,在\u create\u Cipher中
返回模式[模式](工厂,**kwargs)
文件“python\lib\site packages\Crypto\Cipher\\模式\u ecb.py”,第177行,在\u create\u ecb\u Cipher中
密码状态=工厂。创建基本密码(kwargs)
文件“python\lib\site packages\Crypto\Cipher\AES.py”,第92行,在\u create\u base\u Cipher中
raise VALUERROR(“不正确的AES密钥长度(%d字节)”%len(密钥))
ValueError:AES密钥长度不正确(64字节)
我知道密钥的长度是64字节,但是javascript版本使用相同的
密码密钥
工作得非常好


我不知道我的代码有什么问题,请帮忙

实际上AES密钥的长度应该是16、24或32字节

您正在使用sha256哈希的hexdigest作为键,这将产生一个64字节的字符串。 相反,请执行以下操作:

password = (hashlib.sha256((passwordMd5 + prelogin["v1"])).hexdigest() + prelogin["v2"])
passwordKey = hashlib.sha256(password).digest()

这样做:
unpad=lambda s:s[:-ord(s[len(s)-1:])]
是一种可怕的做法。为什么不创建一个合适的方法呢?在哪里定义了预登录变量?我想是Python 2吧?为什么要用密码做这些奇怪的事情?它看起来就像是通过将一系列功能组合在一起并希望达到最佳效果而设计的。非常感谢!但是它给了我错误的加密密码值。也许你可以使用md5而不是SHA256。现在我更了解你想要实现的目标。。查看我的最新答案Python3实现这一点的方法是
int.from_bytes(hashlib.sha256(…).digest(),byteorder='big')
非常感谢@curiouz_k0d3r,但它给我带来了另一个错误:
TypeError:int类型的对象在
文件“python\lib\site packages\Crypto\Cipher\AES.py”第91行没有len()
,如果len(密钥)不在密钥大小中,则在\u创建\u基本\u密码
password = (hashlib.sha256((passwordMd5 + prelogin["v1"])).hexdigest() + prelogin["v2"])
passwordKey = hashlib.sha256(password).digest()