加密与安全_探索对称加密算法

文章目录

  • 概述
  • 常用的对称加密算法
  • AES
    • ECB模式
    • CBC模式 (推荐)
    • ECB VS CBC
  • 附:AES工具类
  • 总结

在这里插入图片描述


概述

对称加密算法是一种加密技术,使用相同的密钥来进行加密和解密数据。在这种算法中,发送方使用密钥将明文(未加密的数据)转换为密文(加密的数据),而接收方使用相同的密钥将密文还原为明文。

对称加密算法的安全性依赖于密钥的保密性,因为任何持有相同密钥的人都能够解密数据。

常见的对称加密算法包括AES(高级加密标准)和DES(数据加密标准)。虽然对称加密算法在性能上通常比非对称加密算法更高效,但在密钥管理和分发方面存在挑战。

通俗来讲,可以这么理解: 对称加密算法就像是一把钥匙可以打开一个锁。在这里,你有一个钥匙(密钥),用它来锁住(加密)你的信息,然后你可以用同样的钥匙(密钥)来解锁(解密)它。这意味着发送方和接收方都使用相同的密钥来加密和解密信息。


常用的对称加密算法

常用的对称加密算法包括:

  1. AES(Advanced Encryption Standard):这是目前最常用的对称加密算法之一。它使用128、192或256位密钥来加密数据,并已被广泛采用于许多安全应用中。

  2. DES(Data Encryption Standard):虽然已被AES所取代,但仍然在一些遗留系统中使用。DES使用56位密钥对数据进行加密。

  3. 3DES(Triple Data Encryption Standard):3DES是DES的改进版本,它对数据应用三次DES算法,提高了安全性。但由于计算成本高昂,现在已经不太常用。

  4. Blowfish:这是一个可扩展的对称加密算法,可以使用变长密钥,从32位到448位。它曾经很流行,但由于一些安全性方面的考虑,现在使用较少。

  5. RC4(Rivest Cipher 4):尽管曾被广泛使用,但由于存在一些严重的安全漏洞,现在已经不建议使用。


从程序的角度看,所谓加密,就是这样一个函数,它接收密码和明文,然后输出密文:

secret = encrypt(key, message);

而解密则相反,它接收密码和密文,然后输出明文:

plain = decrypt(key, secret);  

从程序的角度看,所谓加密,就是这样一个函数,它接收密码和明文,然后输出密文:

secret = encrypt(key, message);

而解密则相反,它接收密码和密文,然后输出明文:

plain = decrypt(key, secret);  

加密和解密确实可以被视为类似上面的函数,但实际上,它们可能会更为复杂一些,尤其是在实现对称加密算法时。

在使用对称加密算法时,这两个函数通常被称为加密函数和解密函数。例如,在使用AES算法时,加密函数会接收密钥(key)和明文(message),然后输出密文(ciphertext)。而解密函数则接收密钥(key)和密文(ciphertext),然后输出明文(message)

算法密钥长度工作模式填充模式
AES128/192/256ECB/CBC/PCBC/CTR/…NoPadding/PKCS5Padding/PKCS7Padding/…
DES56/64ECB/CBC/PCBC/CTR/…NoPadding/PKCS5Padding/…

密钥长度直接决定加密强度,而工作模式和填充模式可以看成是对称加密算法的参数和格式选择。


这些对称加密算法在不同的场景中都有各自的优缺点,选择合适的算法取决于安全性需求、性能和应用环境。AES通常被认为是最安全和高效的对称加密算法之一,因此在许多情况下被首选使用


AES

AES算法是目前应用最广泛的加密算法。

ECB模式

先用ECB模式加密并解密. 代码如下

