我正在使用CryptoJS对从API获取的编码数据进行解密,数据来自节点js加密-js中的字符串格式。
这是我尝试过的
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad
make = make.json()['data']
key = "SecretPassphrase"
encrypted_make = self.decrypt(make,key)
def decrypt(self,encrypted, passphrase):
encrypted = base64.b64decode(encrypted)
IV = encrypted[:16]
aes = AES.new(passphrase.encode('utf-8'), AES.MODE_CFB, IV, segment_size=128)
return unpad(aes.decrypt(encrypted[16:]),aes.block_size)我得到了这个问题,{ValueError}Padding is incorrect.,我能知道我尝试错了什么吗?
发布于 2022-11-15 12:31:04
根据聊天中的讨论,我们发现这个问题与填充无关。实际上,它与解密密钥有关。
CryptoJS API将提供的密钥视为传递短语,而不是密钥。因此,它处理它以从它创建一个键。当使用这个密码作为Python端的解密密钥时,它会导致不一致的解码数据,因为解密密钥与从CryptoJS侧给定的密码短语生成的加密密钥不匹配。
根据CryptoJS文档,我们有三点:
b"Salted__"开始。为了将CryptoJS传递短语转换为密钥,下面的代码会有所帮助(摘自Github):
def bytes_to_key(data, salt="12345678"):
# Simplified version of M2Crypto.m2.bytes_to_key(). Based on:
# https://github.com/ajmirsky/M2Crypto/blob/master/M2Crypto/EVP.py#L105
# http://stackoverflow.com/questions/8008253/c-sharp-version-of-openssl-evp-bytestokey-method
assert len(salt) == 8, len(salt)
data += salt
key = md5(data).digest()
key += md5(key + data).digest()
return key然后解密逻辑主要保持不变,如下所示:
def bytes_to_key(data, salt, output=48):
assert len(salt) == 8, len(salt)
data += salt
key = md5(data).digest()
final_key = key
while len(final_key) < output:
key = md5(key + data).digest()
final_key += key
return final_key[:output]
def decrypt(encrypted, passphrase):
assert encrypted[0:8] == b"Salted__"
salt = encrypted[8:16]
key_iv = bytes_to_key(passphrase, salt, 32 + 16)
iv = key_iv[32:]
key = key_iv[:32]
aes = AES.new(key, AES.MODE_CBC, iv)
return unpad(aes.decrypt(encrypted[16:]), 16)https://stackoverflow.com/questions/74412900
复制相似问题