Android简单加密保护自有图片资源
现在大部分android应用的图片资源,被反编译后就可以直接拿来用,如果不想让自己的图片资源直接被反编译后使用,首先想到的应该是把图片加密。这里笔者抛砖引玉,草草写了一个对图片进行简单加密的方法,希望对各位看官有用。
首先是加密部分,这里使用的是简单的异或来将图片进行加密。新建一个java project或者干脆直接用文本文件写下下面的代码,然后在命令行执行,代码如下:

1 import java.io.File;
2
3 import javax.imageio.stream.FileImageInputStream;
4 import javax.imageio.stream.FileImageOutputStream;
5 import javax.imageio.stream.ImageInputStream;
6 import javax.imageio.stream.ImageOutputStream;
7
8 public class EncriptDemo {
9
10 public static final int XOR_CONST = 0X99; //密钥
11
12 /**
13 * @param args
14 */
15 public static void main(String[] args) {
16
17 File load = new File("/home/jade/桌面/loading.png");
18 File loaddest = new File("/home/jade/桌面/loading.dat");
19 File loadd = new File("/home/jade/桌面/loading_depr.png");
20
21 try {
22 encrImg(load, loaddest);
23 encrImg(loaddest, loadd);
24 } catch (Exception e) {
25 e.printStackTrace();
26 }
27 }
28
29 public static void encrImg(File src, File dest) throws Exception {
30 ImageInputStream fis = new FileImageInputStream(src);
31 ImageOutputStream fos = new FileImageOutputStream(dest);
32
33 int read;
34 while ((read = fis.read()) > -1) {
35 fos.write(read ^ XOR_CONST);
36 }
37 fos.flush();
38 fos.close();
39 fis.close();
40 }
41
42 }

上 面的代码并没有进行文件是否存在的判断,因为这段代码是自己对文件进行加密,所以文件是否存在自己检查下即可。熟悉异或的朋友应该想得到,其实上面的 encrImg(File src, File dest)方法既可以做加密,又可以做解密,在main里做了两次调用,第一次用来加密,第二次进行解密。这样加密的程序就完成了,接下来看一下在 android中解密的方法(上面的加密代码,使用了javax.imageio.stream包中的相关类,故默认不能在android工程中执行)。
把刚刚加密好的loading.dat文件拷贝到android项目的assets文件夹下,然后在layout中添加一个ImageView,id为img,这样在activity中就可以执行以下代码:

1 ImageView img = (ImageView) findViewById(R.id.img);
2 Bitmap bitmap = ImageAdapter.readBitmap(this, "loading.dat");
3 if(bitmap != null) {
4 img.setImageBitmap(bitmap);
5 } else {
6 System.out.println("图片为空");
7 }

这里调用了ImageAdapter的静态方法readBitmap,该方法读取笔者这里仅仅是一个demo,所以没有考虑ANR等处理,正式项目最好是将图片加载解密部分放在独立的线程中执行。ImageAdapter的代码如下:

1 import java.io.IOException;
2 import java.io.InputStream;
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import android.content.Context;
7 import android.graphics.Bitmap;
8 import android.graphics.BitmapFactory;
9
10 public class ImageAdapter {
11
12 public static Bitmap readBitmap(Context context, String fileName) {
13 Bitmap bitmap = null;
14 List list = new ArrayList();
15 try {
16 InputStream is = context.getAssets().open(fileName);
17 int read;
18 while ((read = is.read()) > -1) {
19 read = read ^ 0X99;
20 list.add((byte)read);
21 }
22
23 byte[] arr = new byte[list.size()];
24 int i = 0;
25 for(Byte item : list) {
26 arr[i++] = item;
27 }
28 bitmap = BitmapFactory.decodeByteArray(arr, 0, list.size());
29 System.out.println(bitmap);
30 } catch (IOException e) {
31 e.printStackTrace();
32 }
33 return bitmap;
34 }
35
36 }

