Алгоритм/заполнение AES CBC в java/angular

Я написал этот код в Angular для шифрования строки:

import { Injectable } from '@angular/core';
import * as CryptoJS from 'crypto-js';

@Injectable({
    providedIn: 'root',
  })
export class CryptoService {
  
  encrypt(message: string, clef: string): string {

    const salt = CryptoJS.SHA256("123456789123");

    const key = CryptoJS.PBKDF2(clef, salt, {
      keySize: 128 / 32,
      iterations: 1000
  });

    // var key = CryptoJS.enc.Utf8.parse(clef);
    let iv = CryptoJS.enc.Utf8.parse(clef);
    let encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(message.toString()), key,
    {
        keySize: 128 / 8,
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });


    // var encryptedMessage = CryptoJS.AES.encrypt(message.trim(), key).toString();

    return encrypted.toString();
  }

  generateKey(): string {
      let result = '';
      const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
      const charactersLength = characters.length;
      let counter = 0;
      while (counter < 16) {
      result += characters.charAt(Math.floor(Math.random() * charactersLength));
      counter += 1;
      }
      return result;
  }
}

Я передаю свой ключ и encriptedMessage обратно для расшифровки.

Я кодирую на java:

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Base64;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;

public class AESUtilService {
    
    protected static final String salt = "123456789123";
    
    public SecretKey getKeyFromPassword(String password)
        throws NoSuchAlgorithmException, InvalidKeySpecException {
        
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 1000, 128/32);
        SecretKey secret = factory.generateSecret(spec);
        return secret;
    }
    public String decrypt(String cipherText, SecretKey key)
        throws NoSuchPaddingException, NoSuchAlgorithmException,
        InvalidAlgorithmParameterException, InvalidKeyException,
        BadPaddingException, IllegalBlockSizeException {
            
        String algorithm = "AES/CBC/PKCS7Padding";
        IvParameterSpec iv = new IvParameterSpec("MnTQLHcWumIKTXpQ".getBytes());
        
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.DECRYPT_MODE, key, iv);
        byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText));
        return new String(plainText);
    }
    
}

Моя проблема заключается в следующем. Часть кода Cipher cipher = Cipher.getInstance(algorithm); вылетает в java, если я использую String algorithm = "AES/CBC/PKCS7Padding"; Однако это пройдет с String algorithm = "AES/CBC/PKCS5Padding";, но на этот раз это угловой, который рухнет. заполнение: CryptoJS.pad.Pkcs5

Я не могу найти решение этой проблемы, и поэтому я прошу вашей помощи.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Наконец-то я нашел сообщение, в котором говорилось, что pkcs5 в java такие же, как pkcs7 в angular -->заполнение (128)

источник: https://crypto.stackexchange.com/questions/9043/какая-есть-разница-между-pkcs5-padding-and-pkcs7-padding

Ответ принят как подходящий

Судя по вашему коду, существует проблема с вашим PBEKeySpec и спецификацией длины ключа. JAVA: вам необходимо использовать «AES/CBC/PKCS5Padding» вместо «AES/CBC/PKCS7Padding». Angular: внесите изменения в длину ключа и PBEKeySpec пусть зашифровано = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse("hasan test"), ключ, { размер ключа: 16, IV: IV, режим: CryptoJS.mode.CBC, заполнение: CryptoJS.pad.Pkcs7 }).нанизывать();

Другие вопросы по теме