在Android系统中实现短信加密时,通常需要经过短信编码,短信息加密,短信息解密和短信息解码这4个组成部分。具体设计模式如下所示。
(1)在接收短信的时候,设计一个smsService类,即JDK去继承其基类Service,作为系统服务后台运行服务,并且判断是否收到短信。
(2)一旦收到短信便运行解析与重组短信的工作,在重组之后通过sendBroadcast发送系统广播,并在构建Intent时传入自定义的ACTION名称。
(3)设计一个继承自基类Broadcast Receiver的类,功能是接受自定义系统广播ACTION信息。一旦smsService服务传来广播信息,就会被所设计的类接受,然后通过接收传来的参数和唤醒来接收的主程序。
一,短信编码设计模式
在Android系统中,可以很容易地发送英文或数字,但是当发送中文时会出现乱码问题。所以当Android发送带有中文的短信息时应该进行必要的编码处理。例如在处理中文时可以采用将中文编码转换为unicode编码的处理方式,这样就可以正确地传达中文信息了。这种编码方案具体处理流程如下所示:
(1)首先获取短信息内容的字符长度,同时从短信的第一个字符开始获取字符。因为英文和数字ASCII码小于128,所以可以依据这个条件来判断取得的字符是否为中文字符。
(2)如果为中文字符,将字符进行转unicode码的处理。
(3)编码处理后的字符就形成了可以正确发送的信息。
举一个简单例子,假设发送的短信息是“aaa晚上好”,按照上述处理模式编码后,可以得到“aaa\u665a\u4e0a\u597d”的结果,这样把每个前面带有u分隔符的unicode字符进行加密处理后并发送出去。在接收的信息解密后,得到的也是“aaa\u665a\u4e0a\u597d”,然后判断“aaa\u665a\u4e0a\u597d“中是否有分隔符u,如果有则转换成中文字符,最终输出的短信息是“aaa晚上好”。
接下来给一个通用的RSA加密Android短信算法代码:
//此处我就省略Package and import
public class RSACoder {
public static String Key_ALGORITHM="RSA";
public static String Private_Key="RSAPrivateKey";
public static String Public_Key="RSAPublicKey";
//密钥长度
public static int Key_Size=512;
public static Map<String,Object> initKey() throws Exception {
//实例化密钥生成器
KeyPairGenerator keypairgenerator = keyPairGenerator.getInstance(Key_ALGORITHM);
//初始化
keypairgenerator.initialize(Key_size);
//获得密钥对
KeyPair keypair = keypairgenerator.generateKeyPair();
//密钥
RSAPrivate privatekey = (RSAPrivateKey)keypair.getPrivate();
//公钥
RSAPublicKey pubkey = (RSAPbulicKey)keypair.getPublic();
Map<String,Object> keymap = new HashMap<String,Object>(2);
keymap.put(Private_Key, private);
keymap.put(Public_Key, pubkey);
return keymap;
}
//获得密钥
public static byte[] getPrivateKey(Map<String,Object>keymap) {
Key privatekey = (Key)keymap.get(Private_Key);
return privatekey.getEncoded();
}
//获得公钥
public static byte[] getPublicKey(Map<String,Object>keymap){
Key pubkey = (Key)keymap.get(Public_Key);
return pubkey.getEncoded();
}
//私钥加密
public static byte[] encryptByPrivateKey(byte[] key, byte[] data) throws Exception{
//实例化密钥材料
PKCS8EncodedKeySpec pcs8spec = new PKCS8EncodedKeySpec(key);
//实例化密钥工厂
KeyFactory keyfactory = KeyFactory.getInstance(Key_ALGORITHM);
//生成私钥
PrivateKey privatekey = keyfactory.generatePrivate(pcs8spec);
//私钥加密
Cipher cipher = Cipher.getInstance(pivatekey.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE,privatekey);
return cipher.doFinal(data);
}
//公钥解密
public static byte[] decryptByPublicKey(byte[] key, byte[] data) throws Exception{
//实例化公钥材料
X509EncodedKeySpec x509spec = new X509EncodedKeySpec(key);
//实例化密钥工厂
KeyFactory keyfactory = KeyFactory.getInstance(KEY_ALGORITHM);
//获得公钥
PublicKey pubkey = keyfactory.generatePublic(x509spec);
//对数据进行解密
Cipher cipher = Cipher.getInstance(Key_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, pubkey);
return cipher.doFinal(data);
}