(NODEJS) AES-256-GCM解密后破解pdf,gzip,png编码

我希望我能得到帮助,因为我不知道为什么我的 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 文件?


慕村225694
浏览 297回答 1
1回答

智慧大石

我认为对你的解密函数做一个相当小的改动应该可以解决这个问题,如果你只是将它更新为: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);    }};我认为以前的实现没有正确连接非文本文件的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript