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