pyCrypto:输入的长度必须是 16 的倍数
pyCrypto: Input must be a multiple of 16 in length
我正在尝试解密使用 "crypto-js" 编码的字符串并使用 "pyCrypto" 在 python 中对其进行解码。我已经按照各种博客上的确切步骤进行操作,但仍然出现相同的错误。
我关注的最后一个 Whosebug post 是
"CryptoJS and Pycrypto working together" @Artjom B 给出的答案。
也试过“https://chase-seibert.github.io/blog/2016/01/29/cryptojs-pycrypto-ios-aes256.html”
我的js代码是
var pass = CryptoJS.AES.encrypt(text, password_encrypt_key,
{
iv: password_encrypt_iv,
})
return password_encrypt_iv.concat(pass.ciphertext).toString(CryptoJS.enc.Base64);
我的 python 密码是
BLOCK_SIZE = 16
KEY = constants.PASSWORD_ENCRYPT_KEY
# IV = constants.PASSWORD_ENCRYPT_IV
IV = enc_password[:BLOCK_SIZE]
MODE = AES.MODE_CBC
enc_password = base64.b64decode(enc_password)
aes = AES.new(KEY, MODE, IV)
password = unpad(aes.decrypt(enc_password[BLOCK_SIZE:]))
取消填充功能
def unpad(s):
return s[:-ord(s[-1])]
我找到了解决方案。不确定这是如何工作的,而不是解决方案的其余部分,但无论如何都会发布它。解决方案也来自以下 link Artjom B 的回答。他给出了更好的解释。我也发布了相同的答案。
Link -
Javascript -
var KEY = encrypt_key;
var encrypted_txt_obj = CryptoJS.AES.encrypt(text, KEY);
return encrypted_txt_obj.toString();
python -
from Crypto.Cipher import AES
import base64
BLOCK_SIZE = 16
def bytes_to_key(data, salt, output=48):
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_text(enc):
try:
enc = base64.b64decode(enc)
assert enc[0:8] == b"Salted__"
salt = enc[8:16]
key_iv = bytes_to_key(encrypt_key, salt, 32 + 16)
key = key_iv[:32]
iv = key_iv[32:]
aes = AES.new(key, AES.MODE_CBC, iv)
text = unpad(aes.decrypt(enc[16:]))
return text
except Exception as e:
resp = jsonify({constants.ERR_SERVER: e.message})
resp.status_code = 403
logger.error("Exception %s", e.message)
return resp
def unpad(data):
return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))]
我正在尝试解密使用 "crypto-js" 编码的字符串并使用 "pyCrypto" 在 python 中对其进行解码。我已经按照各种博客上的确切步骤进行操作,但仍然出现相同的错误。
我关注的最后一个 Whosebug post 是 "CryptoJS and Pycrypto working together" @Artjom B 给出的答案。
也试过“https://chase-seibert.github.io/blog/2016/01/29/cryptojs-pycrypto-ios-aes256.html”
我的js代码是
var pass = CryptoJS.AES.encrypt(text, password_encrypt_key,
{
iv: password_encrypt_iv,
})
return password_encrypt_iv.concat(pass.ciphertext).toString(CryptoJS.enc.Base64);
我的 python 密码是
BLOCK_SIZE = 16
KEY = constants.PASSWORD_ENCRYPT_KEY
# IV = constants.PASSWORD_ENCRYPT_IV
IV = enc_password[:BLOCK_SIZE]
MODE = AES.MODE_CBC
enc_password = base64.b64decode(enc_password)
aes = AES.new(KEY, MODE, IV)
password = unpad(aes.decrypt(enc_password[BLOCK_SIZE:]))
取消填充功能
def unpad(s):
return s[:-ord(s[-1])]
我找到了解决方案。不确定这是如何工作的,而不是解决方案的其余部分,但无论如何都会发布它。解决方案也来自以下 link Artjom B 的回答。他给出了更好的解释。我也发布了相同的答案。
Link -
Javascript -
var KEY = encrypt_key;
var encrypted_txt_obj = CryptoJS.AES.encrypt(text, KEY);
return encrypted_txt_obj.toString();
python -
from Crypto.Cipher import AES
import base64
BLOCK_SIZE = 16
def bytes_to_key(data, salt, output=48):
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_text(enc):
try:
enc = base64.b64decode(enc)
assert enc[0:8] == b"Salted__"
salt = enc[8:16]
key_iv = bytes_to_key(encrypt_key, salt, 32 + 16)
key = key_iv[:32]
iv = key_iv[32:]
aes = AES.new(key, AES.MODE_CBC, iv)
text = unpad(aes.decrypt(enc[16:]))
return text
except Exception as e:
resp = jsonify({constants.ERR_SERVER: e.message})
resp.status_code = 403
logger.error("Exception %s", e.message)
return resp
def unpad(data):
return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))]