使用 nodejs 解密 base64 密文



我有这个密文:

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

用这个蟒蛇函数加密encrypt_tuple

from Crypto import Random
from Crypto.Cipher import AES
def encrypt_tuple(tupla, key):
    iv = Random.new().read(AES.block_size)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    return base64.b64encode(iv + cipher.encrypt(pad(str(tupla))))
def pad(s):
    return s + ((16 - len(s) % 16) * '*')

我还有用python编写的解密函数:

def decrypt_tuple(ciphertext, key):
    """Decifratura simmetrica della tupla in modalità CBC con AES"""
    text = base64.b64decode(ciphertext)
    iv = text[:16]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    dec = cipher.decrypt(text[16:]).decode('utf-8')
    return dec

它工作正常,但我需要使用 nodejs 解密此密文。

加密密钥是这样的:

key = b'x13xe3`Xx06Jx0bx04xebxc4x82xbdV\x83xb7'

我尝试了一切,但我无法让它工作。我遵循了这个例子,但什么都没有...

var crypto = require('crypto');
password = 'abcabcabc1abcabcabc1abcabcabc132';
var cryptoStr = 'Q336OpFur65nt1NgGUebbgx5hmwpcH3iUEd4mXq8qVwXL91qpLSaFecgKpsVvQEiT0DOMwK3TpUksPnjbr3wKA==';
var buf = new Buffer(cryptoStr, 'base64');
var iv = buf.toString('binary', 0, 16);
var crypt = buf.toString('base64', 16);
var decipher = crypto.createDecipheriv('aes-256-cbc', password, iv);
decipher.setAutoPadding(false);
var dec = decipher.update(crypt,'base64','utf-8');
dec += decipher.final('utf-8'); 
console.log('Decrypted content: ' + dec);

编辑

我的nodejs解密功能是这样的:

var buf = new Buffer(data, 'base64');
var keyBuff = new Buffer('x13xe3`Xx06Jx0bx04xebxc4x82xbdV\x83xb7');
var iv = buf.toString('binary', 0, 16);
var crypt = buf.toString('base64', 16);
var decipher = crypto.createDecipheriv('aes-128-cbc', keyBuff, iv);
decipher.setAutoPadding(false);
var dec = decipher.update(crypt,'base64','utf-8');
dec += decipher.final('utf-8'); 

但它不起作用...它会抛出此错误:

Invalid IV length

这是我为解决问题所做的:

我拿了钥匙:

key = b'x13xe3`Xx06Jx0bx04xebxc4x82xbdV\x83xb7'

在python shell上,我用以下命令将其转换为base64:

base64.b64encode(b'x13xe3`Xx06Jx0bx04xebxc4x82xbdV\x83xb7')

结果是这样的:

b'E+NgWAZKCwTrxIK9VlyDtw=='

然后我复制了这个没有第一个字符('b'(的字符串,并将其粘贴到我的nodeJs脚本中,替换了旧键。

我还更改了解密函数的代码,这是新的:

function decypherData(data){
    var buf = new Buffer(data, 'base64');
    var key = new Buffer('E+NgWAZKCwTrxIK9VlyDtw==', 'base64');
    var iv = buf.slice(0, 16);
    var crypt = buf.slice(16);
    var decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
    decipher.setAutoPadding(false);
    var dec = decipher.update(crypt,'base64','utf-8');
    dec += decipher.final('utf-8'); 
    return dec;
}

如您所见,我不再使用旧密钥,而是使用 base64 版本。

这里是解密的输出:

"{'end': '1451717060986', 'segments': [{'start': '1451716695254', 'end': '1451717060986'}], 'manipulations': [{'start': '1451716696410', 'end': '1451716701152', 'sensor': 'NotRefrigeratedFood'}, {'start': '1451716700915', 'end': '1451716702675', 'sensor': 'WaterBottle'}, {'start': '1451716704106', 'end': '1451716704949', 'sensor': 'Pasta'}, {'start': '1451716706301', 'end': '1451716707303', 'sensor': 'NotRefrigeratedFood'}, {'start': '1451716706612', 'end': '1451716707792', 'sensor': 'Pasta'}, {'start': '1451717037742', 'end': '1451717041675', 'sensor': 'WaterBottle'}, {'start': '1451717044121', 'end': '1451717045349', 'sensor': 'WaterBottle'}, {'start': '1451717048433', 'end': '1451717049664', 'sensor': 'WaterBottle'}, {'start': '1451717051376', 'end': '1451717056824', 'sensor': 'WaterBottle'}], 'start': '1451716695254', 'type': 'Clean Up', 'events': [{'state': 'END', 'sensor': 'M1', 'time': '1451716699424'}, {'state': 'ON', 'sensor': 'R1', 'time': '1451716702389'}, {'state': 'OFF', 'sensor': 'R1', 'time': '1451716705403'}, {'state': 'ON', 'sensor': 'R2', 'time': '1451717047949'}, {'state': 'OFF', 'sensor': 'R2', 'time': '1451717052971'}]}*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************"

感谢@dave_thompson_085让我注意到 aes-256-cbc 问题!

最新更新