加密解密,曾经是我一个毕业设计的重要组件。在工作了多年以后回想当时那个加密、解密算法,实在是太单纯了。
言归正传,这里我们主要描述Java已经实现的一些加密解密算法,如基本的BASE64、MD5(Message-Digest algorithm 5,信息-摘要算法)、SHA(Secure Hash Algorithm,安全散列算法),以及复杂的DES(Data Encryption Standard,数据加密算法)对称加密,RSA、ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)非对称加密算法。
本片内容简要介绍BASE64、MD5、SHA三种加密方法。
这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。
BASE64
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
通过java代码实现如下:
Java代码
/**
* BASE64解密
*
* @param key
* @return
* @throws Exception
*/
protected static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
/**
* BASE64加密
*
* @param key
* @return
* @throws Exception
*/
protected static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字符数是8的倍数,如果不够位数以=符号填充。
MD5
MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。
通过java代码实现如下:
/**
* MD5加密
*
* @param obj
* @return
*/
protected static byte[] encryptMD5(byte[] obj) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(obj);
return md5.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。
SHA
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。
通过java代码实现如下:
/**
* SHA加密
*
* @param obj
* @return
*/
protected static byte[] encryptSHA(byte[] obj) {
try {
MessageDigest sha = MessageDigest.getInstance("SHA");
sha.update(obj);
return sha.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
类似于MD5,我们不直接使用上述SHA加密。通常将SHA产生的字节数组交给BASE64再加密一把,得到相应的字符串。
给出一个完整类,如下:
Java代码
1. import
2. import
3.
4. import
5. import
6.
7. /**
8. *
9. * @author 梁栋
10. * @version 1.0
11. * @since 1.0
12. */
13. public abstract class
14. public static final String KEY_SHA = "SHA";
15. public static final String KEY_MD5 = "MD5";
16.
17. /**
18. * BASE64解密
19. *
20. * @param key
21. * @return
22. * @throws Exception
23. */
24. protected static byte[] decryptBASE64(String key) throws
25. return (new
26. }
27.
28. /**
29. * BASE64加密
30. *
31. * @param key
32. * @return
33. * @throws Exception
34. */
35. protected static String encryptBASE64(byte[] key) throws
36. return (new
37. }
38.
39. /**
40. * MD5加密
41. *
42. * @param obj
43. * @return
44. */
45. protected static byte[] encryptMD5(byte[] obj) {
46.
47. try
48. MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
49. md5.update(obj);
50.
51. return
52. catch
53. e.printStackTrace();
54. }
55.
56. return null;
57. }
58.
59. /**
60. * SHA加密
61. *
62. * @param obj
63. * @return
64. */
65. protected static byte[] encryptSHA(byte[] obj) {
66.
67. try
68. MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
69. sha.update(obj);
70.
71. return
72. catch
73. e.printStackTrace();
74. }
75.
76. return null;
77. }
78. }