笔者的方法,并不是最好的方法,这里只是抛砖引玉,给需要保护自己的图片资源的朋友一个简单的思路。
http://www.cnblogs.com/error404/archive/2013/06/03/3115492.html
Android简单加密保护自有图片资源的更多相关文章
- .Net加密保护工具分析介绍
本文主要介绍一些dotNet加密保护工具的原理以及就其脱壳进行简单探讨. remotesoft protector.maxtocode..Net Reactor.Cliprotector.themid ...
- .NET 产品版权保护方案 (.NET源码加密保护) (转载)
说 明:你希望自己用.net辛辛苦苦做出来的软件被人轻易破解吗?你希望自己花了大量人力物力用.net开发出来的产品被竞争对手轻易获取核心代码吗?这是 一篇比较详尽地介绍如何保护自己的.net源代码的文 ...
- [破解] DRM-内容数据版权加密保护技术学习(上):视频文件打包实现
1. DRM介绍: DRM,英文全称Digital Rights Management, 可以翻译为:内容数字版权加密保护技术. DRM技术的工作原理是,首先建立数字节目授权中心.编码压缩后的数字节目 ...
- Android 安全加密
Android 安全加密 引言 对称加密.非对称加密.消息摘要.数字签名等知识都是为了理解数字证书工作原理而作为一个预备知识.数字证书是密码学里的终极武器,是人类几千年历史总结的智慧的结晶,只 ...
- 常见dotNet加密保护工具分析介绍(转)
本文主要介绍一些dotNet加密保护工具的原理以及就其脱壳进行简单探讨.remotesoft protector.maxtocode..Net Reactor.Cliprotector .themi ...
- [C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护)
[C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护) 标签: .net加密产品c#dll工具 2011-03-24 21:06 27009人阅读 评论(13) 收藏 举报 分类: C ...
- 2018-8-10-用-sim-卡加密保护资金
title author date CreateTime categories 用 sim 卡加密保护资金 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17 ...
- SpringBoot自定义classloader加密保护class文件
背景 最近针对公司框架进行关键业务代码进行加密处理,防止通过jd-gui等反编译工具能够轻松还原工程代码,相关混淆方案配置使用比较复杂且针对springboot项目问题较多,所以针对class文件加密 ...
- 用C语言简单加密解密
使用char表示的字符型数据,在本质上与我们前面介绍的整型数据并无太大的区别,只是char类型占用的内存字节数更小,能够表示的数据范围更小而已.在使用上,char被专门用来表示C语言的字符集中的各种字 ...
随机推荐
- ASP.NET发送电子邮件
代码: using System; using System.Collections.Generic; using System.Configuration; using System.Linq; u ...
- Redis系列二之事务及消息通知
一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...
- Docker: adding a file from a parent directory
17down votefavorite 4 In my Dockerfile I've got : ADD ../../myapp.war /opt/tomcat7/webapps/ That fil ...
- 电子商务中:B2C、B2B、C2B、C2C、O2O、P2P
c2c实际是电子商务的专业用语,是个人与个人之间的电子商务.比如一个消费者有一台电脑,通过网络进行交易,把它出售给另外一个消费者,此种交易类型就称为C2C电子商务.淘宝是属于C2C模式的. c2 ...
- poj-1703-Find them, Catch them
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 41928 Accepted: ...
- [moka同学笔记]Yii2 数据操作Query Builder 2
Query Builder $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name']) ->from('zs_dynast ...
- R语言XML格式数据导入与处理
数据解析 XML是一种可扩展标记语言,它被设计用来传输和存储数据.XML是各种应用程序之间进行数据传输的最常用的工具.它与Access,Oracle和SQL Server等数据库不同,数据库提供了更强 ...
- 解决远程连接mysql很慢的方法(mysql_connect 打开连接慢)
http://www.jb51.net/article/27616.htm 有次同事提出开发使用的mysql数据库连接很慢,因为我们的mysql开发数据库是单独一台机器部署的,所以认为可能是网络连 ...
- c# 学习心得(函数方法类)
函数或者说方法都是写在类下的,我们可以通过函数名来调用它们.首先,我们要弄清楚为什么会有函数或者说方法这种东西?这里,我们使用了与前一篇同样的思维方式,先从它的目的或者实用价值出发.当我们在编写程序的 ...
- 不简单的SQL查询和排序语句
真不简单!! 一:使用select语句进行查询 语法: SELECT <列名> FROM <表名> [WHERE <查询条件表达式>] [OR ...