AES-pycrypto加密在node.js加密解密
问题描述:
我看了AES - Encryption with Crypto (node-js)/decryption with Pycrypto (python)后,因为我试图做的完全相反,但我似乎无法得到它的权利。这是我到目前为止已经试过......AES-pycrypto加密在node.js加密解密
Python的加密
import base64
from Crypto import Random
from Crypto.Cipher import AES
text_file = open("cryptic.txt", "w")
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s : s[:-ord(s[len(s)-1:])]
plaintxt = 'dolladollabillzz'
iv = Random.new().read(AES.block_size)
print AES.block_size
key = 'totallyasecret!!'
cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
encrypted = base64.b64encode(iv + cipher.encrypt(plaintxt))
text_file.write(encrypted)
text_file.close()
Node.js的解密
var fs = require('fs');
var crypto = require('crypto');
var Buffer = require('buffer').Buffer;
var algorithm = 'aes-128-cbc';
var key = new Buffer('totallyasecret!!', 'binary');
var cryptic = fs.readFileSync('./cryptic.txt', 'base64');
var iv = cryptic.slice(0, 16);
var ciphertext = cryptic.slice(16);
var decipher = crypto.createDecipheriv(algorithm, key, iv);
var decrypted = [decipher.update(ciphertext)];
decrypted.push(decipher.final('utf8'));
var finished = Buffer.concat(decrypted).toString('utf8');
console.log(finished);
每次我尝试运行Node.js的解密,我结束了与错误消息:
Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
答
由于IV是在Python随机产生的,它可以包含任何可能的字节VAL UE。其中一些字节值不是有效的UTF-8字符(例如,多个字节是一个字符),并且可能导致错误地切断IV,从而使实际密文轻微移位。
由于AES是分组密码,所以这些比特必须排队以便正确解密。这应该修复它:
var cryptic = fs.readFileSync('./cryptic.txt', 'utf8');
cryptic = new Buffer(cryptic, 'base64');
var iv = cryptic.slice(0, 16);
var ciphertext = cryptic.slice(16);
这将二进制字符串更改为完美处理二进制数据的缓冲区。
感谢您的建议@Artjom,但我仍然收到相同的'错误的最终块长度'的错误。我也尝试在readFileSync中使用'binary',但结果也一样。 – MCaw
你能提供一个密文测试吗? –
当然,我运行我的Python脚本完全按照它在我的文章中的方式,并产生了密文 Ew2rBvVohbJdFp9D3rBmIAGQWekoL3W3JuF6sQc4DRQ = – MCaw