Android简单加密保护自有图片资源

来源:互联网 发布:org.apache 编辑:程序博客网 时间:2024/04/28 13:20


现在大部分android应用的图片资源,被反编译后就可以直接拿来用,如果不想让自己的图片资源直接被反编译后使用,首先想到的应该是把图片加密。这里笔者抛砖引玉,草草写了一个对图片进行简单加密的方法,希望对各位看官有用。

首先是加密部分,这里使用的是简单的异或来将图片进行加密。新建一个java project或者干脆直接用文本文件写下下面的代码,然后在命令行执行,代码如下:

import java.io.File;import javax.imageio.stream.FileImageInputStream;import javax.imageio.stream.FileImageOutputStream;import javax.imageio.stream.ImageInputStream;import javax.imageio.stream.ImageOutputStream;public class EncriptDemo {public static final int XOR_CONST = 0X99; //密钥/** * @param args */public static void main(String[] args) {File load = new File("/home/jade/桌面/loading.png");File loaddest = new File("/home/jade/桌面/loading.dat");File loadd = new File("/home/jade/桌面/loading_depr.png");try {encrImg(load, loaddest);encrImg(loaddest, loadd);} catch (Exception e) {e.printStackTrace();}}    public static void encrImg(File src, File dest) throws Exception {        ImageInputStream fis = new FileImageInputStream(src);        ImageOutputStream fos = new FileImageOutputStream(dest);        int read;        while ((read = fis.read()) > -1) {        fos.write(read ^ XOR_CONST);        }        fos.flush();        fos.close();        fis.close();    }}

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

把刚刚加密好的loading.dat文件拷贝到android项目的assets文件夹下,然后在layout中添加一个ImageView,id为img,这样在activity中就可以执行以下代码:

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

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

import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;public class ImageAdapter { public static Bitmap readBitmap(Context context, String fileName) {Bitmap bitmap = null;List list = new ArrayList(); try {    InputStream is = context.getAssets().open(fileName);    int read;            while ((read = is.read()) > -1) {        read = read ^ 0X99;        list.add((byte)read);            }            byte[] arr = new byte[list.size()];            int i = 0;            for(Byte item : list) {        arr[i++] = item;            }    bitmap = BitmapFactory.decodeByteArray(arr, 0, list.size());    System.out.println(bitmap);} catch (IOException e) {e.printStackTrace();}return bitmap;}}

笔者的方法,并不是最好的方法,这里只是抛砖引玉,给需要保护自己的图片资源的朋友一个简单的思路。

0 0
原创粉丝点击