常用对称加密算法之AES算法-CBC模式

简介: 常用对称加密算法之AES算法-CBC模式

这个需求很简单就是存储数据库密码,因为链接数据库的需要用到,加密就必须要用对称加密算法,于是简单调研了一下对称加密算法,经过对比最后选择了AES算法-CBC模式


怎么理解对称加密


加密:接收秘钥key和明文,然后输出密文。

解密:通过key解密密文,得到明文


例: 加密 123 =》AES( 123 + key ) =》@#$ 解密 @#$ =》AES( key + @#$ ) =》123


对比


这里简单对我了解过的对称加密算法做个比较


算法 密钥长度 运算速度 安全性 资源消耗
DES 56/64 较快 低(完全依赖密钥,易受穷举搜索法攻击)
AES 128/192/256 高(ECB模式生成固定密钥安全性低,CBC模式每次生成的密文都不同安全性高)
IDEA 128 较慢 高(军事级,可抗差值分析和相关分析)


1、DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;

2、IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128位密钥提供非常强的安全性;

3、AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,在21世纪AES 标准的一个实现是 Rijndael算法;


密钥长度直接决定加密强度,DES算法由于密钥过短,可以在短时间内被暴力破解,所以现在已经不安全了。


算法选择


既然要使用对称加密算法,那么就必须要考虑两点,安全性和性能,那么针对上面三种算法,显而易见的AES的CBC模式是不二之选


代码demo实现


import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
public class SecretUtil {
    //这里需要设置你的32位字节密钥
    public static final String ENCRYPT_OR_DECRYPT_KEY = "1234567890abcdef1234567890abcdef";
    // 256位密钥 = 32 bytes Key:
    //CBC模式是安全性较高的AES加密模式,它需要一个随机数作为IV参数,这样对于同一份明文,每次生成的密文都不同
    public static final byte[] BYTES_KEY = ENCRYPT_OR_DECRYPT_KEY.getBytes(StandardCharsets.UTF_8);
    public static final String INSTANCE = "AES/CBC/PKCS5Padding";
    public static final String AES = "AES";
    public static void main(String[] args) throws Exception {
        String password = "你来打我呀!";
        String encryptStr1 = encrypt(password);
        System.out.println("第一次加密:" + encryptStr1);
        String decryptStr1 = decrypt(encryptStr1);
        System.out.println("第一次解密:" + decryptStr1);
        String encryptStr2 = encrypt(password);
        System.out.println("我每次加密都不一样:" + encryptStr2);
        String decryptStr2 = decrypt(encryptStr1);
        System.out.println("但我每次都能得到你:" + decryptStr2);
    }
    // 加密
    public static String encrypt(String password) throws Exception {
        Cipher cipher = Cipher.getInstance(INSTANCE);
        SecretKeySpec keySpec = new SecretKeySpec(BYTES_KEY, AES);
        // CBC模式需要生成一个16 bytes的initialization vector
        SecureRandom sr = SecureRandom.getInstanceStrong();
        byte[] iv = sr.generateSeed(16);
        IvParameterSpec ivps = new IvParameterSpec(iv);
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivps);
        byte[] data = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8));
        // IV不需要保密,把IV和密文一起返回
        return DatatypeConverter.printBase64Binary(join(iv, data));
    }
    // 解密
    public static String decrypt(String password) throws Exception {
        byte[] iv = new byte[16];
        byte[] input = DatatypeConverter.parseBase64Binary(password);
        byte[] data = new byte[input.length - 16];
        // 把password分割成IV和密文
        System.arraycopy(input, 0, iv, 0, 16);
        System.arraycopy(input, 16, data, 0, data.length);
        // 解密
        Cipher cipher = Cipher.getInstance(INSTANCE);
        SecretKeySpec keySpec = new SecretKeySpec(BYTES_KEY, AES);
        IvParameterSpec ivps = new IvParameterSpec(iv);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivps);
        return new String(cipher.doFinal(data), StandardCharsets.UTF_8);
    }
    public static byte[] join(byte[] bs1, byte[] bs2) {
        byte[] r = new byte[bs1.length + bs2.length];
        System.arraycopy(bs1, 0, r, 0, bs1.length);
        System.arraycopy(bs2, 0, r, bs1.length, bs2.length);
        return r;
    }
}

输出验证:


5b916ec495cb4a3c87bc967fc9a925d0.png


好了,对称加密算法之AES算法-CBC模式的简单应用就介绍到这里

目录
相关文章
|
1天前
|
算法 安全 搜索推荐
AES(Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由美国国家标准技术研究所(NIST)制定。
AES(Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由美国国家标准技术研究所(NIST)制定。
20 9
|
13天前
|
算法 C# 数据安全/隐私保护
|
14天前
|
算法 安全 Java
Java中MD5加密算法的原理与实现详解
Java中MD5加密算法的原理与实现详解
|
10天前
|
算法 安全 数据安全/隐私保护
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
|
12天前
|
算法 安全 网络安全
支付系统,网络安全06----支付安全---,机密性,加密算法,目前最流行的加密算法,AES加密算法,目前最流行的非对称加密算法RSA,对称加密和非对称加密的优缺点,非对称加密是基于非常复杂的数学算法
支付系统,网络安全06----支付安全---,机密性,加密算法,目前最流行的加密算法,AES加密算法,目前最流行的非对称加密算法RSA,对称加密和非对称加密的优缺点,非对称加密是基于非常复杂的数学算法
|
13天前
|
算法 Java 数据处理
Java中MD5加密算法的实现
Java中MD5加密算法的实现
|
2天前
|
机器学习/深度学习 人工智能 安全
网络安全与信息安全:漏洞、加密技术与安全意识的交汇点
【7月更文挑战第13天】在数字化时代,网络安全和信息安全是保护个人隐私和企业资产的关键。本文将深入探讨网络安全漏洞的成因,分析加密技术如何成为防御机制的一部分,并强调提升安全意识的必要性。我们将通过案例分析和最新研究,揭示网络威胁的演变趋势,以及如何通过教育和技术手段构建更强大的防线。
|
1天前
|
SQL 安全 算法
网络安全的守护者:漏洞、加密与意识的三维防御
【7月更文挑战第14天】在数字时代的浪潮中,网络安全成为保护个人隐私和企业资产的盾牌。本文深入探讨网络安全中的三大支柱:安全漏洞的识别与防范、加密技术的应用与发展以及用户安全意识的培养。我们将分析这些要素如何共同构建起一个坚固的信息安全防线,并讨论它们在现代网络环境中的重要性和挑战。
13 3
|
2天前
|
安全 网络安全 量子技术
网络安全与信息安全:漏洞、加密与安全意识的三重奏
在数字化浪潮中,网络安全与信息安全成为维护信息完整性、保密性与可用性的关键。本文将深入探讨网络安全漏洞的类型及其成因,介绍加密技术如何保护数据免受未授权访问,并强调提升个人与企业的安全意识对于防范网络攻击的重要性。通过案例分析与统计数据支撑,文章旨在为读者提供全面的网络安全知识分享,促进构建更为坚固的网络环境。
|
2天前
|
安全 算法 网络安全
网络安全的前沿防线:漏洞、加密与意识的三重奏
在数字化浪潮中,网络安全的重要性日益凸显。本文将探讨网络安全中的三个关键组成部分:网络漏洞、加密技术及安全意识,分析它们在保护信息安全中的作用和挑战。通过具体案例,我们将深入了解这些概念的实际影响,并提出相应的防御策略。文章旨在为读者提供一个综合性的视角,以更好地理解和应对网络安全威胁。