java密码学-对称加密算法

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: java密码学-对称加密算法

对称加密算法的核心:加密和解密操作使用同一套密钥。


一、分类



根据加密方式又分为密码和分组密码,其分组密码工作模式又可分为ECB、CBC、CFB、OFB和CTR等,密钥长度决定了加密算法的安全性。


常用的对称加密算法有: DES系列、AES、RC系列、Blowfish、Twofish、Serpent、IDEA和PBE等对称加密算法


DES算法最具代表性,堪称典范;DESede是DES算法的变种;AES算法则作为DES算法的替代者;而IDEA算法作为一种强加密算法,称为电子邮件加密软件RGP的核心算法之一。


DES和DESede算法在使用密钥和其他稍有不同DES和DESede算法在使用密钥材料还原密钥时使用(DES对应DESKeySpec,DESede算法对应DESedeKeySpec类)。AES和其他算法都使用SecretKeySpec类完成相应的转换操作。


二、DES--数据加密标准



DES算法实对称加密算法领域中典型算法,为后续对称加密算法的发展奠定了坚实的基础(56位)。DESede算法基于DES算法进行三重迭代,增加了算法的安全性。


DES算法由java6(56位)和BouncyCastle实现(64位),在此基础上配合不同的填充方式(如PKCS55Padding,PKCS7Padding),可显著提高加密系统的安全性。


//DES工具类
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.Key;
import java.security.Security;
public class DESUtils {
    /**
     * 密钥算法
     */
    public static final String KEY_ALGORITHM = "DES";
    /**
     * 加密/加密算法/工作模式/填充模式
     */
    public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5PADDING";
    /**
     * 将二进制密钥转换为秘密密钥对象
     * @param key
     * @return
     * @throws Exception
     */
    private static Key toKey(byte[] key) throws Exception {
        //实例化DES密钥材料
        DESKeySpec desKeySpec = new DESKeySpec(key);
        //实例化密钥工厂
        SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
        //生成私密密钥
        return secretKeyFactory.generateSecret(desKeySpec);
    }
    /**
     * 解密
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decrypt(byte[] data,byte[] key) throws Exception {
        Key k = toKey(key);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE,k);
        return cipher.doFinal(data);
    }
    /**
     * 加密
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] encrypt(byte[] data,byte[] key) throws Exception {
        //还原密钥
        Key k = toKey(key);
       //实例化
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        //初始化,设置加密模式
        cipher.init(Cipher.ENCRYPT_MODE,k);
        return cipher.doFinal(data);
    }
    /**
     * 生成密钥
     * @return
     * @throws Exception
     */
    public static byte[] initKey() throws Exception {
        Security.addProvider(new BouncyCastleProvider());
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
        keyGenerator.init(64);
        SecretKey secretKey = keyGenerator.generateKey();
        return secretKey.getEncoded();
    }
}
//DES测试类
@Test
public void test() {
    try {
        byte[] data = "会怎么样呢?".getBytes("utf-8");
        //生成密钥
        byte[] key = DESUtils.initKey();
        //加密
        byte[] bytes = DESUtils.encrypt(data,key);
        System.out.println("加密:"+new BigInteger(bytes));
        //解密
        byte[] bytes1 = DESUtils.decrypt(bytes,key);
        System.out.println("解密:"+new String(bytes1,"utf-8"));
    } catch (Exception e) {
        e.printStackTrace();
    }    
}
//打印结果
加密:-1100473784962504731447064259470495646532757876964500977603
解密:会怎么样呢?


例子:三重DES--DESede(112位/168位)


DES算法的三个安全隐患:密钥太短、迭代偏少和半公开性。


做为DES算法的一种改良,DESede算法针对其密钥长度偏短和迭代次数偏少等问题做了相应改进,提高了安全强度。但是该算法处理速度慢,密钥计算时间较长,加密效率不高等问题。


