Алгоритм Mcrypt RIJNDAEL_128 в NodeJS создает результаты, отличные от Java & PHP - PullRequest
1 голос
/ 29 февраля 2020

Context, мы переписываем нашу серверную кодовую базу в NodeJS.

У нас есть код в PHP, который работал для создания строк аутентификации, который я не могу скопировать в NodeJS.

PHP Код

<?php

namespace App\Medi;

class MCrypt {

    private $iv = '0000000000000000'; #Same as in JAVA
    private $key = 'oshi12wq!@WQ'; #Same as in JAVA

    function __construct() {
        $this->key = hash('sha256', $this->key, true);
    }

    function encrypt($str) {
        $iv = $this->iv;
        $td = @mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

        @mcrypt_generic_init($td, substr($this->key, 0, 32), $iv);
        $block = @mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $pad = $block - (strlen($str) % $block);
        $str .= str_repeat(chr($pad), $pad);
        $encrypted = @mcrypt_generic($td, $str);
        @mcrypt_generic_deinit($td);
        @mcrypt_module_close($td);
        return base64_encode($encrypted);
    }
}

и, наконец, что я делаю в NodeJS

const shajs = require('sha.js');
const mcrypt = require('mcrypt');

class MCrypt {

    static get key() {
        //noinspection JSUnresolvedFunction
        return shajs('sha256')
            .update('oshi12wq!@WQ')
            .digest('base64')
            .substr(0, 32);
    }

    static encrypt(text) {
        var key = Buffer.from(MCrypt.key, 'base64');
        console.log("key: ", MCrypt.key);
        var iv = String.fromCharCode(48).repeat(16);

        var blockSize = 16;
        var pad = blockSize - (text.length % blockSize);
        text = text + String.fromCharCode(pad).repeat(pad);
        let bfEcb = new mcrypt.MCrypt('rijndael-128', 'cbc');
        bfEcb.open(key, iv);
        return bfEcb.encrypt(text).toString('base64');
    }
}

module.exports = MCrypt;
...