【问题标题】:pyCrypto: Input must be a multiple of 16 in lengthpyCrypto:输入长度必须是 16 的倍数
【发布时间】:2018-09-05 09:12:20
【问题描述】:

我正在尝试解密使用“crypto-js”编码的字符串,并使用“pyCrypto”在 python 中对其进行解码。我已经按照各种博客上的确切步骤进行操作,但仍然出现同样的错误。

我关注的最后一篇 stackoverflow 帖子是 “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])]

【问题讨论】:

  • 您的密钥长度必须正好为 16 个字节。
  • 16 个字节为 16 个字符,是的,我已经尝试过了

标签: javascript python pycrypto cryptojs


【解决方案1】:

我找到了解决方案。不确定这是如何工作的,而不是解决方案的其余部分,但无论如何都会发布它。解决方案也来自Artjom B的以下链接答案。他给出了更好的解释。我也发布了相同的答案。

链接 - How to decrypt password from JavaScript CryptoJS.AES.encrypt(password, passphrase) in Python

Javascript -

var KEY = encrypt_key;
var encrypted_txt_obj = CryptoJS.AES.encrypt(text, KEY);
return encrypted_txt_obj.toString();

蟒蛇-

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]))]

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 1970-01-01
    • 2018-03-14
    • 2012-05-16
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多