//生成密钥
Security.addProvider(new BouncyCastleProvider());
KeyGenerator kg = KeyGenerator.getInstance("DESede");
kg.init(192);
SecretKey sk = kg.generateKey();
byte[] bytes = sk.getEncode();
//还原密钥
DESedeSpec dks = new DESedeSpec(bytes);
SecretKeyFactory skf = SecretKeyFactory.getInstance(kg.getAlgorithm());
Key key = skf.generateSecret(dks);
//生成加密对象
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.Cipher.ENCRYPT_MODE,key);
//加密
byte[] data = "DESede".getBytes("utf-8");
byte[] result = cipher.doFinal(data);
//解密
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.Cipher.DECRYPT_MODE,key);
System.out.println(new String(cipher.doFinal(result),"utf-8")); //输出结果DESede


三、AES--高级数据加密标准



AES算法因密钥建立时间短、灵敏性好,内存需求低等优点,在各个领域得到广泛的研究与应用。常用于通用移动通信系统。


//生成密钥
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256);
SecretKey sk = kg.generateKey();
byte[] bytes = sk.getEncode();
//还原密钥
SecretKey sk = new SecretKeySpec(bytes,"AES");
//生成加密对象
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.Cipher.ENCRYPT_MODE,key);
//加密
byte[] data = "AES".getBytes("utf-8");
byte[] result = cipher.doFinal(data);
//解密
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.Cipher.DECRYPT_MODE,key);
System.out.println(new String(cipher.doFinal(result),"utf-8")); //输出结果AES


IDEA实现方式可以参考AES,(分组加密算法,长度为128,数据块大小为64位)的填充方式为(ISO10126Padding)


PBE算法是一种基于口令的加密算法,其特点在于口令由用户自己掌握,采用随机数杂凑多重加密等方法保证数据的安全性。其实现代码如下


//生成密钥
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128);
SecretKey sk = kg.generateKey();
//实例化安全随机数
SecureRandom random = new SecureRandom();
//产出盐
byte[] b = random.generateSeed(8);
//密钥材料转换
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
//实例化PBE参数材料
PBEParametserSpec paramSpec = new PBEParametserSpec(salt,2);
//实例化加密对象
Cipher cipher = Cipher.getInstance("PBE");
cipher.init(Cipher.Cipher.ENCRYPT_MODE,sk,paramSpec);
//加密
byte[] bytes = cipher.doFinal("PBE".getBytes());
//解密
Cipher cipher = Cipher.getInstance("PBE");
cipher.init(Cipher.Cipher.DECRYPT_MODE,sk,paramSpec);
System.out.println(new String(cipher.doFinal(bytes),"utf-8")); //输出PBE
目录
相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
30天前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
44 2
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
105 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
132 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
1月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
100 0
|
1月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
21 0
|
2月前
|
安全 Java 数据安全/隐私保护
- 代码加密混淆工具-Java 编程安全性
在Java编程领域,保护代码安全与知识产权至关重要。本文探讨了代码加密混淆工具的重要性,并介绍了五款流行工具:ProGuard、DexGuard、Jscrambler、DashO 和 Ipa Guard。这些工具通过压缩、优化、混淆和加密等手段,提升代码安全性,保护知识产权。ProGuard 是开源工具,用于压缩和混淆Java代码;DexGuard 专为Android应用程序设计,提供强大加密功能;Jscrambler 基于云,保护Web和移动应用的JavaScript及HTML5代码;DashO 支持多种Java平台和
208 1
|
3月前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
63 2
|
3月前
|
安全 Java 应用服务中间件
网络安全的护城河:漏洞防御与加密技术深入浅出Java并发编程
【8月更文挑战第31天】在数字世界的棋盘上,每一次点击都可能是一步棋。网络安全的战场无声却激烈,漏洞如同裂缝中的风,悄无声息地侵袭着数据的堡垒。本文将揭示网络漏洞的隐蔽角落,探讨如何通过加密技术筑起防线,同时提升个人和组织的安全意识,共同守护我们的数字家园。
|
3月前
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。