Шифрование и дешифрование данных с помощью транспорта через Java в Node.js

Я пытаюсь отправить данные из Java (Android) в приложение Node.js, за исключением того, что шифрование не работает, и Node.js не расшифровывает должным образом, и я действительно не имею понятия, что я делаю.

Джава:

                    // Encrypt
                    byte[] input = jo.toString().getBytes("UTF-8");

                    MessageDigest md = MessageDigest.getInstance("MD5");
                    byte[] thedigest = md.digest(ENCRYPTION_KEY.getBytes("UTF-8"));
                    SecretKeySpec skc = new SecretKeySpec(thedigest, "AES/ECB/PKCS5Padding");
                    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                    cipher.init(Cipher.ENCRYPT_MODE, skc);

                    byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
                    int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
                    ctLength += cipher.doFinal(cipherText, ctLength);
                    String query = Base64.encodeToString(cipherText, Base64.DEFAULT);

query затем отправляется на наш сервер и jo является JSONObject

И в Узле я делаю:

        var decipher = crypto.createDecipher('aes-128-ecb', encryption_key);
        console.log("System: " + new Buffer(fullBuffer, "base64").toString("binary") );

        chunks = []
        chunks.push( decipher.update( new Buffer(fullBuffer, "base64").toString("binary") , 'hex', 'utf-8') );
        chunks.push( decipher.final('utf-8') );
        var txt = chunks.join("");

        console.log("System: " + txt);
        js = JSON.parse(txt);
        console.log("System: " + js);   

А также fullBuffer это полученные данные POST, которые правильно передаются

1 ответ

Решение

Шифрование и аутентификация являются жестокими для отладки, потому что любая ошибка, которую вы делаете, приводит к рандомизации всего вывода. Предложения:

  1. Переключитесь на незашифрованное преобразование, такое как Base64 или gzip, чтобы вы могли видеть, как выглядит ваш вывод.
  2. Попробуйте выяснить, какая половина сломана. Захватите ваш сервер и расшифруйте его с помощью openssl или python. Сгенерируйте хороший вход с одним из них и вставьте его в свой клиент.
  3. CBC гораздо безопаснее, чем ЕЦБ.
  4. Если все это не помогает, шаг в шифр низкого уровня и расшифровать и убедитесь, что ключи и шифртексты точно соответствовать содержанию и длиной, и косоглазие при выборе алгоритма долго и упорно.
Другие вопросы по тегам