bouncycastle зашифрованные данные отправляются из мидлета в сервлет - PullRequest
0 голосов
/ 07 августа 2011

Я хочу зашифровать данные в мидлете, которые нужно отправить сервлету.Я мог зашифровать данные в мидлете.Я использовал Bouncycastle.Это работало отлично (я мог хорошо зашифровать и расшифровать).Затем я отправляю зашифрованные данные сервлету.Для простого тестирования я просто использовал тот же код (при расшифровке, который я использовал в мидлете) в сервлете для расшифровки.Но теперь проблема в том, что данные не получаются при отправке мидлета. Зашифрованные данные были изменены.Вот образец, который я получил.это выход после шифрования в мидлете.Ë Ë Ë T T enter enter enter enter enter enter здесь, но когда я получил это от сервлета, я думал, что входящий поток.печатный результат: ƒ ¸ ¸ ˜ ˜ ˜ ˜ ˜ • • • T «« «¼ ¼ ¼ ¼ ¼ A A A A A A b b b b b b b b b b also also.crypto.IllegalBlockSizeException: длина ввода должна быть кратна 8 при дешифровании с использованием шифра с добавлением. Вот как я отправляю данные на сервер из мидлета:

        String serverResponse = "not send to server";
        HttpConnection connection = null;
        InputStream inputstream = null;
        try {
            connection = (HttpConnection) Connector.open(url);
            connection.setRequestProperty("User-Agent", "Profile/MIDP-                                                                                                                                                      1.0,Configuration/CLDC-1.0");
            connection.setRequestMethod(HttpConnection.POST);
            DataOutputStream os = (DataOutputStream) connection.openDataOutputStream();
            System.out.println("Writing message is: " + msg);
            os.writeUTF(msg);
            os.flush();
            os.close();

, а в сервлете вот как я получил: внутриМетод processRequest -------------------------------------------------------------

response.setContentType("text/plain");
        ServletInputStream sin = request.getInputStream();
        String str = "";

        while ((i = sin.read()) != -1) {
            ch = (char) i;
            str = str + ch;
        }
        str.trim();
        System.out.println("Received Stream From MIDlet  Encript data=" + str);

вот как я шифрую данные с помощью bouncycastle DES algorythm

public byte [] encrypt (String textToEnrypt,String keyString) {

    Cipher cipher = null;
    try {
        cipher = Cipher.getInstance("DES");
    } catch (Exception ex) {
        System.out.println(ex.toString());
        //   return;
    }

    byte[] keyData = keyString.getBytes();
    SecretKeySpec key = new SecretKeySpec(keyData, 0, keyData.length, "DES");

    try {
        cipher.init(Cipher.ENCRYPT_MODE, key);
    } catch (Exception ex) {
        System.out.println(ex.toString());
        //  return;
    }

    int cypheredBytes = 0;

    byte[] inputBytes = null;
    try {
        inputBytes = textToEnrypt.getBytes("UTF-8");
        inputBytes = textToEnrypt.getBytes();
    } catch (Exception ex) {
        System.out.println(ex.toString());
        //return;
    }

    byte[] outputBytes = new byte[100];

    try {
        cypheredBytes = cipher.doFinal(inputBytes, 0, inputBytes.length,
                outputBytes, 0);
    } catch (Exception ex) {
        System.out.println(ex.toString());
        //return;
    }
    /*
    String str = new String(outputBytes, 0, cypheredBytes);
    buffer = str;
    System.out.println("Encrypted string = " + str);
     * */

    newResponse = new byte[cypheredBytes];

    for (int i = 0; i < cypheredBytes; i++) {

        newResponse[i] = outputBytes[i];

    }

    buffer=new String(newResponse);
    System.out.println("Encripted text is:"+buffer);
    return newResponse;
}

public void decrypt(String textToDecrypt, String keyString) {
    Cipher cipher;
    try {
        cipher = Cipher.getInstance("DES");
    } catch (Exception ex) {
        System.out.println(ex.toString());
        return;
    }

    byte[] keyData = keyString.getBytes();
    SecretKeySpec key = new SecretKeySpec(keyData, 0, keyData.length, "DES");

    try {
        cipher.init(Cipher.DECRYPT_MODE, key);
    } catch (Exception ex) {
        System.out.println("2. " + ex.toString());
        return;
    }

    int cypheredBytes = 0;

    byte[] inputBytes;
    try {
        inputBytes =textToDecrypt.getBytes("UTF-8");
       inputBytes = textToDecrypt.getBytes();
    } catch (Exception ex) {
        System.out.println("3. " + ex.toString());
        return;
    }

    byte[] outputBytes = new byte[100];

    try {
        cypheredBytes = cipher.doFinal(inputBytes, 0, inputBytes.length,
                outputBytes, 0);
    } catch (Exception ex) {
        System.out.println("4. " + ex.toString());
        return;
    }

    String str = new String(outputBytes, 0, cypheredBytes);
    System.out.println("Decrypted string = " + str);
}

Я новичок в этих вещах.Я получил эти коды с этого сайта.Пожалуйста, дайте мне знать, как получить данные в сервлете при отправке мидлетом. (Без изменения данных ...), если вы видите какую-то ошибку в моем коде или способе попытаться получить ... пожалуйста, дайте мне знать с примером кода.или, если где-то есть работающий пример кода для отправки данных из мидлета в сервлет, сообщите мне

Спасибо

Ответы [ 2 ]

1 голос
/ 07 августа 2011

Это как минимум один из возможных виновников:

while ((i = sin.read()) != -1) {
    ch = (char) i;
    str = str + ch;
}

Почему вы пытаетесь превратить непрозрачные двоичные данные ( не текстовые данные) в строку?Затем вы вызываете String.getBytes() в другом месте, чтобы получить двоичные данные, даже не указывая кодировку. Не делайте этого.

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

Кроме того, для преобразования текста в двоичные данные до шифрования (около начала encrypt) вы должны указать кодировку (UTF-8, вероятно, хорошая ставка).Используйте ту же кодировку после того, как вы расшифровали двоичные данные и хотите преобразовать результат обратно в строку.

0 голосов
/ 07 августа 2011

Ваше сообщение об ошибке гласит: «javax.crypto.IllegalBlockSizeException: длина ввода должна быть кратна 8 при дешифровании с использованием дополненного шифра». Вам нужно указать одинаковые отступы на обоих концах, шифрование и дешифрование. Обычным дополнением является PKCS # 5, который должен быть доступен на обоих концах. Не полагайтесь на значения по умолчанию, но явно указывайте отступы. Разные системы могут иметь разные значения по умолчанию.

Совет Джона о том, чтобы не смешивать текст и байты, превосходен.

...