最近項目中需要用到加解密功能,言外之意就是不想讓人家在反編譯后通過不走心就能獲取文件里一些看似有用的信息,但考慮到加解密的簡單實現,這里並不使用AES或DES加解密
為了對android中assets文件里的數據加密,我決定自己動手豐衣足食。
首先我們需要一個配置文件命名為config.properties
數據如下:
#sex信息 YB_APP_ID = wx1c7zxc5049b364e NB_SEX_PARTNERID=128sd72701 WY_NOTI_KEY= eSJaA8ESk6xYiTIma0px4lYO0P7yBnzz
上述信息格式有些不整齊,但無關大雅,通過后續代碼正好可以驗證只要是類似的數據都會加密成功,因為我們會剔除帶有”#”的數據注釋,和兩條數據之間的空格,以及通過”=”號分隔最終會把每一條數據之間的含有的空格也排除在外,所以”=”后面跟的數據會按照正確的方式被加密。
然后通過java代碼如下:
//定義文件名 private static final String CONFIG_PROPERTIES = "config.properties";
//調用加密方法 public static void main(String[] args) { //這里因為要傳入輸入路徑和輸出路徑,所以要現在D盤上新建兩個文件夾分別命名為encodeFile和myEncodedFile //我將文件放在了電腦的D盤encodeFile文件夾下, //並讓它最后輸出在D盤的myEncodedFile文件夾下 encodeFile("D:\\encodeFile\\" + CONFIG_PROPERTIES,"D:\\myEncodedFile\\"+ CONFIG_PROPERTIES); }
/** *加密文件 * @param inputPath 輸入路徑 * @param outputPath 輸出路徑 * @return 是否加密文件成功 */ private static boolean encodeFile(String inputPath, String outputPath) { File localFile = new File(inputPath); try { if (!localFile.exists()) { return false; } StringBuilder builder = new StringBuilder(); BufferedReader in = new BufferedReader(new FileReader(localFile)); String line = ""; while ((line = in.readLine()) != null) { if (!line.trim().startsWith("#") && !line.trim().equals("")) { builder.append(line + '\n'); } } System.out.print("AA..:" + builder.toString()); //產生加密文件 generateFile(builder2Encode(builder.toString()), outputPath); return true; } catch (IOException e) { e.printStackTrace(); } return false; } /** * 實現算法產生加密數據 * @param eString 要加密的數據 * @return 加密后的數據 */ private static String builder2Encode(String eString) { StringBuilder builder = new StringBuilder(); long lenth = eString.length(); for (int i = 0; i < lenth; i ++){ builder.append((char) (eString.charAt(i) + i % 5)); } System.out.println("=========encode string======================"); System.out.print("AA..:\\"+builder.toString()); return builder.toString(); } /** *產生加密文件 * @param text 要加密的數據 * @param filePath 輸出路徑 */ private static void generateFile(String text, String filePath) { try { File file = new File(filePath); if (!file.exists()) { File dir = new File(file.getParent()); dir.mkdirs(); file.createNewFile(); } FileOutputStream outStream = new FileOutputStream(file); outStream.write(text.getBytes()); outStream.close(); } catch (Exception e) { e.printStackTrace(); } }
以上這些方法就為我們生成了加密文件,然后我們在android項目中再通過非對稱解密,反解出真正需要的數據用於處理實際操作,
這里因為要先運行以上這個加密demo,然后用在項目中,的確會有些繁瑣,但因為assets文件是只讀文件,所以我們能操作的也就這點能力了。
接下來我們看Android里如何實現解密:
/** * 獲取解密信息 * @param c * @return */ public static String getEncryptProperty(Context c) { InputStream is = null; ByteArrayOutputStream outStream = null; try { is = c.getAssets().open("config.properties"); outStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int count = -1; while ((count = is.read(data, 0, 1024)) != -1) { outStream.write(data, 0, count); } Log.i("load file encode start..."); String encode = new String(outStream.toByteArray(), "UTF-8"); //獲取解密字符串 String stringNative = GaoCryptUtil.getEString(encode); Log.i("load file encode end..."+stringNative); return stringNative; } catch (IOException e) { Log.i("load file encode end..."+e.toString()); e.printStackTrace(); } finally { try { if (is != null) { is.close(); is = null; } if (outStream != null) { outStream.close(); outStream = null; } } catch (IOException e) { e.printStackTrace(); } } return null; } public class GaoCryptUtil { /** * 獲取解密后的數據 * @param eCode 傳入加密過的數據 * @return */ public static String getEString(String eCode){ StringBuilder builder = new StringBuilder(); long lenth = eCode.length(); for (int i = 0; i < lenth; i++){ builder.append((char)(eCode.charAt(i)- i%5)); } return builder.toString(); } } 最后我們對getEString再通過如下獲取各個鍵-值 String[] split = getEString().split('\n' + ""); for (String sp : split) { String[] str = sp.split("="); String value = str[1].trim(); if(sp.contains("YB_APP_ID")){ android.util.Log.d("aa","YB_APP_ID:"+value); }else if(sp.contains("NB_SEX_PARTNERID")){ android.util.Log.d("aa","NB_SEX_PARTNERID:"+value); }else if(sp.contains("WY_NOTI_KEY")){ android.util.Log.d("aa","NB_SEX_PARTNERID:"+value); } }
總結:這樣在經過加密和解密一圈后,我們又回到起點最終拿到真實的數據,做后續操作。以上只是我對加密和解密的一種實現,粗糙的地方不要見怪哈。
加密demo看這里