加密算法根据内容是否可以还原分为 可逆加密和非可逆加密 。
可逆加密根据其加密解密是否使用的同一个密钥而可以分为 对称加密和非对称加密
对称加密即是指在加密和解密时使用的是同一个密钥。
非对称加密在加密和解密过程中使用不同的密钥,即公钥和私钥。公钥用于加密,所有人都可见,私钥用于解密,只有解密者持有。
MD5
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致,是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法)。MD5算法将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有
很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造
数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
MD5算法的应用场景:
当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。
注意:
MD5加密算法是不可逆的,因此不可能在客户端与服务器交互时,使用MD5对传输的Json串进行加密,因为用md5加密过后,服务器端或者客户端将无法解析出正确的数据并执行相应的逻辑。
DES
DES加密算法是一种对称加密算法,DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。
在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密,如果Mode为加密,则用Key去把数据Data进行加密,生成Data的密码形式作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式作为DES的输出结果。
在使用DES时,双方预先约定使用的“密码”,即Key,然后用Key去加密数据;接收方得到密文后使用同样的Key解密得到原数据,这样便实现了安全性较高的数据传输。
AES
AES也是一种对称加密算法,随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES。AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。
RSA
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
非对称加密(公钥加密):指加密和解密使用不同密钥的加密算法,也称为公私钥加密。
进行RSA加密的步骤:
1. 甲方构建密钥对(公钥和私钥,公钥给对方,私钥留给自己)
2. 甲方使用私钥加密数据,然后用私钥对加密后的数据签名,并把这些发送给乙方; 乙方使用公钥、签名来验证待解密数据是否有效,如果有效使用公钥对数据解密。3. 乙方使用公钥加密数据,向甲方发送经过加密后的数据;甲方获得加密数据,通过 私钥解密。
Android代码中添加加密解密的实际代码
在Android客户端中,我们通常将加密解密的代码封装到网络交互层面上去。实际案例代码:
/**
* Volley发送网络请求的Request代码片段
*/
public class RequestToJsonString extends Request<JSONObject> {
private static String TAG = "RequestToJsonString";
private String params;
private Listener<JSONObject> listener;
public RequestToJsonString(int Method, String url, String jsonParam, Listener<JSONObject> listener, ErrorListener errorListener) {
super(Method, url, errorListener);
Log.d(TAG, "url: " + url);
Log.d(TAG, "param: " + jsonParam);
try {
this.params = setDES(jsonParam);
} catch (Exception e) {
Log.d(TAG, "加密失败");
}
this.listener = listener;
}
.........
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data, "utf-8");
Log.d(TAG, "加密数据" + jsonString);
DESPlus des = new DESPlus("phone");// 自定义密钥
String strResult = new String(des.decrypt(jsonString));
strResult = URLDecoder.decode(strResult);
Log.d(TAG, "JSONString " + strResult);
return Response.success(new JSONObject(strResult), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
} catch (Exception e) {
return Response.error(new ParseError(e));
}
}
.........
/**
* 加密,base64编码
* @param source
* @return
* @throws Exception
*/
private String setDES(String source) throws Exception {
DESPlus des = new DESPlus("phone");
source = new String(des.encrypt(source));
return "data=" + source;
}
.........
}
网友评论