Зашифровать с помощью JavaScript и расшифровать с помощью Java - PullRequest
0 голосов
/ 30 октября 2019

Я использую AES-шифрование в своем приложении, как показано ниже

import CryptoJS from 'crypto-js' ;
encryptFun() {
    var data = "123456";
    var key  = CryptoJS.enc.Latin1.parse('1234567812345678');
    var iv   = CryptoJS.enc.Latin1.parse('1234567812345678');  
    var encrypted = CryptoJS.AES.encrypt(
      data,
      key,
      {iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding
    });
    console.log('encrypted: ' + encrypted) ;
    var decrypted = CryptoJS.AES.decrypt(encrypted,key,{iv:iv,padding:CryptoJS.pad.ZeroPadding});
    console.log('decrypted: '+decrypted.toString(CryptoJS.enc.Utf8));
  }

Out come = encrypted: aK7 + UX24ttBgfTnAndz9aQ ==

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

 public static String desEncrypt() throws Exception {

        try
        {
            String data = "aK7+UX24ttBgfTnAndz9aQ==" ;
            String key = "1234567812345678";
            String iv = "1234567812345678";

            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(data);

            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original);
            return originalString;
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

output = decryted: = 123456 [] [] [] [] [] [] [] [] [] []

Я выхожу положилкак 16 бит, как указано выше. то, что я хочу получить, должно быть только 123456.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Предлагаю вам использовать java.util.Base64 для декодирования. Следующее сработало правильно. Я бы также предложил использовать обрезку в return originalString и посмотреть, получится ли.

public class Decrypt {

    public static void main(String[] args) {
        try
        {
            String data = "aK7+UX24ttBgfTnAndz9aQ==" ;
            String key = "1234567812345678";
            String iv = "1234567812345678";

            Decoder decoder = Base64.getDecoder();   
             byte[] encrypted1 = decoder.decode(data);

            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original);
            System.out.println(originalString.trim());
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

0 голосов
/ 30 октября 2019

Когда вы добавляете zeros в JS, вы не можете расшифровать с помощью NoPadding, решения будут заключаться в работе с массивом или при обработке строки

  • в массиве

    int i = original .length - 1;
    while (i >= 0 && original [i] == 0) {
        --i;
    }
    return new String(Arrays.copyOf(original , i + 1));
    
  • обрезать строку

    return new String(original).trim();
    
  • удалить вручную значения zero

    return new String(original).replace("\0", "");
    

Или, как кажется, в Java не реализовано ZeroPAdding (Cipher Documentation), посмотрите Как зашифровать с помощью AES CBC Zero Padding в Javascript ирасшифровать с помощью Java , который предлагает использовать CryptoJS.pad.Pkcs

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