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 }

 

筆者的方法,並不是最好的方法,這里只是拋磚引玉,給需要保護自己的圖片資源的朋友一個簡單的思路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM