Я сейчас использую 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
Помощь оценена, спасибо заранее.