AES-шифрование с Javascript с использованием crypto js аналогично Java - AES / CBC / PKCS5Padding - PullRequest
0 голосов
/ 23 апреля 2020

Я использую шифрование AES в Java и хочу сделать то же самое в Javascript / Typescript с использованием crypto js.

Я пытаюсь ввести код ниже Javascript, но оба возвращают разные результаты.

Java Код

 String sKey = 'MySecureKeyText1';
 String _text = "ValuetoEncrypt";

 byte key[] = sKey.getBytes("UTF-8");
 KeySpec aKeySpec = new SecretKeySpec(key, "AES"); 

 MessageDigest hashMD5 = MessageDigest.getInstance("MD5");
 hashMD5.update(sKey.getBytes("UTF-8"));
 byte[] ivbytes = hashMD5.digest();
 IvParameterSpec IV = new IvParameterSpec(ivbytes, 0, ivbytes.length); 

 Cipher mCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
 mCipher.init(Cipher.ENCRYPT_MODE, (Key) aKeySpec, IV);

 string ciphertext = mCipher.doFinal(_text.getBytes());
 ciphertext = ByteToHex(ciphertext); // .CAAFD9C519C23E91A4B58D158ECA5462

JavaScript Код

this.encrypt('ValuetoEncrypt', 'MySecureKeyText1');
encrypt(value : string, key:string) : string{
    let ivHash = cryptoJS.MD5(key).toString();
    let cipher = this.cipher(value, key, ivHash);
    return cipher.ciphertext.toString(); // 5a78aa6905208aa6fa63d1d452ea482e
  }

cipher(value, key, iv) {
    const cipher = cryptoJS.AES.encrypt(value, key, {
        iv: iv,
        mode: cryptoJS.mode.CBC,
        keySize: 128,
        padding: cryptoJS.pad.Pkcs7
    });

    return cipher;
  }

Устранена проблема

Исправлена ​​эта проблема путем преобразования ключа в байтовый массив с использованием cryptoJS.enc.Utf8.parse перед передачей для шифрования.

Согласно документации crypto- js, если мы передаем ключ в строковом формате, они используют его для получения фактического ключа и iv. Если мы передадим массив слов, то он будет использовать действительное значение, которое мы отправлено.

this.encrypt('ValuetoEncrypt', 'MySecureKeyText1');
encrypt(value: string, key: string): string {
    const ivMd5Hash = cryptoJS.MD5(cryptoJS.enc.Utf8.parse(key));
    const cipher = this.cipher(cryptoJS.enc.Utf8.parse(value), cryptoJS.enc.Utf8.parse(key), ivMd5Hash);

    return cipher.ciphertext.toString();
  }

  cipher(value, key, iv): any {
    const cipher = cryptoJS.AES.encrypt(value, key, {
      iv: iv,
      mode: cryptoJS.mode.CBC,
      keySize: 128,
      padding: cryptoJS.pad.Pkcs7
    });

    return cipher;
  }

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

...