AES зашифрованные и дешифрованные значения отличаются - PullRequest
0 голосов
/ 25 октября 2019

В приложении для Android я пытаюсь использовать WebAPI с зашифрованным значением в JSON. У меня есть сценарий C #, который обрабатывает шифрование, и я адаптировал его для Android. Короче говоря, метод шифрования - это добавление байтового массива, нескольких переменных, случайно сгенерированного IV, случайно сгенерированной соли и hmacsalt, добавление зашифрованного текста, генерируемого из строки Json с использованием AES / CBC / Pkcs7Padding, и генерация hmac, а также добавление этого в байт. массив. Преобразование этого байтового массива в base64 дает мне зашифрованную строку. Я думаю, что все работает нормально в этом процессе, так как WebAPI может расшифровать мою строку. Проблема в том, что строка расшифровывается в основном правильно, но есть поле даты, и дата кажется совершенно неправильной.

Я пытался адаптировать C # для Android, и я не уверен, как указать длину ключа. Генераторы ключей в C # и Android выглядят следующим образом.

var pbkdf2 = new Rfc2898DeriveBytes(password, salt, pbkdf2_iterations).GetBytes(pbkdf2_keyLength);

Здесь pbkdf2_iterations = 100 и pbkdf2_keyLength = 32;

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt, 100, 32);
byte[] key = factory.generateSecret(pbeKeySpec).getEncoded();

Здесь при инициации PBEKeySpec, когда я передаю 32для длины ключа ключ byte [] становится 4 байта, и есть исключение, говорящее о неподдерживаемом размере ключа 4 байта, но WebAPI может расшифровать мою строку с ошибкой даты. Когда я передаю 256 для длины ключа, чтобы сделать байт [] 32 байта, WebAPI не может расшифровать строку.

Я совершенно сбит с толку о том, как правильно сделать это.

Чтобы привести пример с неисправной дешифрованной строкой, мой открытый текст, который должен быть зашифрован:

{"Username":"username","Password":"password","DateCreated":"2019-10-25T14:46:01.441Z"} 

, но дешифрованная строка:

{"Username":"username","Password":"password","DateCreated":"2019-03-04T09:29:54.3516562Z"}

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

Любые мнения о том, что может быть неправильным, будут приняты с благодарностью.

Редактировать:

JSonObjectКод создания

Данные Json создаются статически.

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        String dateString = formatter.format(new java.util.Date());
JsonObject o = new JsonObject();
        o.addProperty("Username", "username");
        o.addProperty("Password","password");
        o.addProperty("DateCreated", dateString);
        String jsonString = o.toString();

И jsonString передается для шифрования. Я вижу, что его значение - именно то, что я хочу.

...