как расшифровать aes-256-gcm в PHP, используя IV & TAG - PullRequest
1 голос
/ 19 марта 2019

Я нашел трудный способ расшифровки строки, используя aes-256-gcm, iv и TAG.Вот параметры, которые я получаю.

$password = 'code1234';
$data = 'f4oGPQaf9ZolRc9oh8VLRiJWK2B35tkHq9L6WvrE+jbjS1mfi0fJB7re+0kVM2RRLiAEPBSFtIQzlJ5055yRlntIZwwpRvAN1cUBS0ze3hb+FrcO43vtBuuqftDw0exfmorPM5SOaKj3KtEQjB2ypwtbnQNCtegNizs6niqAdvs/XztlZPbq08Y=';

$ivstring = 'D7GVFFLn+K0sNj+YRskGTw==';
$tagstring = '9GSCia0QDujWTn3zpIRbCw==';

Я использую эту функцию для расшифровки

openssl_decrypt($data, 'aes-256-gcm', $password, OPENSSL_RAW_DATA, $ivstring, $tagstring);

, но она всегда возвращается со следующей ошибкой

Не удалось установить тег для расшифровки шифра AEAD

как расшифровать aes-256-gcm в PHP с помощью IV & TAG

ОБНОВЛЕНИЕ: шифрование происходит из основного приложения с использованием узла js.Я пытался расшифровать в приложении nodejs, оно работает нормально.Я пытался преобразовать функцию расшифровки в PHP, но всегда получаю ошибки.Здесь функция сценария шифрования и дешифрования

const crypto = require('crypto');

// Demo implementation of using `aes-256-gcm` with node.js's `crypto` lib.
const aes256gcm = (key) => {
    const ALGO = 'aes-256-gcm';
    const aes_password = key || 'code1234';
    const aes_key = crypto.createHash('md5').update(aes_password, 'utf-8').digest('hex').toUpperCase();

    // encrypt returns base64-encoded ciphertext
    const encrypt = (str) => {

        const iv = new Buffer(crypto.randomBytes(16), 'utf8');
        const cipher = crypto.createCipheriv(ALGO, aes_key, iv);

        let enc = cipher.update(str, 'utf8', 'base64');
        enc += cipher.final('base64');

        const ivString = iv.toString('base64');
        const authTagString = cipher.getAuthTag().toString('base64')
        return [enc, ivString, authTagString];
    };

    // decrypt decodes base64-encoded ciphertext into a utf8-encoded string
    const decrypt = (enc, ivString, authTagString) => {
        const iv = new Buffer(ivString, 'base64');
        const authTag = new Buffer(authTagString, 'base64');
//console.log(iv);
  //      console.log(authTag);
        const decipher = crypto.createDecipheriv(ALGO, aes_key, iv);
   //     console.log(iv);
        decipher.setAuthTag(authTag);
        let str = decipher.update(enc, 'base64', 'utf8');
        console.log(str);
        str += decipher.final('utf8');
        return str;
    };

    return {
        encrypt,
        decrypt,
    };
};

module.exports = aes256gcm;
...