因为在Android逆向分析中需要定位到网络请求模块,并对网络请求,一般为http请求进行捕获,但是http请求提中的数据一般都经过加密处理,所以,在逆向分析中也需要通过了解一定的加解密算法才能知道其加密的方法,并从反编译代码中获取其加密算法,然后抓包并分析其敏感数据。
因为之前一直做应用层,虽说用到了http,但由于负责后台javaEE的同学也是个新手,所以并没有用到什么加解密算法进行处理,对加解密算法也就菜鸟一个。但如今需要用到,那么就必须把这些知识给捡回来。
加解密的方法很多,但流行的也就那么几种,今天就先了解一个比较简单的加解密算法,BASE64。
BASE64编码解码作为加解密的原理就不详细说了,百度百科或者其他技术博客已经说得很清楚了。
实际上编码过程很简单:
明文——转为8位ASCII码——分组成6位的BASE64码——根据BASE64规定的码表转成相应字符——密文
eg: 明文:big——对应8位一组的asiic码: (b:98)01100010,(i:105)01101001,(g:103)01100111 ——— 6位一组的base码:011000,100110,100101, 100111——对应base64字符:Y(24),m(38),l(37),n(39)——密文:Ymln。
当然,不可能所有数据长度都符合 3*8=4*6格式的,所以不够6位的补零,没有数值的(下面用xxxxxx表示)需要“=”作为补位符。
eg: 明文:bi——asiic码:(b:98)01100010,(i:105)01101001———6位一组的base码:011000,100110,1001(00),xxxxxx———对应base64字符:Y(24),m(38),k(36),=(xxxxxx)——密文:Ymk=。
eg: 明文:b——asiic码:(b:98)01100010———6位一组的base码:011000,10(0000),xxxxxx,xxxxxx———对应base64字符:Y(24),g(32),=(xxxxxx),=(xxxxxx)——密文:Yg==。
解码反之则可。
从下面3张图就可以清楚了,图出自于http://www.cnblogs.com/luguo3000/p/3940197.html,感谢~
BASE64码表:
示例1:
示例2:
以上为BASE64编码解码的原理,实际上作为数据加密,这种方法是很不安全的,只是将一些明文简单的转化成没有意思的密文而已,但解码是很简单的,所以也只能防君子,不可防小人之用。
在Android上,使用BASE64编码解码很简单,别人已经给你封装好了相应的工具类 android.util.Base64。
写了一个简单的Activity,然后点击按钮将明文转为密文,现在只有BASE64后面将添加MD5,DES,AES等算法。
MainActivity.class:
public class MainActivity extends AppCompatActivity {
public final static int BASE64=0;
private Spinner spinner;
private Button btnEncrypt;
private EditText etInput;
private TextView tvOutput;
private int mode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner=(Spinner)findViewById(R.id.spinner);
String[] items=getResources().getStringArray(R.array.algorithm);
ArrayAdapter adapter=new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, items);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
mode=position;
}
@Override
public void onNothingSelected(AdapterView> parent) {
}
});
btnEncrypt=(Button)findViewById(R.id.btn_encrypt);
btnEncrypt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg=etInput.getText().toString();
String encodeStr="";
if (msg == null || msg.trim().equals("")) {
Toast.makeText(MainActivity.this, "请输入明文", Toast.LENGTH_SHORT).show();
return;
}
if (mode == BASE64) {
BASE64 base64=new BASE64();
encodeStr=base64.encrypt(msg);
Log.d("zz", "解密后:"+base64.decrypt(encodeStr));
}
tvOutput.setText(encodeStr);
}
});
etInput=(EditText)findViewById(R.id.et_input);
tvOutput=(TextView)findViewById(R.id.tv_output);
}
}
BASE64.class:
public class BASE64 {
public String encrypt(String msg){
return Base64.encodeToString(msg.getBytes(), Base64.DEFAULT);
}
public byte[] encrypt(byte[] msg){
return Base64.encode(msg, Base64.DEFAULT);
}
public String decrypt(String msg){
return new String(Base64.decode(msg.getBytes(), Base64.DEFAULT));
}
public byte[] decrypt(byte[] msg){
return Base64.decode(msg, Base64.DEFAULT);
}
}
可是加密不会单单使用base64这种简单的方式加密,而是配合其他的加密方式去共同加密。但这个android工具包里提供的类,大家都会用,那么当然会破解的人也会不少,所以往往不会使用原生的BASE64编码,而是自己在BASE64的基础上自定义一套编码解码的方式,也就是变相的BASE64,这样一来也提高加密的安全性。