1. 程式人生 > >用異或法簡單加密Android的圖片資源

用異或法簡單加密Android的圖片資源

思路:本地用異或加密好圖片---放入Android的assets資料夾下---在程式裡用異或解密。

都知道解壓APK檔案能拿到程式的圖片資源,為了保護圖片資源不被盜用,可採用簡單異或的方法對圖片進行加密,這樣即使解壓APK檔案,圖片也無法開啟。

第一步,通過建立一個JAVA工程來對本地圖片異或加密。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * 用異或方法加密和解密圖片
 * @author Administrator
 *
 */
public class EncryptDemo {

	public static final int XOR_CONST = 0X99; // 異或金鑰

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		File load = new File("D:\\Windows\\Desktop\\eee.jpg");		//原圖
		File result = new File("D:\\Windows\\Desktop\\eee.dat");	//加密後得到的檔案
		File reload = new File("D:\\Windows\\Desktop\\eee2.jpg");	//解密後得到的原圖

		try {
			encryptImg(load, result);	// 加密原圖
			encryptImg(result, reload);	// 對加密後的檔案再加密得到原圖
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 檔案流異或加密
	 * @param src
	 * @param dest
	 * @throws Exception
	 */
	public static void encryptImg(File load, File result) throws Exception {
		FileInputStream fis = new FileInputStream(load);
		FileOutputStream fos = new FileOutputStream(result);

		int read;
		while ((read = fis.read()) > -1) {
			fos.write(read ^ XOR_CONST);	//進行異或運算並寫入結果
		}
		fos.flush();
		fos.close();
		fis.close();
	}

}


第二步,把生成的加密檔案.dat放到android工程的assets資料夾下。


第三步,在android程式建立一個ImageView,用來顯示解密圖片資源。

package com.example.encryptdemo2;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import com.example.encryptdemo2.R;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;

/**
 * android中用異或解密圖片資源
 * @author Administrator
 *
 */
public class MainActivity extends Activity {
	
	private ImageView img;
	private Bitmap bitmap;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		img = (ImageView) findViewById(R.id.img);
		bitmap = readBitmap(this, "eee.dat");	//獲取解密後的圖片
		
		if(bitmap != null) {
		    img.setImageBitmap(bitmap);
		} else {
		    System.out.println("圖片為空");
		}
	}

	/**
	 * 異或解密圖片方法
	 * @param context
	 * @param fileName
	 * @return
	 */
	public static Bitmap readBitmap(Context context, String fileName) {
		Bitmap bitmap = null;
		List<Byte> list = new ArrayList<Byte>();
		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()];
			for (int i = 0; i < arr.length; i++) {
				arr[i] = (Byte) list.get(i);	//list轉成byte[]
			}
			//通過byte陣列獲取二進位制圖片流
			bitmap = BitmapFactory.decodeByteArray(arr, 0, arr.length);
			System.out.println(bitmap);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return bitmap;
	}
}