bouncycastle加密数据从midlet发送到servlet

时间:2011-08-07 12:14:22

标签: java encryption bouncycastle midlet

我想加密要发送到servlet的midlet中的数据。我可以加密midlet中的数据。我用了bouncycastle。它工作得很好(我可以加密和解密)。然后我将加密数据发送到servlet。对于刚刚进行测试,我只是在servlet中使用相同的代码(在midlet中使用的解密)进行解密。但现在问题是,当midlet发送时,数据没有收到。加密数据已被更改。这是我得到的样品输出。这是在midlet加密后的输出。 øâ〜Ë•T«üwÈÉÜA?.bH在这里输入代码,但是当我从servlet思考输入流时得到这个代码。打印结果是:øâ Ã,Â〜Ã,¬ÃÂ<Ã,•TÃ,«Ã¼wÃÂÉÜAÃ,Â?.bHÃÂ,Ã,¾e也有例外

javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是8的倍数这是我从midlet向服务器发送数据的方式:

        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();

在这里的servlet是我得到的:在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);
}

我是这些东西的新手。我也从这个网站获得了这些代码。请告诉我如何在midlet发送时获取servelet中的数据。(不更改数据..)如果您在我的代码中看到一些错误或尝试获取的方式..请通过代码示例告诉我。或者如果在其他任何地方都有一个工作示例代码将数据从midlet发送到servlet,请告诉我

谢谢

2 个答案:

答案 0 :(得分:1)

这至少是一个可能的罪魁祸首:

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

为什么要尝试将不透明的二进制数据(文本数据)转换为字符串?然后你在其他地方调用String.getBytes()来获取二进制数据,甚至没有指定编码。 不要这样做。

如果您绝对 将不透明二进制数据表示为文本,请使用Base64。然而, 我认为没有理由首先使用文本传输数据 - 只需将其以二进制形式传输即可开始。

此外,要在加密之前(encrypt的开头附近)将文本转换为二进制数据,您应该指定编码(UTF-8可能是一个不错的选择)。在解密二进制数据后使用相同的编码,并希望将结果转换回字符串。

答案 1 :(得分:0)

您的错误消息显示:“javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是8的倍数”。您需要在两端指定相同的填充,加密和解密。常见的填充是PKCS#5,它应该在两端都可用。不要依赖默认值,而是明确指定填充。不同的系统可能有不同的默认值。

John关于不混合文本和字节的建议非常好。