我使用 Node.js 来加密和解密一些数据并将它们存储在数据库中,一切正常,直到我的cpu使用量增加,更多请求解密,现在我决定将这两个函数移动到 python :
const key = '' // unfortunately 39 bytes string (by mistake)
module.exports.encrypt = function (text) {
let cipher = crypto.createCipher('aes-256-ctr', key)
let crypted = cipher.update(text, 'utf8', 'hex');
crypted += cipher.final('hex');
return crypted;
};
module.exports.decrypt = function (text) {
let decipher = crypto.createDecipher('aes-256-ctr', key)
let dec = decipher.update(text, 'hex', 'utf8');
dec += decipher.final('utf8');
return dec;
};
现在我在数据库中有很多加密数据,用错误的密钥加密(但在带有crypto模块的node.js中,它工作正常) 我尝试了几个python代码用该密钥解密我的加密数据,但没有一个工作(他们只接受 32字节键),有没有办法将这两个方法移动到python? (不更改键)
答案 0 :(得分:1)
你不仅仅是1,但可能是2个问题:
使用aes-256-ctr模式时,需要256位加密密钥,但是,您使用的是长度较长的密钥。
使用此模式时,标准是生成IV并将其用于加密(您可以在更高版本的node-js中查看文档,其中crypto是nodejs的默认部分,无需导入明确)。
我不确定python,但是在Java中,你需要提供一个IV才能在使用这个模式时解密,因为这是标准。 crypto使用它自己的一些算法来生成加密和解密时,但你没有办法知道这一点。当标准使用32字节字符串时,它如何处理38字节的字符串键也是如此。
可以有一种解决方法可以帮助您在将来再次避免任何此类数据问题。您可以执行以下步骤:运行迁移脚本,该脚本会转换您的数据,以便为每条记录执行以下操作:
使用旧密钥(39字节密钥)解密数据。
使用32位密钥再次加密数据,并将数据与IV一起存储。使用以下功能:
function encrypt(text, secret) {
var iv = crypto.randomBytes(16);
var cipher = crypto.createCipheriv(algorithm, new Buffer(secret), iv);
var encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
return iv.toString('hex') + ':' + encrypted.toString('hex');
}
存储新的加密数据以代替旧的加密数据。
此数据可以在任何平台上使用,使用任何语言,因为它将独立于加密模块为适应其功能而进行的操作。
希望有所帮助。