package com.artisan.securityalgjava.aes;import java.security.*;
import java.util.Base64;import javax.crypto.*;
import javax.crypto.spec.*;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world*/
public class AesECBExample {public static void main(String[] args) throws Exception {// 原文:String message = "Hello, Artisan!";System.out.println("Message: " + message);// 128位密钥 = 16 bytes Key:byte[] key = "1234567890abcdef".getBytes("UTF-8");// 加密:byte[] data = message.getBytes("UTF-8");byte[] encrypted = encrypt(key, data);System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encrypted));// 解密:byte[] decrypted = decrypt(key, encrypted);System.out.println("Decrypted: " + new String(decrypted, "UTF-8"));}// 加密方法public static byte[] encrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 创建加密对象Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密钥规范SecretKey keySpec = new SecretKeySpec(key, "AES");// 初始化加密对象cipher.init(Cipher.ENCRYPT_MODE, keySpec);// 执行加密操作return cipher.doFinal(input);}// 解密方法public static byte[] decrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 创建解密对象Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密钥规范SecretKey keySpec = new SecretKeySpec(key, "AES");// 初始化解密对象cipher.init(Cipher.DECRYPT_MODE, keySpec);// 执行解密操作return cipher.doFinal(input);}
}

ECB模式是最简单的AES加密模式,它只需要一个固定长度的密钥,固定的明文会生成固定的密文,这种一对一的加密方式会导致安全性降低

CBC模式 (推荐)

package com.artisan.securityalgjava.aes;import java.security.*;
import java.util.Base64;import javax.crypto.*;
import javax.crypto.spec.*;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world* @desc: AES CBC模式加解密示例*/
public class AesCBCExample {public static void main(String[] args) throws Exception {// 原文:String message = "Hello, Artisan!";System.out.println("Message: " + message);// 256位密钥 = 32 bytes Key:byte[] key = "1234567890abcdef1234567890abcdef".getBytes("UTF-8");// 加密:byte[] data = message.getBytes("UTF-8");byte[] encrypted = encrypt(key, data);System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encrypted));// 解密:byte[] decrypted = decrypt(key, encrypted);System.out.println("Decrypted: " + new String(decrypted, "UTF-8"));}/*** 加密* @param key* @param input* @return* @throws GeneralSecurityException*/public static byte[] encrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 创建AES加密器Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// 创建密钥规范SecretKeySpec keySpec = new SecretKeySpec(key, "AES");// CBC模式需要生成一个16 bytes的初始化向量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(input);// IV不需要保密,把IV和密文一起返回return join(iv, data);}/*** 解密* @param key* @param input* @return* @throws GeneralSecurityException*/public static byte[] decrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 把input分割成IV和密文byte[] iv = new byte[16];byte[] data = new byte[input.length - 16];System.arraycopy(input, 0, iv, 0, 16);System.arraycopy(input, 16, data, 0, data.length);// 创建AES解密器Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// 创建密钥规范SecretKeySpec keySpec = new SecretKeySpec(key, "AES");IvParameterSpec ivps = new IvParameterSpec(iv);// 初始化解密器cipher.init(Cipher.DECRYPT_MODE, keySpec, ivps);// 执行解密操作return cipher.doFinal(data);}/*** 拼接两个字节数组* @param bs1* @param bs2* @return*/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;}}

CBC模式下,需要一个随机生成的16字节IV参数,必须使用SecureRandom生成。因为多了一个IvParameterSpec实例,因此,初始化方法需要调用Cipher的一个重载方法并传入IvParameterSpec

观察输出,可以发现每次生成的IV不同,密文也不同, 如下图所示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现了AES CBC模式的加密和解密功能。在加密过程中,生成了一个16字节的初始化向量(IV),在解密时使用了这个IV来确保安全性。

因此,CBC模式,它需要一个随机数作为IV参数,这样对于同一份明文,每次生成的密文都不同 .


ECB VS CBC

AES有几种不同的模式,其中最常见的两种是ECB(Electronic Codebook)模式和CBC(Cipher Block Chaining)模式。

