短信加密机制的设计模式

在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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值