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"); } }
相关推荐
DES、AES对称加密算法,之前从网上找的,但是在MAC上运行发现每次加密出来的结果都不一样,后来查了一些博客,最后确认是SecureRandom的随机算法问题,需要设置setSeed.
常用对称加密(AES/DES/3DES)及非对称加密(RSA)工具类
java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...
分享一个php对称加密算法DES和AES类,支持密钥:64/128/256 bit(字节长度8/16/32),支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit),支持模式:CBC/ECB/OFB/CFB,密文编码:base64字符...
主要介绍了Java 对称加密使用DES / 3DES / AES 这三种算法分别实现的相关资料,这里提供了实例代码,需要的朋友可以参考下
分享一个PHP对称加密算法DES,AES类,支持密钥:64/128/256 bit(字节长度8/16/32),支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit)。
AES高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种...本软件是用java语言开发,实现了AES算法对文件的加密和解密,并在界面上加了进度条,来提示用户加密解密的进度。如果不足之处,欢迎留言。
python实现对称加密中3DES与AES算法工程文件 详解博客地址:https://blog.csdn.net/m0_52316372/article/details/125691581
常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结,常用加密算法的java实现总结
本篇文章主要介绍了PHP对称加密算法(DES/AES)类的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在 AES 出现之前,最常用的对称密钥算法是 DES 加密算法,它在 1977 年被公布成为美国政府的商用加密标准。DES 的主要问题是密钥长度较短,渐渐不适合于分布式开放网络对数据加密安全性的要求。因此,1998年美国...
一、常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方式。Base64不生成密钥,通过Base64编码后的... AES是现在对称加密算法中最流行的算法之一。 代码下载后,导入即可运行
AES 三重AES 非对称密钥加密解密等
对称加密:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES 非对称加密:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
、实验原理 信息加密根据采用的密钥类型可以划分为对称密码算法和非对称密码算法。...在对称密码算法的发展历史中曾出现过多种优秀的算法,包括DES、3DES、AES等。下面我们以DES算法为例介绍对称密码算法的实现机制。
本篇文章主要介绍了Java利用实现对称加密(DES、3DES、AES),具有一定的参考价值,有兴趣的可以了解一下。
uni-app aes的加密和解密