用異或法簡單加密Android的圖片資源
阿新 • • 發佈:2019-02-04
思路:本地用異或加密好圖片---放入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; } }