当前位置: 首页 > 知识库问答 >
问题:

(NODEJS)AES-256-GCM解密后中断pdf、gzip、png编码

公孙新觉
2023-03-14

我希望有帮助,因为我不知道为什么我的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`);
                });
            }

最后,我解密并将内容写入一个文件:

const aesCipher = aes.aes256gcm(aes.loadKey(path.resolve(__dirname, `key`)));
        let filename = 'test1.gz';
        let authTag = 'puI0FfV4Btiy7iPiZFbwew==';
        let encrypted = fs.readFileSync(path.resolve(__dirname, `test1.gz.enc`));
        const decrypted = aesCipher.decrypt(encrypted, authTag);
        if (decrypted !== undefined) {
            const file = fs.createWriteStream(filename);
            file.write(new Buffer.from(decrypted, 'ascii'), function (err) {
                if (err) return console.log(err);
                console.log(`Successfully decrypted`);
                file.close();
            });
            res.send({
                status: true,
                message: 'File is decrypted',
            });
        }

共有1个答案

咸弘雅
2023-03-14

我认为只要对解密函数做个小改动就能解决这个问题,只要将其更新为:

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);
    }
};

我认为前面的实现没有正确地连接非文本文件的结果。

 类似资料:
  • 这是一个错误: 1.JS

  • tag到底是什么意思?我们为什么需要它?

  • 节点模块: Java类:主要方法现在只是用于测试,稍后将被删除。

  • 我试图创建一个应用程序在NodeJS(电子)作为一个跨平台桌面应用程序。这将与iOS上使用SWIFT开发的移动应用程序配对。作为共享数据的一部分,它使用AES-256-GCM算法进行加密。我在SWIFT中有以下加密和解密方法: 对于NodeJS,我有以下函数: null 下面是Java代码: 数据:这是数据 密钥:密码 根据我所读到的,Java将生成包含AuthTag的加密文本。我尝试将AuthT

  • 我已经使用OpenSSL AES-256-GCM加密了一个文件。由于aes-256-gcm不受命令行支持,我已经安装了LibreSSL,我可以使用下面的命令加密文件的数据。 openssl ENC-AES-256-GCM-K 616161616161616161616161616161616161616161616161616161616161616161-IV 768A5C31A97D5FE9-

  • 这是我在Node.js: 返回: 这就是我的围棋: 最终返回