Android中使用加密图片的解决方案

本文介绍在Android中如何使用AES加密算法处理图片资源,避免明文存储。通过对比不同的加密算法,选择了AES,并实现了基于Stream的加密解密方法。文章详细讲解了如何将加密解密功能集成到Universal-Image-Loader库中,包括解密图片和加密缓存的过程,确保在磁盘上的图片保持加密状态。
摘要由CSDN通过智能技术生成

Android中使用加密图片的解决方案

产品要求资源zip包中的图片资源要加密,于是在需求的驱动下,在网上搜寻解决方案。

加密方式

加密方式很多种,从最简单的交换字节顺序,到各种加密算法。下面简单列一下网上摘录的加密算法的对比。

  • AES/DES加密速度快,适合大量数据,DES容易破解,一般用3重DES,后来又出现了更快更安全的AES
  • RSA是公钥加密,速度慢,只能处理少量数据,优点是公钥即使在不安全的网络上公开,也能保证安全

由此加密算法选定了AES加密算法,在网上搜索AES加密实现的时候发现几乎都是对byte[]的加密解密操作,考虑到Android机上对图片做解密操作可能对内存消耗大,尝试找有没有基于Stream的加密解密方式,经过了一番资料查找找到了支持AES加密解密的CipherInputStreamCipherOutputStream借助这两个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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值