  1. ECB模式(电子密码本模式)
  • 特点
    • 将明文分成块,每个块使用相同的密钥进行加密。
    • 相同的明文块在加密后会得到相同的密文块。
    • 每个块的加密是独立的,不受其他块的影响。
  • 优点
    • 简单,容易并行化处理。
    • 适用于对称加密需求较简单的场景。
  • 缺点
    • 容易受到重放攻击的影响,因为相同的明文块会产生相同的密文块,没有隐藏明文块之间的关系。
    • 不适合加密大量数据或需要保护隐私的数据,因为无法隐藏明文块之间的模式。
  1. CBC模式(密码块链接模式)
  • 特点
    • 在加密前,会对明文块进行异或运算,并与前一个密文块进行混合,然后再加密。
    • 需要一个初始化向量(IV)来增加随机性,防止重放攻击。
    • 密文块的加密依赖于前一个密文块,因此密文块之间存在依赖关系。
  • 优点
    • 对于相同的明文块,使用不同的IV会产生不同的密文块,增加了安全性。
    • 可以加密大量数据,并且可以隐藏明文块之间的模式。
  • 缺点
    • 加密速度较ECB模式慢,因为需要依赖前一个密文块。
    • 不太容易并行化处理,因为每个块的加密都依赖于前一个块的加密结果。

综上所述,ECB模式简单快速,适合简单的加密需求,但安全性较差,不适合加密大量数据或需要保护隐私的数据。而CBC模式相对更安全,能够隐藏明文块之间的模式,适合加密大量数据或需要保护隐私的数据,但加密速度较慢


附:AES工具类

package com.artisan.securityalgjava.aes;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.security.spec.KeySpec;
import java.util.Arrays;
import java.util.Base64;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world* @desc: AES加密解密工具类, 提供了AES加密解密的功能,使用了CBC模式和PBKDF2算法生成密钥*/
public class AESCipher {/*** 密钥生成算法*/private static final String SECRET_KEY_ALGORITHM = "PBKDF2WithHmacSHA256";/*** 加密算法*/private static final String ENCRYPTION_ALGORITHM = "AES/CBC/PKCS5Padding";/*** 密钥长度*/private static final int KEY_SIZE = 256;/*** 迭代次数*/private static final int ITERATION_COUNT = 65536;/*** 初始化向量长度*/private static final int IV_SIZE = 16;/*** 生成密钥** @param password* @param salt* @return* @throws Exception*/private static SecretKeySpec generateKey(String password, byte[] salt) throws Exception {SecretKeyFactory factory = SecretKeyFactory.getInstance(SECRET_KEY_ALGORITHM);KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, ITERATION_COUNT, KEY_SIZE);SecretKey tmp = factory.generateSecret(spec);return new SecretKeySpec(tmp.getEncoded(), "AES");}/*** 加密** @param plaintext* @param password* @return* @throws Exception*/public static String encrypt(String plaintext, String password) throws Exception {// 生成盐byte[] salt = new byte[16];// 生成初始化向量byte[] iv = new byte[IV_SIZE];byte[] encryptedBytes;// 生成盐和初始化向量SecureRandom random = new SecureRandom();random.nextBytes(salt);random.nextBytes(iv);// 生成密钥SecretKeySpec keySpec = generateKey(password, salt);Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));// 执行加密操作encryptedBytes = cipher.doFinal(plaintext.getBytes());// 将盐、初始化向量和密文拼接并返回Base64编码字符串byte[] combined = new byte[salt.length + iv.length + encryptedBytes.length];System.arraycopy(salt, 0, combined, 0, salt.length);System.arraycopy(iv, 0, combined, salt.length, iv.length);System.arraycopy(encryptedBytes, 0, combined, salt.length + iv.length, encryptedBytes.length);return Base64.getEncoder().encodeToString(combined);}/*** 解密** @param encryptedText* @param password* @return* @throws Exception*/public static String decrypt(String encryptedText, String password) throws Exception {// 解析Base64编码字符串并分离盐、初始化向量和密文byte[] combined = Base64.getDecoder().decode(encryptedText);byte[] salt = Arrays.copyOfRange(combined, 0, 16);byte[] iv = Arrays.copyOfRange(combined, 16, 32);byte[] encryptedBytes = Arrays.copyOfRange(combined, 32, combined.length);// 生成密钥SecretKeySpec keySpec = generateKey(password, salt);Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));// 执行解密操作并返回明文字符串byte[] decryptedBytes = cipher.doFinal(encryptedBytes);return new String(decryptedBytes);}/*** 测试方法** @param args* @throws Exception*/public static void main(String[] args) throws Exception {// 测试加密解密功能String encrypted = encrypt("组热么共和国的啥范德萨", "dddd");System.out.println("Encrypted: " + encrypted);String decrypted = decrypt(encrypted, "dddd");System.out.println("Decrypted: " + decrypted);}
}

总结

对称加密算法使用同一个密钥进行加密和解密,适用于需要高效加解密的场景。常见的对称加密算法包括DES、AES和3DES等。

对称加密算法使用同一个密钥进行加密和解密,常用的算法包括DES、AES和3DES等。

  • DES(Data Encryption Standard):DES是一种较早的对称加密算法,使用56位密钥进行加密和解密。由于密钥长度较短,DES已经不再被推荐使用,因为它容易受到穷举攻击。

  • AES(Advanced Encryption Standard):AES是目前广泛使用的对称加密算法之一。它使用128位、192位或256位密钥进行加密和解密。AES算法的安全性和性能较高,因此被广泛应用于各种安全领域。

  • 3DES(Triple Data Encryption Standard):3DES是对DES算法的改进,通过对数据应用三次DES算法来提高安全性。3DES使用的密钥长度为56位,因此它的安全性较DES提高了很多。但由于AES的出现和3DES的计算复杂性,3DES的使用逐渐减少。

密钥长度由算法设计决定。对于AES算法,它支持的密钥长度为128位、192位和256位。一般来说,密钥长度越长,加密的安全性越高,但同时也带来了更高的计算成本。

在使用对称加密算法时,需要指定以下参数:

