Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.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
Javascript 在Cryptodome python中解密CyproJS AES加密_Javascript_Python 3.x_Encryption_Cryptojs_Postman Pre Request Script - Fatal编程技术网

Javascript 在Cryptodome python中解密CyproJS AES加密

Javascript 在Cryptodome python中解密CyproJS AES加密,javascript,python-3.x,encryption,cryptojs,postman-pre-request-script,Javascript,Python 3.x,Encryption,Cryptojs,Postman Pre Request Script,我正在尝试解密在JavaScript中使用CryptoJS编码的消息(python)。我已经用python创建了一个API,用postman预请求脚本发布数据 我得到的错误是: ValueError:在CBC模式下,数据必须填充到16字节边界 用于加密的JavaScript代码 var data = {"feature_0": 0, "feature_1": 0, "feature_2"

我正在尝试解密在JavaScript中使用CryptoJS编码的消息(python)。我已经用python创建了一个API,用postman预请求脚本发布数据

我得到的错误是:

ValueError:在CBC模式下,数据必须填充到16字节边界

用于加密的JavaScript代码

var data = {"feature_0": 0,
            "feature_1": 0, 
            "feature_2": 0, 
            "feature_3": 0, 
            "feature_4": 0, 
            "feature_5": 0
           };
let password = "lazydog";
let salt = "salt";
let iterations = 128;
data = JSON.stringify(data);
let len = 16 - ((data.length) % 16);
data += len.toString().repeat(len);  --> removed (as suggested)
let bytes = CryptoJS.PBKDF2(password, salt, { keySize: 48, iterations: iterations });
let iv = CryptoJS.enc.Hex.parse(bytes.toString().slice(0, 32));
let key = CryptoJS.enc.Hex.parse(bytes.toString().slice(32, 96));

let encrypted = CryptoJS.AES.encrypt(data, key, {iv: iv}); //, mode: CryptoJS.mode.CBC
//encrypted = btoa(encrypted); --> removed (as suggested)
encrypted = encrypted.toString() -->added (as suggested)
postman.setGlobalVariable("data", encrypted);
用于解密的python代码:

def decode(encrypted):
    data = b64decode(encrypted)  
    byte = PBKDF2("lazydog".encode("utf-8"), "salt".encode("utf-8"), 48, 128)
    iv = byte[0:16]
    key = byte[16:48]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    text = cipher.decrypt(data) ## error is at this line
    text = text[:-text[-1]].decode("utf-8")

    return text
正如错误所说的填充问题,我在JS代码中添加了填充。我仍然没有得到好的结果。
我在这里怎么了?

加密字符串已发布到用python编写的API。 我不知道为什么,但当加密传递到python时,“+”字符被替换为“”(空格)。通过用“+”字符替换空格,我解决了这个问题

代码

var data = {"feature_0": 0,
        "feature_1": 0, 
        "feature_2": 0, 
        "feature_3": 0, 
        "feature_4": 0, 
        "feature_5": 0
       };
let password = "lazydog";
let salt = "salt";
let iterations = 128;
data = JSON.stringify(data);
let bytes = CryptoJS.PBKDF2(password, salt, { keySize: 48, iterations: 
  iterations });
let iv = CryptoJS.enc.Hex.parse(bytes.toString().slice(0, 32));
let key = CryptoJS.enc.Hex.parse(bytes.toString().slice(32, 96));

let encrypted = CryptoJS.AES.encrypt(data, key, {iv: iv});
encrypted = encrypted.toString()
postman.setGlobalVariable("data", encrypted);
def decode(encrypted):
    encrypted = encrypted.replace(' ', '+') --> this line is added
    data = b64decode(encrypted)  
    byte = PBKDF2("lazydog".encode("utf-8"), "salt".encode("utf-8"), 48, 128)
    iv = byte[0:16]
    key = byte[16:48]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    text = cipher.decrypt(data) ## error is at this line
    text = text[:-text[-1]].decode("utf-8")

    return text
python代码

var data = {"feature_0": 0,
        "feature_1": 0, 
        "feature_2": 0, 
        "feature_3": 0, 
        "feature_4": 0, 
        "feature_5": 0
       };
let password = "lazydog";
let salt = "salt";
let iterations = 128;
data = JSON.stringify(data);
let bytes = CryptoJS.PBKDF2(password, salt, { keySize: 48, iterations: 
  iterations });
let iv = CryptoJS.enc.Hex.parse(bytes.toString().slice(0, 32));
let key = CryptoJS.enc.Hex.parse(bytes.toString().slice(32, 96));

let encrypted = CryptoJS.AES.encrypt(data, key, {iv: iv});
encrypted = encrypted.toString()
postman.setGlobalVariable("data", encrypted);
def decode(encrypted):
    encrypted = encrypted.replace(' ', '+') --> this line is added
    data = b64decode(encrypted)  
    byte = PBKDF2("lazydog".encode("utf-8"), "salt".encode("utf-8"), 48, 128)
    iv = byte[0:16]
    key = byte[16:48]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    text = cipher.decrypt(data) ## error is at this line
    text = text[:-text[-1]].decode("utf-8")

    return text

由于CryptoJs隐式填充数据,自定义填充已被删除。并移除btoa(不需要)。然后将加密数据转换为字符串。由@Topaco在注释中建议

CryptoJS返回一个
CipherParams
对象<代码>btoa不能简单地应用于它。Base64编码是可能的,例如使用
encrypted.toString()
,其中
encrypted
是返回的
CipherParams
对象。用这种方法解密是可行的。但是CryptoJS代码中还有更多的问题:CryptoJS隐式填充,因此由于用户定义的填充(这也是错误实现的!),它被填充了两次。应删除此自定义填充。另外:迭代计数通常太小,PyCryptodome支持使用单独的模块填充/取消添加。我添加了encrypted.toString()并删除了自定义填充。我得到了相同的错误>ValueError:数据必须在cipher.decrypt(数据)的CBC模式下填充到16字节边界(我添加了自定义填充,因为错误显示填充问题)。您是否删除了行
encrypted=btoa(加密)?请发布
加密的.toString()的结果。
。耶!我也删除了btoa(加密)。加密.toSting()的结果->keRg9pJATEsd05nusuvRzp7b evaciwrrnkwk70usnjkqhkylzcfdeb6s0lmwsjeyvhmi4rjuhdwry85neeqzyweq7uwlbtvn8hzyv7ln4ag6c/t9ubirtpwlens3qj2exlsbsx2zc7obcys9ympmks3ydr4unxxbwyzyz0u tc9bhsnsrs7elbcjbg7jd7jd3uxlyygzjb0 8Xuw==在发布的Base64字符串中缺少
+//code>字符,请参阅。这是复制/粘贴问题还是真的丢失了?如果它们真的丢失了,这是CryptoJS端的
encrypted.toString()
的直接输出还是Python端的直接输出?可能-但这只是猜测-这是一个邮递员问题,需要不同的编码(可能是Base64url)。