1、对称密码算法简介
对称密码算法是当今应用范围最广,使用频率最高的加密算法。它不仅应用于软件行业,在硬件行业同样流行。各种基础设施凡是涉及到安全需求,都会优先考虑对称加密算法。
对称密码算法的加密密钥和解密密钥相同,对于大多数对称密码算法,加解密过程互逆。
(1)加解密通信模型
(2)特点:算法公开、计算量小、加密速度快、加密效率高
(3)弱点:双方都使用同样密钥,安全性得不到保证
对称密码有流密码和分组密码两种,但是现在普遍使用的是分组密码:
2、常用对称密码:
(1)DES(Data Encryption Standard,数据加密标准)
(2)3DES(Triple DES、DESede,进行了三重DES加密的算法)
(3)AES(Advanced Encryption Standard,高级数据加密标准,AES算法可以有效抵制针对DES的攻击算法)
三种算法的简单对比:
算法 | 密钥长度 | 默认密钥长度 | 工作模式 | 填充方式 |
DES | 56 | 56 | ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128 | NoPadding、PKCS5Padding、ISO10126Padding |
3DES | 112、168 | 168 | ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128 | NoPadding、PKCS5Padding、ISO10126Padding |
AES | 128、192、256 | 128 | ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128 | NoPadding、PKCS5Padding、ISO10126Padding |
3、实例:
package com.its.common.crypto.symmetry; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * 对称加密(AES/DES/3DES) 推荐使用AES */ public class SymmetryUtil { public static String ALGORITHM_AES = "AES"; public static String ALGORITHM_DES = "DES"; public static String ALGORITHM_3DES = "DESede"; public static String KEY = "QWE!@#123qwe123@*()342%"; /** * 创建密钥key对象 * * @param algorithm * @param keysize * @param key * @return * @throws NoSuchAlgorithmException */ public static SecretKey createKey(String algorithm, int keysize, String key) { KeyGenerator keyGenerator = null; SecretKey secretKey = null; try { keyGenerator = KeyGenerator.getInstance(algorithm); keyGenerator.init(keysize, new SecureRandom(key.getBytes())); secretKey = keyGenerator.generateKey(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return secretKey; } public static byte[] encrypt(String algorithm, int keysize, String key, byte[] data) { try { SecretKey secretKey = createKey(algorithm, keysize, key); Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptByte = cipher.doFinal(data); return encryptByte; } catch (Exception e) { System.out.println("exception:" + e.toString()); } return null; } public static byte[] decrypt(String algorithm, int keysize, String key, byte[] data) { try { SecretKey secretKey = createKey(algorithm, keysize, key); Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptByte = cipher.doFinal(data); return decryptByte; } catch (Exception e) { e.printStackTrace(); } return null; } public static String encrypt(String algorithm, int keysize, String key, String data) { byte[] encryptByte = encrypt(algorithm, keysize, key, data.getBytes()); String encryptStr = encryptBASE64(encryptByte); return encryptStr; } public static String decrypt(String algorithm, int keysize, String key, String data) { byte[] decryptByte = decrypt(algorithm, keysize, key, decryptBASE64(data)); String decryptStr = new String(decryptByte); return decryptStr; } /** 字节转字符 */ public static String byteToHexString(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) { sb.append(0); } sb.append(sTemp.toUpperCase()); } return sb.toString(); } /** 字节转字符 */ public static String encryptBASE64(byte[] data) { return new BASE64Encoder().encodeBuffer(data); } /** 字符转字节 */ public static byte[] decryptBASE64(String data) { try { return new BASE64Decoder().decodeBuffer(data); } catch (Exception e) { e.printStackTrace(); } return null; } }
package com.its.test.crypto.symmetry; import org.junit.Test; import com.its.common.crypto.symmetry.SymmetryUtil; public class SymmetryUtilTest { /** 将字符加密后为字节--再将字节解密为字符 */ @Test public void testByte() { testAES(); testDES(); test3DES(); } public void testAES() { String data = "Tzz123456~!@#$%^&*()_+-={}|[]:'<>?,./asdkdk"; System.out.println("AES"); System.out.println("加密前:" + data); byte[] encrypted = SymmetryUtil.encrypt(SymmetryUtil.ALGORITHM_AES, 128, SymmetryUtil.KEY, data.getBytes()); System.out.println("加密后:" + SymmetryUtil.byteToHexString(encrypted)); byte[] decrypted = SymmetryUtil.decrypt(SymmetryUtil.ALGORITHM_AES, 128, SymmetryUtil.KEY, encrypted); System.out.println("解密后:" + new String(decrypted) + "\n"); } public void testDES() { String data = "PLaa456963~!@#$%^&*()_+-={}|[]:'<>?,./asdkdk"; System.out.println("DES"); System.out.println("加密前:" + data); byte[] encrypted = SymmetryUtil.encrypt(SymmetryUtil.ALGORITHM_DES, 56, SymmetryUtil.KEY, data.getBytes()); System.out.println("加密后:" + SymmetryUtil.byteToHexString(encrypted)); byte[] decrypted = SymmetryUtil.decrypt(SymmetryUtil.ALGORITHM_DES, 56, SymmetryUtil.KEY, encrypted); System.out.println("解密后:" + new String(decrypted) + "\n"); } public void test3DES() { String data = "Tzz123456~!@#$%^&*()_+-={}|[]:'<>?,./asdkdk"; System.out.println("3DES"); System.out.println("加密前:" + data); byte[] encrypted = SymmetryUtil.encrypt(SymmetryUtil.ALGORITHM_3DES, 168, SymmetryUtil.KEY, data.getBytes()); System.out.println("加密后:" + SymmetryUtil.byteToHexString(encrypted)); byte[] decrypted = SymmetryUtil.decrypt(SymmetryUtil.ALGORITHM_3DES, 168, SymmetryUtil.KEY, encrypted); System.out.println("解密后:" + new String(decrypted)); } /** 将字符加密后为字符--再将字符解密为字符 */ @Test public void testStr() { testAESToStr(); } public void testAESToStr() { String data = "Tzz123456~!@#$%^&*()_+-={}|[]:'<>?,./asdkdk"; System.out.println("AES"); System.out.println("加密前:" + data); String encrypted = SymmetryUtil.encrypt(SymmetryUtil.ALGORITHM_AES, 128, SymmetryUtil.KEY, data); System.out.println("加密后:" + encrypted); String decrypted = SymmetryUtil.decrypt(SymmetryUtil.ALGORITHM_AES, 128, SymmetryUtil.KEY, encrypted); System.out.println("解密后:" + decrypted + "\n"); } }
相关推荐
AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法。ECB(Electronic Codebook)模式是最简单的加密模式,将明文数据块逐个进行加密,不考虑上下文关系。PKCS7Padding是一种填充...
第三,我只放了最常用的三种对称加密 AES/DES/3DES,至于 RC4 之流就不做示范了,那种还不如自己写纯源码;。第四,RSA 没有放进去,说实话 CSP 的 RSA 弱得要命,又慢,限制又多,将来会放进去(其实主要是我自己也...
在Java中,可以使用`javax.crypto.Cipher`类的`Cipher.getInstance("AES/CBC/PKCS5Padding")`来实现AES加密,其中CBC模式是常见的操作模式,PKCS5Padding用于填充不足的块。 2. **DES(数据加密标准)** DES是早期...
DES、AES对称加密算法,之前从网上找的,但是在MAC上运行发现每次加密出来的结果都不一样,后来查了一些博客,最后确认是SecureRandom的随机算法问题,需要设置setSeed.
其次,**DES** 是一种较旧的对称加密标准,使用64位的密钥。由于其相对较短的密钥长度,现在被认为不够安全,常被3DES所替代。3DES是DES的变种,通过使用三次DES加密来提高安全性。在Java中,`Cipher`类同样支持DES...
AES是一种广泛使用的对称加密算法,而ECB是其一种加密模式,PKCS5则是一种填充方式,确保数据长度符合AES的块大小要求。 首先,让我们详细了解这三个概念: 1. **AES(Advanced Encryption Standard)**:是一种...
"Java实现的对称加密算法AES定义与用法详解" 对称加密算法AES是当前使用最多的加密算法之一,其主要特点是高级的、安全的、快速的和灵活的。下面我们将详细介绍Java实现的对称加密算法AES的定义、特点、用法及使用...
本文将详细介绍如何使用Java语言实现DES对称加密,并讨论其在实际应用中的作用和注意事项。 DES是一种块密码,它将64位的数据块作为输入,通过一系列复杂的数学运算(包括置换和代替操作)将其转换为密文。虽然原始...
常用对称加密(AES/DES/3DES)及非对称加密(RSA)工具类
对称加密算法包括了多种算法,本文主要介绍DES、3DES和AES这三种常见的对称加密算法,并对它们进行Java实现的总结。 首先,对称加密算法的一个关键优势在于其算法公开、计算量小、加密速度快、加密效率高,但它们也...
AES(Advanced Encryption Standard)和DES(Data Encryption Standard)是两种广泛使用的对称加密算法,它们为电子数据提供了强大的加密保护。 **DES加密** DES是一种古老的块加密算法,由IBM在1970年代开发,并...
Java中的DES(Data Encryption Standard)是一种对称加密算法,它基于一个固定的64位密钥进行数据加密和解密。由于原始DES的安全性在现代计算环境中已经相对较弱,因此3DES(Triple DES)应运而生,它是通过三次应用...
java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...
AES(高级加密标准)是目前广泛使用的对称加密算法,其安全性高,速度快。它使用128位的密钥,可提供128、192或256位的加密强度。在Android中,可以使用Java的javax.crypto包来实现AES加密。首先,需要生成一个随机...
本教程主要探讨了如何使用Java编程语言实现DES(Data Encryption Standard)、3DES(Triple DES)和AES(Advanced Encryption Standard)这三种常见的对称加密算法,并且详细讲解了五种分组密码的工作模式。...
Java中的DES(Data Encryption Standard)是一种广泛使用的对称加密算法,它基于一个固定的密钥进行数据的加密和解密。这个实例将详细讲解如何在Java中实现DES私钥对称加密。私钥对称加密意味着加密和解密使用的是同...
1. 对称加密算法:对称加密算法用来对敏感数据等信息进行加密,常用的算法包括 DES、3DES、AES 等。 2. 非对称加密算法:非对称加密算法采用加密钥匙(公钥)和解密钥匙(私钥),常用的算法包括 RSA、DSA、ECC 等。...
3DES(Triple Data Encryption Algorithm)是一种广泛应用的对称加密算法,基于DES(Data Encryption Standard)并对其进行了加强。本篇文章将详细探讨Java环境下如何实现3DES加密算法,并介绍相关知识点。 首先,...
Java 加密解密之对称加密算法 DES Java 加密解密之对称加密算法 DES 是一种常用的对称加密算法,广泛应用于保护金融数据的安全中。它的全称是 Data Encryption Algorithm(DEA),最早由 IBM 开发,并曾拥有专利权...