  • 算法名称:即使用的加密算法,例如DES、AES和3DES等。
  • 工作模式:指定了加密算法在加密大块数据时的工作模式,常见的工作模式包括ECB、CBC、CFB、OFB等。
  • 填充模式:指定了在加密数据块大小不足时如何填充数据,常见的填充模式包括PKCS5Padding、NoPadding等。

选择合适的算法名称、工作模式和填充模式,可以根据具体的安全需求和性能要求进行调整。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/503837.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

即插即用篇 | YOLOv8 引入 SKAttention 注意力机制 | 《Selective Kernel Networks》

论文名称:《Selective Kernel Networks》 论文地址:https://arxiv.org/pdf/1903.06586.pdf 代码地址:https://github.com/implus/SKNet 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yaml

html基本标签

<h1></h1> <p></p> h是标签从h1~h6&#xff0c;没用h7,h8 p是段落 <a href"https://www.educoder.net">Educoder平台</a> href可以指定链接进行跳转 <img src"https://www.educoder.net/attachments/download/2078…

如何自研无人机飞控?无人机飞行控制系统研发流程详解,无人机飞控研发团队成员分析

无人机飞行控制系统是一个能够稳定无人机飞行姿态&#xff0c;并控制无人机自主或半自主飞行的控制系统&#xff0c;也被称为无人机的“大脑”。该系统主要负责无人机的飞行姿态感知、控制和导航&#xff0c;是无人机实现自主飞行、稳定悬停、避障控制、导航定位等功能的核心组…

【机器学习基础】层次聚类-BIRCH聚类

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;相对完整的机器学习基础教学&#xff01; ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战…

特殊设计模式

▶实现一个类&#xff0c;不能被拷贝 ▶实现一个类&#xff0c;只能在堆上创建 ❗实现一个类&#xff0c;只能创建在栈上 ❗设计一个不能继承的类 ❗单例模式——一个类只能生成一个对象   ❔饿汉模式——在每次程序启动都会自动生成一个对象   ❓懒汉模式——在第一次需要…

MWC 2024丨美格智能CEO杜国彬出席中国联通创新成果发布会并发表主题演讲

2月26日&#xff0c;中国联通在MWC2024 巴塞罗那期间举办了以“算网为基&#xff0c;智领未来”为主题的创新成果发布会&#xff0c;集中展示最新的创新成果与最佳实践。 中国通信标准化协会理事长闻库、GSMA首席财务官Louise Easterbrook、中国联通副总经理梁宝俊、华为ICT销…

GPT-4论文精读【论文精读·53】

Toolformer 今天我们来聊一下 GPT 4&#xff0c;但其实在最开始准备这期视频的时候&#xff0c;我是准备讲 Toolformer 这篇论文的&#xff0c;它是 Meta AI 在2月初的时候放出来的一篇论文。说这个大的语言模型可以利用工具了&#xff0c;比如说它就可以去调用各种各样的API&a…

MutationObserver是一个可以监听DOM结构变化的接口,请停用DOMContentLoaded

DOMContentLoaded已经要被放弃使用了&#xff0c;所以官方推荐使用MutationObserver来监听页面发生变化。但是如果你想继续使用也是可以的&#xff1b;Document: DOMContentLoaded event - Web APIs | MDN MutationObserver官方文档&#xff1a;MutationObserver - Web APIs |…

如何在OnlyFans付费订阅?

OnlyFans成立于2016年&#xff0c;允许内容创作者从用户那里获得资金&#xff0c;用户需要支付订阅费用才能查看他们的内容。它在多个领域受到欢迎&#xff0c;包括音乐、健身、摄影&#xff0c;以及某种内容创作。 如何在OnlyFans付费订阅&#xff1f; 我们订阅之前需要一张…

《Spring Security 简易速速上手小册》第7章 REST API 与微服务安全(2024 最新版)

文章目录 7.1 保护 REST API7.1.1 基础知识详解7.1.2 重点案例&#xff1a;使用 JWT 进行身份验证和授权案例 Demo 7.1.3 拓展案例 1&#xff1a;API 密钥认证案例 Demo测试API密钥认证 7.1.4 拓展案例 2&#xff1a;使用 OAuth2 保护 API案例 Demo测试 OAuth2 保护的 API 7.2 …

Spark Shuffle Tracking 原理分析

Shuffle Tracking Shuffle Tracking 是 Spark 在没有 ESS(External Shuffle Service)情况&#xff0c;并且开启 Dynamic Allocation 的重要功能。如在 K8S 上运行 spark 没有 ESS。本文档所有的前提都是基于以上条件的。 如果开启了 ESS&#xff0c;那么 Executor 计算完后&a…

List<Object>集合对象属性拷贝工具类

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 问题现象&#xff1a; 最近在项目中经常会使用到BeanUtils工具类来作对象的属性字段拷贝&#xff0c;但如果应用到List集合的话就需要遍历去操作了&#xff0c;如下&#xff1a; 打印结果&#xff1a; …