Как расшифровать значение во внешнем интерфейсе, которое зашифровано во внутреннем интерфейсе (nodejs)? - PullRequest
1 голос
/ 29 октября 2019

Разработчики бэкэнда зашифровали значение в nodejs с помощью криптомодуля. Код показан ниже:

   const _encrypt = async function(text){
     var cipher = crypto.createCipher('aes-256-cbc','123|a123123123123123@&12')
     var crypted = cipher.update(text,'utf8','hex')
     crypted += cipher.final('hex');
     console.log("in generic function....encrpted val", crypted)
     return crypted;
   }

Мне нужно расшифровать это значение в переднем конце (Angular). Поэтому я попытался расшифровать, как показано ниже:

    let bytes = CryptoJS.AES.decrypt("e0912c26238f29604f5998fa1fbc78f6",'123|a123123123123123@&12'); 
    if(bytes.toString()){
        let m = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
        console.log("data ",m);
    }

, используя жестко закодированное значение. Но я получаю ошибку: искаженная ошибка данных UTF-8. Кто-нибудь, пожалуйста, скажите мне, как расшифровать это на угловой стороне?

1 Ответ

2 голосов
/ 29 октября 2019

Это достаточно сложно. Функция crypto.createCipher создает ключ и IV из предоставленного вами пароля (подробности см. В документации createCipher ).

Это реализованоиспользуя функцию OpenSSL EVP_BytesToKey .

Здесь доступна реализация JavaScript: openssl-file .. мы будем использовать это для получения ключа и IV из пароля.

Итак, здесь есть два шага:

  1. Получить ключ и IV из вашего пароля.
  2. Используйте их с Crypto.js для декодирования вашей закодированной строки.

Шаг 1: Получить ключ и IV (Выполнить в Node.js)

const EVP_BytesToKey = require('openssl-file').EVP_BytesToKey;
const result = EVP_BytesToKey(
    '123|a123123123123123@&12',
    null,
    32,
    'MD5',
    16
);

console.log('key:', result.key.toString('hex'));
console.log('iv:', result.iv.toString('hex'));

Шаг 2: Расшифровать строку:

const encryptedValues = ['e0912c26238f29604f5998fa1fbc78f6', '0888e0558c3bce328cd7cda17e045769'];

// The results of putting the password '123|a123123123123123@&12' through EVP_BytesToKey
const key = '18bcd0b950de300fb873788958fde988fec9b478a936a3061575b16f79977d5b';
const IV = '2e11075e7b38fa20e192bc7089ccf32b';

for(let encrypted of encryptedValues) {
    const decrypted = CryptoJS.AES.decrypt({ ciphertext: CryptoJS.enc.Hex.parse(encrypted) }, CryptoJS.enc.Hex.parse(key), { 
        iv: CryptoJS.enc.Hex.parse(IV), 
        mode: CryptoJS.mode.CBC
    });
     
    console.log('Ciphertext:', encrypted);
    console.log('Plain text:', decrypted.toString(CryptoJS.enc.Utf8));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>

Обратите внимание, что если вы меняете пароль, вам нужно сгенерировать новый ключ и iv с помощью EVP_BytesToKey.

Я должен отметить, что createCipher теперьустарел, поэтому используйте с осторожностью. То же самое относится и к EVP_BytesToKey.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...