Шифрование общего ключа на платформе Android / Java - PullRequest
0 голосов
/ 04 июля 2011

Я очень плохо знаком с платформой Android и шифрованием, так что терпите меня.Мне нужно вызвать веб-сервис, который требует, чтобы я зашифровал параметр перед его вызовом.Я получил спецификацию, которая гласит:

"Мы используем AES для шифрования. Настройки шифрования следующие:

  • Ключ: PublicKey12345678910

  • Количество бит: 128

  • Заполнение: PKCS # 7

  • Шифр: Cipher Block Chaining (CBC) "

Теперь моя проблема, вероятно, заключается в недостаточном понимании процесса шифрования.У меня есть свой открытый ключ, но что мне с ним делать?Я пытался найти ответ в Интернете, но все мои усилия, похоже, приводят либо к неправильному зашифрованному ключу, либо очень часто к «InvalidKeyLengthException, ключ не 128, 196 или 256 бит» (или что-то в этом общем направлении).Мои последние усилия, которые в значительной степени основаны на ответе здесь, в стеке, выглядят так:

            String input = "TheParameterIWantToEncrypt";
        String secretID = "PublicKey12345678910";
        char[] inputChars = input.toCharArray();
        char[] pswChars = secretID.toCharArray();

        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithMD5AndDES", new BouncyCastleProvider());
        KeySpec spec = new PBEKeySpec(pswChars);
        SecretKey tmp = factory.generateSecret(spec);
        SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secret);
        AlgorithmParameters params = cipher.getParameters();
        byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
        byte[] ciphertext = cipher.doFinal(input.getBytes());

        System.out.println(new String(ciphertext));

Может ли кто-нибудь объяснить мне, в каком порядке делать вещи в предоставленной спецификации?Кроме того, любой код, реализующий это поведение на платформе Java / Android, также будет весьма обязателен.

1 Ответ

1 голос
/ 04 июля 2011

Забудьте на мгновение детали реализации, и давайте сосредоточимся на вещах на более высоком уровне.Если вы выполняете шифрование таким образом, ваш закрытый ключ будет храниться где-то в программе или в данных, используемых программой, способом, который может быть легко извлечен, ставя под угрозу шифрование.

В отличие от этого, есливы используете HTTPS (который является очень стандартным способом создания зашифрованного сеанса), будет хорошо проверенный и хорошо изученный процесс, посредством которого асимметричный шифр используется для создания закрытых ключей, которые затем используются для создания зашифрованного канала (обычно с использованием128-битное шифрование AES).

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

...