简单图片加密

如今大部分android应用的图片资源,被反编译后就能够直接拿来用,若是不想让本身的图片资源直接被反编译后使用,首先想到的应该是把图片加密。这里笔者抛砖引玉,草草写了一个对图片进行简单加密的方法,但愿对各位看官有用。java

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

<span style="font-size:14px;">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();
    }

}</span>

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

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

<span style="font-size:14px;">ImageView img = (ImageView) findViewById(R.id.img);
Bitmap bitmap = ImageAdapter.readBitmap(this, "loading.dat");
if(bitmap != null) {
    img.setImageBitmap(bitmap);
} else {
    System.out.println("图片为空");
}</span>

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

<span style="font-size:14px;">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;
	}

}</span>

笔者的方法,并非最好的方法,这里只是抛砖引玉,给须要保护本身的图片资源的朋友一个简单的思路。命令行