Android中使用加密图片的解决方案
产品要求资源zip包中的图片资源要加密,于是在需求的驱动下,在网上搜寻解决方案。
加密方式
加密方式很多种,从最简单的交换字节顺序,到各种加密算法。下面简单列一下网上摘录的加密算法的对比。
- AES/DES加密速度快,适合大量数据,DES容易破解,一般用3重DES,后来又出现了更快更安全的AES
- RSA是公钥加密,速度慢,只能处理少量数据,优点是公钥即使在不安全的网络上公开,也能保证安全
由此加密算法选定了AES加密算法,在网上搜索AES加密实现的时候发现几乎都是对byte[]的加密解密操作,考虑到Android机上对图片做解密操作可能对内存消耗大,尝试找有没有基于Stream的加密解密方式,经过了一番资料查找找到了支持AES加密解密的CipherInputStream
和CipherOutputStream
借助这两个Stream可以实现将加密的图片文件读取成解密后的Bitmap。方法找到了,下面来看下关键代码
加密关键代码
/**
* 加密
*
* @param file 待加密数据
* @param key 密钥
* @param cipherAlgorithm 加密算法/工作模式/填充方式
* @return byte[] 加密数据
* @throws Exception
*/
private static OutputStream encrypt(File file, Key key) throws Exception{
//实例化
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
//使用密钥初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, key);
//执行操作
CipherOutputStream cos = new CipherOutputStream(new FileOutputStream(file), cipher);
return cos;
}
解密关键代码
/**
* 解密
*
* @param file 待解密文件
* @param key 密钥
* @param cipherAlgorithm 加密算法/工作模式/填充方式
* @return byte[] 解密数据
* @throws Exception
*/
private static InputStream decrypt(File file, Key key) throws Exception{
//实例化
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
//使用密钥初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, key);
//执行操作
CipherInputStream cis = new CipherInputStream(new FileInputStream(file), cipher);
return cis;
}
构造Key
/**
* 转换密钥
*
* @param key 二进制密钥
* @return 密钥
*/
private static Key toKey(byte[] key){
//生成密钥
return new SecretKeySpec(key, "AES");
}
生成128位二进制密钥
/**
* 初始化密钥
*
* @return byte[] 密钥
* @throws Exception
*/
public