数据加密算法DES
数据加密算法(Data Encryption Algorithm,DEA)的数据加密标准(Data Encryption Standard,DES)是规范的描述,它出自 IBM 的研究工作,并在 1997 年被美国政府正式采纳。它很可能是使用最广泛的秘钥系统,特别是在保护金融数据的安全中,最初开发的 DES 是嵌入硬 件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用 DES。
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环。
攻击 DES 的主要形式被称为蛮力的或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过 ,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 — 高级加密标准(Advanced Encryption Standard,AES)。
DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。
IBM 曾对 DES 拥有几年的专利权,但是在 1983 年已到期,并且处于公有范围中,允许在特定条件下可以免除专利使用费而使用。
由于DES是加(解)密64位明(密)文,即为8个字节(8*8=64),可以据此初步判断这是分组加密,加密的过程中会有16次循环与密钥置换过程,据此可以判断有可能是用到DES密码算法,更精确的判断还得必须懂得一点DES的加密过程。

一、3DES 

 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称,是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:   

3DES加密过程为:C=Ek3(Dk2(Ek1(P)))   3DES解密过程为:P=Dk1(EK2(Dk3(C))) 

 1  /**
 2      * 3des加密
 3      *
 4      * @param secretKey 密钥
 5      * @param msg       明文
 6      * @param algorithm 加密方式
 7      * @return 密文
 8      * @throws UtilException UtilException
 9      * @see [类、类#方法、类#成员]
10      */
11     public static byte[] encrypt(
12             SecretKey secretKey, byte[] msg, String algorithm)
13             throws UtilException {
14         try {
15             Cipher cipher = Cipher.getInstance(algorithm + ALGORITHM_3DESCBC);
16             cipher.init(Cipher.ENCRYPT_MODE, secretKey,
17                     new IvParameterSpec(BYTE_ARRAY), new SecureRandom());
18             return cipher.doFinal(msg);
19         } catch (NoSuchAlgorithmException e) {
20             throw new UtilException(e);
21         } catch (InvalidKeyException e) {
22             throw new UtilException(e);
23         } catch (NoSuchPaddingException e) {
24             throw new UtilException(e);
25         } catch (BadPaddingException e) {
26             throw new UtilException(e);
27         } catch (IllegalBlockSizeException e) {
28             throw new UtilException(e);
29         } catch (InvalidAlgorithmParameterException e) {
30             throw new UtilException(e);
31         }
32     }
33 
34     /**
35      * 解码
36      *
37      * @param secretKey 密钥
38      * @param msg       密文
39      * @param algorithm 加密方式
40      * @return 明文
41      * @throws UtilException UtilException
42      * @see [类、类#方法、类#成员]
43      */
44     public static byte[] decrypt(
45             SecretKey secretKey, byte[] msg, String algorithm)
46             throws UtilException {
47         try {
48             Cipher cipher = Cipher.getInstance(algorithm + ALGORITHM_3DESCBC);
49             cipher.init(Cipher.DECRYPT_MODE, secretKey,
50                     new IvParameterSpec(BYTE_ARRAY), new SecureRandom());
51             return cipher.doFinal(msg);
52         } catch (NoSuchPaddingException e) {
53             throw new UtilException(e);
54         } catch (InvalidKeyException e) {
55             throw new UtilException(e);
56         } catch (IllegalBlockSizeException e) {
57             throw new UtilException(e);
58         } catch (BadPaddingException e) {
59             throw new UtilException(e);
60         } catch (NoSuchAlgorithmException e) {
61             throw new UtilException(e);
62         } catch (InvalidAlgorithmParameterException e) {
63             throw new UtilException(e);
64         }
65 
66     }


二、AES

  AES(Advanced Encryption Standard),高级加密标准,   又称Rijndael加密法,AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。   该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 "Rhinedoll"。

  

 1 /**
 2      * AES 加解密
 3      * @param mode
 4      * @param password
 5      * @param textBytes
 6      * @return
 7      * @throws Exception
 8      */
 9     public static byte[] aes(int mode, String password, byte[] textBytes) throws Exception{
10         KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
11         //for windows and linux, the secure random need select a algorithm
12         SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
13         secureRandom.setSeed(password.getBytes("utf-8"));
14         keyGenerator.init(128, secureRandom);
15         SecretKey secretKey = keyGenerator.generateKey();
16         byte[] encoded = secretKey.getEncoded();
17         SecretKeySpec secretKeySpec = new SecretKeySpec(encoded, "AES");
18         Cipher cipher = Cipher.getInstance("AES");// 创建密码器
19         cipher.init(mode, secretKeySpec);// 初始化
20         return cipher.doFinal(textBytes);
21     }
22 
23     /**
24      * AES 加密
25      * @param password
26      * @param plainText
27      * @return
28      * @throws Exception
29      */
30     public static  String encrypt(String password, String plainText) throws Exception {
31         byte[] bytes =  aes(Cipher.ENCRYPT_MODE, password, plainText.getBytes("utf-8"));
32         return URLEncoder.encode(new String(Base64.encodeBase64(bytes), "utf-8"), "utf-8");
33     }
34 
35     /**
36      * AES 解密
37      * @param password
38      * @param cipherText
39      * @return
40      * @throws Exception
41      */
42     public static String decrypt(String password, String cipherText)throws Exception{
43         byte[] cipherBytes = Base64.decodeBase64(URLDecoder.decode(cipherText,"utf-8").getBytes("utf-8"));
44         byte[] bytes = aes(Cipher.DECRYPT_MODE, password, cipherBytes);
45         return new String(bytes, "utf-8");
46     }

 三、MD5、SHA  

  MD5(Message Digest algorithm 5,信息摘要算法),SHA(Secure Hash Algorithm,安全散列算法).

 

 1 /**
 2      * 对文本摘要,先base64 再md5摘要  
 3      * @param text  明文
 4      * @param salt  加盐
 5      * @return
 6      * @throws UnsupportedEncodingException
 7      * @throws NoSuchAlgorithmException
 8      */
 9     public static byte[] digestText(String text, String salt) throws UnsupportedEncodingException,
10             NoSuchAlgorithmException {
11         byte[] bytes = Base64.encodeBase64(text.getBytes("UTF-8"));
12         MessageDigest messageDigest = MessageDigest.getInstance("MD5");
13         //加入干扰(加盐技术的基本原理是,在用户输入的口令前面加上一串随机数(称为盐),然后将随机数和口令组合在一起计算消息摘要。最后将随机数(盐)和消息摘要一起保存。)
14       messageDigest.update(salt.getBytes("UTF-8"));
15         messageDigest.update(bytes);
16         return  messageDigest.digest()). 
17     }


 

 四、对称加密算法

   对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。 其优点在于加解密的高速度和使用长密钥时的难破解性。不足之处是,交易双方都使用同样钥匙,安全性得不到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量成几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。在计算机专网系统中广泛使用的对称加密算法有DES和IDEA等。美国国家标准局倡导的AES即将作为新标准取代DES。

五、非对称加密算法

  与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫做非对称加密算法。  

详见参考:http://snowolf.iteye.com/blog/379860

    
posted on 2012-11-14 10:55  NeverGiveUp_ZONE  阅读(385)  评论(0编辑  收藏  举报