我有一些在Java中正常工作的代码,但是当我尝试在Android中使用它时,它遇到了问题。
我正在尝试使用Blowfish算法加密SMS文本消息。
此代码(在android上)的问题是它不接受byte []并且不会解密消息。
发送短信
sMessage = "hello this is a message"
byte[] byteArray = EncryptBlowfish(sMessage);
//Convert the byte[] into a String which can be sent over SMS
StringBuffer strb = new StringBuffer();
for( int x = 0; x<byteArray.length; x++){
strb.append(byteArray[x]).append(",");
}//for loop
sMessage = strb.toString();
(然后通过短信发送sMessage)
收到短信
//Convert the String back to a byte[] which can be decrypted
String[] strArray = sMessage.split(",");
byte[] byteArray = new byte[strArray.length];
int hold;
for (int x = 0; x < strArray.length; x++) {
hold = Integer.parseInt(strArray[x]);
byteArray[x] = (byte) hold;
}//for loop
sMessage = DecryptBlowfish(byteArray);
加密方法
public static byte[] EncryptBlowfish(String msg){
byte[] encrypted =null;
try {
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, secretkey);
encrypted = cipher.doFinal(msg.getBytes());
} catch (){ //NoSuchAlgorithmException, NoSuchPaddingException..etc
}
return encrypted;
}
解密方法
public static String DecryptBlowfish(byte[] msg){
byte[] decrypted =null;
try {
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.DECRYPT_MODE, secretkey);
decrypted = cipher.doFinal(msg);
} catch (){ //NoSuchAlgorithmException, NoSuchPaddingException..etc
}
return decrypted;
}
消息正在加密,这会创建一个byte [],然后我将byte []转换为字符串,字符串的输出将看起来像这样......
46,77,52,11,-108,91,-106,88,-81,-43,14,111,-118,-128,-92,-50,69,-44,100,-94,71 ,92,-49,116,
然后通过SMS发送此输出。然后将字符串转换回byte [] 但是这个字节数组没有解密。
问题:
(如果需要更多信息,请发表评论,谢谢)
答案 0 :(得分:3)
我认为答案涉及Android与标准Java上的默认字符编码。如果使用msg.getBytes(Charset c)指定字符编码,并解码新的String(byte [],Charset c),会发生什么。
示例:
// String => byte []
byte[] bytes = message.getBytes(Charset.forName("ISO-8859-1"));
// byte [] => String
String foo = new String(bytes, Charset.forName("ISO-8859-1"));
您可以从以下网址找到可用的字符集:
for (String c : Charset.availableCharsets().keySet()) {
System.out.println(c);
}
答案 1 :(得分:1)
我认为制作字节时存在问题 - &gt; string - &gt;字节转换。尝试发送未加密的字符串并检索它并检查它是否正确。
您应该在每一步指定编码。
答案 2 :(得分:0)
要从字节数组转换为字符串,请使用
Base64.encodeToString(byteArray, Base64.NO_WRAP);
要从字符串转换为字节数组,请使用此
Base64.decode(string, Base64.DEFAULT);
Base64
类在android.util
包中。