我希望我能得到帮助,因为我不知道为什么我的 AES-GCM 实现会破坏文件编码。我有一个 API,它使用 1 个函数通过 AES-256-GCM 进行加密/解密。(使用 KEY=32 个随机字节的缓冲区)这是功能:const aes256gcm = (key) => { const ALGO = 'aes-256-gcm'; const encrypt = (str) => { try { const salt = crypto.randomBytes(64); const iv = crypto.randomBytes(32); let derivedkey = crypto.pbkdf2Sync(key, salt, 55000, 32, 'sha512'); const cipher = crypto.createCipheriv(ALGO, derivedkey, iv); let encrypted = Buffer.concat([cipher.update(str), cipher.final()]); const tag = cipher.getAuthTag(); let buffer = Buffer.concat([salt, iv, encrypted]); encrypted = { tag: tag, buffer: buffer } return encrypted; } catch (e) { console.log(e); } }; const decrypt = (data, authTag) => { try { const salt = data.slice(0, 64); const iv = data.slice(64, 96); const text = data.slice(96, data.length); authTag = new Buffer.from(authTag, 'base64'); let derivedkey = crypto.pbkdf2Sync(key, salt, 55000, 32, 'sha512'); let decipher = crypto.createDecipheriv(ALGO, derivedkey, iv); decipher.setAuthTag(authTag); let decrypted = decipher.update(text, 'binary') + decipher.final(); return decrypted; } catch (e) { console.log(e); } }; return { encrypt, decrypt };};使用此代码,我将结果加密并写入文件:const aesCipher = aes.aes256gcm(aes.loadKey(path.resolve(__dirname, `key`))); const encrypted = aesCipher.encrypt(file.data); if (encrypted !== undefined) { fs.writeFile(`${file.name}.enc`, encrypted.buffer, function (err) { if (err) return console.log(err); console.log(`${file.name}.enc successfully created`); }); }我的输入/输出文件的差异: 差异那么,我做错了什么?我的加密过程好吗?为什么这只适用于 .txt 文件?
1 回答
智慧大石
TA贡献1946条经验 获得超3个赞
我认为对你的解密函数做一个相当小的改动应该可以解决这个问题,如果你只是将它更新为:
const decrypt = (data, authTag) => {
try {
const salt = data.slice(0, 64);
const iv = data.slice(64, 96);
const text = data.slice(96, data.length);
authTag = new Buffer.from(authTag, 'base64');
let derivedkey = crypto.pbkdf2Sync(key, salt, 55000, 32, 'sha512');
let decipher = crypto.createDecipheriv(ALGO, derivedkey, iv);
decipher.setAuthTag(authTag);
let decrypted = Buffer.concat([decipher.update(text), decipher.final()]);
return decrypted;
} catch (e) {
console.log(e);
}
};
我认为以前的实现没有正确连接非文本文件的结果。
添加回答
举报
0/150
提交
取消