Шифрование в Typescript (Angular) и дешифрование в Java - PullRequest
0 голосов
/ 19 декабря 2018

Я сейчас использую Angular7.У меня есть Java-шифрование, код расшифровки, реализованный мной, предоставленный клиентом, то же самое, что мне нужно в Angular.

Ниже приведен код для Java.

import java.security.SecureRandom;
import java.security.spec.KeySpec;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

Внутри класса у меня есть

class EnDc(String passPhrase)
{
    private static final byte[] SALT = { 8 random numbers between -127 to 127 };
    private static final int ITERATION_COUNT = 1000;
    private static final int KEY_LENGTH = 256;
    private static final int IV_LENGTH = 16;
    private Cipher eCipher;
    private Cipher dCipher;
    private byte[] encrypt;
    private byte[] iv;

Генерация хешированного ключа и iv выглядит следующим образом:

    SecretKeyFactory secretKeyFactory = 
            SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), SALT, 
            1000, 256);

Они сгенерировали временный секретный ключ со спецификацией ключей следующим образом:

    secretKeyTemp = secretKeyFactory.generateSecret(keySpec);

Сгенерирован новый секретный ключ с временнойклавиша и «AES»

    secretKey = new SecretKeySpec(secretKeyTemp.getEncoded(), //encode 
            "AES");

Следующие шаги:

    this.eCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    this.eCipher.init(1, secretKey);
    // 1 - ENCRYPT_MODE, 2 - DECRYPT_MODE

Генерация IV:

    this.iv = ((IvParameterSpec)this.eCipher.getParameters().getParameterSpec(IvParameterSpec.class)).getIV();

}

Действительная функция шифрования, как показано ниже

public String encrypt(String encrypt)
      {
        String encStr = null;
        try
        {
          byte[] bytes = encrypt.getBytes("UTF8");
          byte[] encrypted = encrypt(bytes);
          byte[] cipherText = new byte[encrypted.length + this.iv.length];
          System.arraycopy(this.iv, 0, cipherText, 0, this.iv.length);
          System.arraycopy(encrypted, 0, cipherText, this.iv.length, encrypted.length);
          encStr = new String(Base64.getEncoder().encode(cipherText));
        }
        catch (Exception ex)
        {
          ex.printStackTrace();
        }
        return encStr;
      }

Я пытаюсь реализовать это в служебном файле в Angular. Здесь, в соответствии с моим пониманием, массив байтов SALT предопределен, а IV - случайный, который добавляется перед зашифрованной строкой и извлекается во время дешифрования,

Итак, JS wayЯ попробовал, как показано ниже

import * as CryptoJS from 'crypto-js';

encrypt (msg, pass) {
  const salt = CryptoJS.lib.WordArray.random(128 / 8);

  const key = CryptoJS.PBKDF2( pass, salt, {
      keySize: this.keySize / 32,
      iterations: this.iterations
  });

  const iv =  CryptoJS.lib.WordArray.random(128 / 8);
  const encrypted = CryptoJS.AES.encrypt(msg, key, {
    iv: iv,
    padding: CryptoJS.pad.Pkcs7,
    mode: CryptoJS.mode.CBC
  });

  const transitmessage = salt.toString() + iv.toString() + encrypted.toString();
  return transitmessage;
}

Итак, я сделал этот код по ссылке http://www.adonespitogo.com/articles/encrypting-data-with-cryptojs-aes/, так что теперь вопрос в том, как я могу реализовать SALT, который жестко закодирован в JAVA, а также внутри кода JAVAони не отправили солевой ключ с Encrypted String, но IV только как первые 16 бит.Как я могу это реализовать?

Я пытался сделать это

salt = CryptoJS.lib.WordArray.create([-67, -85, 13, -28, 75, 112, -126, 103]);

, но сгенерированный ключ является объектом, а также я получаю сообщение об ошибке при расшифровке

Редактировать 1Я хочу, чтобы соль была одинаковой каждый раз, когда я генерирую ее в случайном порядке и присоединяю к зашифрованной строке.

Я не знаю, есть ли какая-нибудь реализация SecretKeyFactory и Keyspec для Javascript

Помощь оценена, спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Пожалуйста, найдите ниже решение, если оно работает для вас.

encrypt (msg, pass) {
    const key = CryptoJS.PBKDF2(pass, this.salt, {
        keySize: this.keySize / 32,
        iterations: this.iterations
    });

    const iv =  CryptoJS.lib.WordArray.random(128 / 8);

    const encrypted = CryptoJS.AES.encrypt(msg, key, {
          iv: iv,
          padding: CryptoJS.pad.Pkcs7,
          mode: CryptoJS.mode.CBC
    });

    const transitmessage = iv + encrypted.ciphertext;
    var tm=CryptoJS.enc.Hex.parse(transitmessage); // This converts to Type Word which is required for below function as input
    return CryptoJS.enc.Base64.stringify(tm); // Encoding
}
0 голосов
/ 19 декабря 2018

Когда вы делаете ниже, метод WordArray.create использует ваши числа в качестве 32-битных целых чисел:

salt = CryptoJS.lib.WordArray.create([-67, -85, 13, -28, 75, 112, -126, 103]);

В этом случае ваша соль в гексах:

ffffffbdffffffab0000000dffffffe40000004b00000070ffffff8200000067

Если выпреобразовав javascript Array объект в Int8Array, CryptoJS создаст ту же соль, что и в Java:

salt = CryptoJS.lib.WordArray.create(new Int8Array([-67, -85, 13, -28, 75, 112, -126, 103]));

Результат:

bdab0de44b708267
...