数据加密算法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