2013-06-05 148 views
0

你好我正在做一个加密和解密SMS的adroid应用程序。我有一个问题,当短信的大小超过80个字符的短信不能发送和应用程序。停止工作(给出错误)(少于80个字符没有错误,我可以发送短信)。我首先将消息转换为字节(UTF-8),然后使用getBytes()加密并发送它。发送短信错误android

这是logcat的错误:

06-05 12:16:42.460: E/AndroidRuntime(333): java.lang.NullPointerException 
06-05 12:16:42.460: E/AndroidRuntime(333):android.os.Parcel.readException(Parcel.java:1328) 
06-05 12:16:42.460: E/AndroidRuntime(333):android.os.Parcel.readException(Parcel.java:1276) 
06-05 12:16:42.460: E/AndroidRuntime(333):atcom.android.internal.telephony.ISms$Stub$Proxy.sendText(ISms.java:369) 
06-05 12:16:42.460: E/AndroidRuntime(333):atandroid.telephony.SmsManager.sendTextMessage(SmsManager.java:87) 
06-05 12:16:42.460: E/AndroidRuntime(333):atcom.cryptosms.MainActivity.sendSMS(MainActivity.java:296) 
06-05 12:16:42.460: E/AndroidRuntime(333):atcom.cryptosms.MainActivity$3.onClick(MainActivity.java:142) 
06-05 12:16:42.460: E/AndroidRuntime(333):at android.view.View.performClick(View.java:2485) 
06-05 12:16:42.460: E/AndroidRuntime(333):atandroid.view.View$PerformClick.run(View.java:9080) 
06-05 12:16:42.460: E/AndroidRuntime(333): atandroid.os.Handler.handleCallback(Handler.java:587) 
06-05 12:16:42.460: E/AndroidRuntime(333): atandroid.os.Handler.dispatchMessage(Handler.java:92) 
06-05 12:16:42.460: E/AndroidRuntime(333): at android.os.Looper.loop(Looper.java:123) 
06-05 12:16:42.460: E/AndroidRuntime(333): atandroid.app.ActivityThread.main(ActivityThread.java:3683) 
06-05 12:16:42.460: E/AndroidRuntime(333): at java.lang.reflect.Method.invokeNative(Native Method) 
06-05 12:16:42.460: E/AndroidRuntime(333):atjava.lang.reflect.Method.invoke(Method.java:507) 
06-05 12:16:42.460: E/AndroidRuntime(333):atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
06-05 12:16:42.460: E/AndroidRuntime(333):atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
06-05 12:16:42.460: E/AndroidRuntime(333): at dalvik.system.NativeStart.main(Native Method) 
+0

您是否试图加密超过80字符的字符串? – itsrajesh4uguys

+0

这是您在短信中传递的内容的解析错误。你有任何特殊字符?你是否适当地处理了它们? –

+0

是的,我输入80个字符或更多,但我也得到相同的错误,少于80这是好的,我可以加密和解密。不,我没有任何特殊字符只是字母和数字。提示:我正在使用sendTextMessage()。 – mamado

回答

0

喜尝试用下面的代码进行加密和解密。

import java.security.SecureRandom; 

import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.SecretKeySpec; 

/** 
* Usage: 
* <pre> 
* String crypto = SimpleCrypto.encrypt(masterpassword, cleartext) 
* ... 
* String cleartext = SimpleCrypto.decrypt(masterpassword, crypto) 
* </pre> 
* @author ferenc.hechler 
*/ 
public class SimpleCrypto { 


    public static void main(String args[]) 
    { 


     try { 

      String sr=encrypt("username", "The AsyncTask isn’t the only way to do background processing in Android, though. The Loader class is a much newer construct in Android (although now it’s getting a bit dated). It was released with Honeycomb(3.0) and is now included in the Support Library. The beauty of the Loader is that it handles some of the ‘gotchas’ that usually are missed when using the AsyncTask. Mainly, it handles activity configuration changes (IE when the user rotates the screen)"); 
      System.out.println(" &&&& " + sr); 
      System.out.println("88888 "+decrypt("username", sr)); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
     public static String encrypt(String seed, String cleartext) throws Exception { 
       byte[] rawKey = getRawKey(seed.getBytes()); 
       byte[] result = encrypt(rawKey, cleartext.getBytes()); 
       return toHex(result); 
     } 

     public static String decrypt(String seed, String encrypted) throws Exception { 
       byte[] rawKey = getRawKey(seed.getBytes()); 
       byte[] enc = toByte(encrypted); 
       byte[] result = decrypt(rawKey, enc); 
       return new String(result); 
     } 

     private static byte[] getRawKey(byte[] seed) throws Exception { 
       KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
       SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); 
       sr.setSeed(seed); 
      kgen.init(128, sr); // 192 and 256 bits may not be available 
      SecretKey skey = kgen.generateKey(); 
      byte[] raw = skey.getEncoded(); 
      return raw; 
     } 


     private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { 
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
       Cipher cipher = Cipher.getInstance("AES"); 
      cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
      byte[] encrypted = cipher.doFinal(clear); 
       return encrypted; 
     } 

     private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception { 
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
       Cipher cipher = Cipher.getInstance("AES"); 
      cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
      byte[] decrypted = cipher.doFinal(encrypted); 
       return decrypted; 
     } 

     public static String toHex(String txt) { 
       return toHex(txt.getBytes()); 
     } 
     public static String fromHex(String hex) { 
       return new String(toByte(hex)); 
     } 

     public static byte[] toByte(String hexString) { 
       int len = hexString.length()/2; 
       byte[] result = new byte[len]; 
       for (int i = 0; i < len; i++) 
         result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue(); 
       return result; 
     } 

     public static String toHex(byte[] buf) { 
       if (buf == null) 
         return ""; 
       StringBuffer result = new StringBuffer(2*buf.length); 
       for (int i = 0; i < buf.length; i++) { 
         appendHex(result, buf[i]); 
       } 
       return result.toString(); 
     } 
     private final static String HEX = "ABCDEF"; 
     private static void appendHex(StringBuffer sb, byte b) { 
       sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f)); 
     } 

}