Android比DES加密更安全的算法——3DES加密算法
转载
在前面的文章里面,我们讨论了DES算法,同时也明白了如何才能保证不同平台下的加密和解密结果的一致性。但是DES作为出现了很长时间的一种加密算法,随着计算机运算能力的加强,DES加密容易被暴力破解,其安全性变得有点低。于是,为了增强数据的安全性,3DES算法就应运而生了。
3DES,顾名思义,就是对DES加密算法的改进,3DES通过对每个数据进行3次DES加密,从而降低被破解的可能性。
如果我们要使用3DES加密,需要以下几个步骤
①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象
SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);
②根据算法实例化Cipher对象。它负责加密/解密
Cipher c1 = Cipher.getInstance(Algorithm);
③传入加密/解密模式以及SecretKey密钥对象,实例化Cipher对象
c1.init(Cipher.ENCRYPT_MODE, deskey);
④传入字节数组,调用Cipher.doFinal()方法,实现加密/解密,并返回一个byte字节数组
c1.doFinal(src);
具体的代码实现过程如下
[java]
view plain
copy
1. package com.qust;
2.
3. import java.io.UnsupportedEncodingException;
4.
5. import javax.crypto.Cipher;
6. import javax.crypto.SecretKey;
7. import javax.crypto.spec.SecretKeySpec;
8.
9. /**
10. *
11. * @ClassName: com.qust.SecretUtils
12. * @Description: 3DES加密解密工具类
13. * @author zhaokaiqiang
14. * @date 2014-11-13 下午11:28:14
15. *
16. */
17. public class DES3Utils {
18.
19. // 定义加密算法,DESede即3DES
20. private static final String Algorithm = "DESede";
21. // 加密密钥
22. private static final String PASSWORD_CRYPT_KEY = "zhaokaiqiang1992";
23.
24. /**
25. * 加密方法
26. *
27. * @param src
28. * 源数据的字节数组
29. * @return
30. */
31. public static byte[] encryptMode(byte[] src) {
32. try {
33. // 生成密钥
34. new SecretKeySpec(
35. build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);
36. // 实例化Cipher
37. Cipher cipher = Cipher.getInstance(Algorithm);
38. cipher.init(Cipher.ENCRYPT_MODE, deskey);
39. return cipher.doFinal(src);
40. catch (java.security.NoSuchAlgorithmException e1) {
41. e1.printStackTrace();
42. catch (javax.crypto.NoSuchPaddingException e2) {
43. e2.printStackTrace();
44. catch (java.lang.Exception e3) {
45. e3.printStackTrace();
46. }
47. return null;
48. }
49.
50. /**
51. * 解密函数
52. *
53. * @param src
54. * 密文的字节数组
55. * @return
56. */
57. public static byte[] decryptMode(byte[] src) {
58. try {
59. new SecretKeySpec(
60. build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);
61. Cipher c1 = Cipher.getInstance(Algorithm);
62. c1.init(Cipher.DECRYPT_MODE, deskey);
63. return c1.doFinal(src);
64. catch (java.security.NoSuchAlgorithmException e1) {
65. e1.printStackTrace();
66. catch (javax.crypto.NoSuchPaddingException e2) {
67. e2.printStackTrace();
68. catch (java.lang.Exception e3) {
69. e3.printStackTrace();
70. }
71. return null;
72. }
73.
74. /**
75. * 根据字符串生成密钥24位的字节数组
76. *
77. * @param keyStr
78. * @return
79. * @throws UnsupportedEncodingException
80. */
81. public static byte[] build3DesKey(String keyStr)
82. throws UnsupportedEncodingException {
83. byte[] key = new byte[24];
84. byte[] temp = keyStr.getBytes("UTF-8");
85.
86. if (key.length > temp.length) {
87. 0, key, 0, temp.length);
88. else {
89. 0, key, 0, key.length);
90. }
91. return key;
92. }
93. }
测试类的代码如下
[java]
view plain
copy
1. package com.qust;
2.
3. public class Main {
4.
5. public static void main(String[] args) {
6. "使用3DES对数据进行加密";
7. "【加密前】:" + msg);
8.
9. // 加密
10. byte[] secretArr = DES3Utils.encryptMode(msg.getBytes());
11. "【加密后】:" + new String(secretArr));
12.
13. // 解密
14. byte[] myMsgArr = DES3Utils.decryptMode(secretArr);
15. "【解密后】:" + new String(myMsgArr));
16. }
17. }