Как перевести эту функцию шифрования с PHP на Javascript - PullRequest
1 голос
/ 28 июня 2019

Я перевожу веб-приложение с PHP на платформу на основе JS. Приложение использует mcrypt_encrypt и base64 для шифрования. Я пытался использовать модуль mcrypt в Javascript, но я не получаю тот же результат.

Оригинальная функция PHP выглядит следующим образом

function safe_b64encode($string) {
    $data = base64_encode($string);
    $data = str_replace(array('+', '/', '='), array('-', '_', ''), $data);
    return $data;
}

function encrypt($value) {
    $text = $value;
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, ENCRYPTION_KEY, $text, MCRYPT_MODE_ECB, $iv);
    return trim(safe_b64encode($crypttext));
}

Моя версия JS выглядит так

const MCrypt = require('mcrypt').MCrypt

const rijndael128Ecb = new MCrypt('rijndael-128', 'ecb')
const iv = rijndael128Ecb.generateIv()

rijndael128Ecb.validateKeySize(false)
rijndael128Ecb.open(ENCRYPTION_KEY, iv)

let cipherText = rijndael128Ecb.encrypt('sometext')
cipherText = Buffer.concat([iv, cipherText]).toString('base64')
cipherText = cipherText.replace('+','-').replace('/','_').replace('=','')

1 Ответ

2 голосов
/ 28 июня 2019

Я думаю, что вы почти у цели, вам просто нужно использовать тот же алгоритм, вы использовали 128-битный Rijndael, я перешел на 256-битный в Node.js, теперь он работает.

// Surely this key is uncrackable...
const ENCRYPTION_KEY = 'abcdefghijklmnop';
const MCrypt = require('mcrypt').MCrypt;

function encryptRijndael256(plainText, encryptionKey) {

    const rijndael256Ecb = new MCrypt('rijndael-256', 'ecb');
    const iv = rijndael256Ecb.generateIv();

    rijndael256Ecb.validateKeySize(false);
    rijndael256Ecb.open(encryptionKey, iv);

    let cipherText = rijndael256Ecb.encrypt(plainText);
    cipherText = cipherText.toString('base64');
    cipherText = cipherText.replace('+','-').replace('/','_').replace('=','')

    return cipherText;
}

const plainText = 'sometext';
const cipherText = encryptRijndael256(plainText, ENCRYPTION_KEY); 
console.log("Cipher text: ", cipherText);

Я получаю следующий зашифрованный текст (с тривиальным и небезопасным!) Ключом, который я использую:

k3ZQ8AbnxhuO8TW1VciCsNtvSrpbOxlieaWX9qwQcr8

для результата в PHP и JavaScript.

...