2013-06-05 184 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)); 
     } 

}