AES加密学习

news2024/10/6 8:25:34

AES(高级加密标准)是一种对称密钥加密算法,用于加密和解密数据。它被广泛应用于各种安全领域,包括但不限于网络通信、数据存储和软件保护。

历史背景

AES是由比利时密码学家Joan Daemen和Vincent Rijmen设计的Rijndael算法演变而来的。美国国家标准与技术研究院(NIST)在2001年将其选为新的数据加密标准,以取代旧的DES(数据加密标准)。

工作原理

AES是一种对称密钥算法,这意味着加密和解密使用相同的密钥。它通过一系列复杂的数学变换来加密数据,这些变换包括字节替换、行移位、列混合和轮密钥加。

密钥长度

AES支持三种密钥长度:128位、192位和256位。密钥长度越长,安全性越高,但计算开销也越大。

轮数

AES的加密过程由多轮变换组成。对于128位密钥,有10轮变换;对于192位密钥,有12轮变换;对于256位密钥,有14轮变换。

安全性

AES被认为是安全的,因为它没有已知的有效攻击方法,除非使用暴力破解。然而,随着计算能力的提高,较短密钥长度的AES可能会变得不安全。

应用

AES被广泛应用于各种领域,包括但不限于:

  • 网络安全:用于保护网络通信,如SSL/TLS协议。
  • 数据存储:用于加密硬盘驱动器和数据库中的数据。
  • 软件保护:用于防止软件被非法复制或篡改。
  • 移动设备:用于保护智能手机和平板电脑上的数据。
     

性能

AES的性能取决于多种因素,包括密钥长度、数据大小和硬件平台。一般来说,AES的性能可以通过优化算法实现和使用硬件加速来提高。

标准和规范

AES的标准和规范由NIST发布,包括FIPS-197(联邦信息处理标准197)。

AES加密模式

  1. 电子密码本模式(Electronic Codebook, ECB)
    • ECB模式是对每个独立的数据块直接使用相同的密钥进行加密,不考虑相邻块之间的关系。
    • 优点:简单易实现,可以并行处理。
    • 缺点:同一明文块会被加密成相同的密文块,导致模式重复,容易受到针对模式的攻击,不适用于加密模式重复或相关性强的数据。
  2. 密码分组链接模式(Cipher Block Chaining, CBC)
    • CBC模式中,每个数据块在加密前与前一个块的密文进行异或操作,首次加密时与一个初始化向量(IV)异或。
    • 优点:通过这种方式,每个块的加密不仅依赖于密钥,还依赖于前一个块的内容,从而增强了安全性,避免了ECB模式中的模式重放问题。
    • 缺点:处理流式数据时需要保持状态,不适合并行处理,并且对IV的要求较高,如果IV泄露或重复,可能会削弱安全性。
  3. 密文反馈模式(Cipher Feedback, CFB)
    • CFB模式下,加密过程产生的密文部分被用作下一个块的输入,形成一个自我同步的流。
    • 优点:类似于流密码的工作方式,适合传输错误校验和恢复。
    • 缺点:也需保持状态,不是完全并行的,并且对初始IV敏感。
  4. 输出反馈模式(Output Feedback, OFB)
    • OFB模式将AES算法作为伪随机数生成器来创建密钥流,该密钥流随后与明文进行异或操作来加密数据。
    • 优点:同样具有良好的错误传播特性,加密过程独立于明文。
    • 缺点:同样依赖于初始IV,若IV重复则会导致密钥流重复,影响安全性。
  5. 计数器模式(Counter, CTR)
    • CTR模式使用一个递增的计数器或nonce结合密钥产生密钥流,这个密钥流与明文进行异或加密。
    • 优点:高度并行,适合硬件加速,同时具备优秀的错误恢复能力。
    • 缺点:nonce必须唯一,否则安全性受损,且需要妥善管理nonce和计数器以防止重播攻击。
  6. 伽罗瓦/计数器模式(GCM)

    • AES用于生成密钥流,其原理与CTR模式相似,但使用的不是简单的递增计数器,而是基于计数器值(Nonce + 计数器)计算出的一个GHASH值,然后与明文进行异或操作实现加密。这里的Nonce应当是随机生成并且在系统内唯一的,以保证安全性。

    • 提供数据机密性、完整性和认证。

AES填充算法

  1. PKCS#7 / PKCS#5填充
    • 优点
      • 易于实现和识别,即使数据的结尾被修改也能正确检测出填充错误。
      • 它对于所有块大小都适用,不仅是AES,而且可以应用于任何分组大小。
    • 缺点
      • 对于非常小的数据,尤其是接近分组大小的数据,填充后的数据量会显著增加。
      • 如果加密后的内容没有经过适当的身份验证,恶意用户可能尝试篡改填充数据以达到攻击目的。
  2. Zero Padding(零填充)
    • 优点
      • 实现极其简单。
    • 缺点
      • 如果数据天然就以零结尾,或者在传输过程中自然出现零,填充可能混淆不清,这可能导致解密失败或者安全漏洞。
      • 同样缺乏错误检测能力,容易遭受填充 oracle 攻击。
  3. ANSI X.923填充
    • 优点
      • 解决了Zero Padding可能带来的混淆问题。
    • 缺点
      • 同样需要额外的数据验证才能确保填充正确,否则仍有可能遭受攻击。
  4. ISO 10126填充
    • 优点
      • 由于包含了随机成分,理论上提高了抵抗填充oracle攻击的能力。
    • 缺点
      • 需要生成随机数据,可能会增加实现复杂度和开销,尤其是在资源受限的环境中。
      • 同样需要填充数据的完整性检查。
  5. No Padding(无填充)
    • 优点
      • 当数据长度刚好是分组大小的整数倍时,不需要额外填充,节省空间。
    • 缺点
      • 不适用于大多数实际场景,因为大部分数据长度不可能总是恰好匹配分组大小。

java实现 

AES的 ECB模式PKCS5Padding填充算法

package com.yang.crypto.utils;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
 * <p>AES-128 ECB加密</p>
 * <pre>
 * 字符集:UTF-8
 * 算法模式:ECB
 * 数据块:128位
 * 补码方式:PKCS5Padding
 * 加密结果编码方式:Base64
 * </pre>
 *
 * @author By: zhangchunyang
 * Package com.yang.crypto.utils
 * Ceate Time 2024-03-06 11:27
 */

public class CryptoAesUtil {

    private static final String UTF8 = "UTF-8";
    private static final String ALGORITHM = "AES";
    /**
     * 默认的加密算法
     */
    private static final String ALGORITHM_CIPHER = "AES/ECB/PKCS5Padding";

    private static final int LIMIT_LEN = 32;

    public static String genAesKey() {
        return StringUtil.random(LIMIT_LEN);
    }

    /**
     * 生成一个SecretKey
     *
     * @param password 长度必须小于等于16
     * @return 返回SecretKey
     */
    public static SecretKey getSecretKey(String password) {
        byte[] passwordData = password.getBytes();
        if (passwordData.length > LIMIT_LEN) {
            throw new IllegalArgumentException("password 长度必须小于等于32");
        }
        // 创建一个空的LIMIT_LEN位字节数组(默认值为0),16byte(128bit)
        byte[] keyData = new byte[LIMIT_LEN];
        System.arraycopy(passwordData, 0, keyData, 0, passwordData.length);

        return new SecretKeySpec(keyData, ALGORITHM);
    }

    /**
     * 加密
     *
     * @param data     待加密数据
     * @param password 密码
     * @return 返回加密成功后数据
     * @throws Exception
     */
    public static byte[] encrypt(byte[] data, String password) throws Exception {
        SecretKey secretKey = getSecretKey(password);
        // Ciphr完成加密或解密工作类
        Cipher cipher = Cipher.getInstance(ALGORITHM_CIPHER);
        // 对Cipher初始化,解密模式
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        // 加密data
        return cipher.doFinal(data);
    }

    /**
     * 解密
     *
     * @param data     待解密数据
     * @param password 密码
     * @return 返回解密后的数据
     * @throws Exception
     */
    public static byte[] decrypt(byte[] data, String password) throws Exception {
        SecretKey secretKey = getSecretKey(password);
        // Cipher完成加密或解密工作类
        Cipher cipher = Cipher.getInstance(ALGORITHM_CIPHER);
        // 对Cipher初始化,解密模式
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        // 解密data
        return cipher.doFinal(data);
    }

    /**
     * 文本加密
     *
     * @param content  明文
     * @param password 密码
     * @return 返回base64内容
     * @throws Exception
     */
    public static String encryptToBase64String(String content, String password) throws Exception {
        byte[] data = content.getBytes(UTF8);
        byte[] result = encrypt(data, password);
        return Base64.encodeBase64String(result);
    }

    /**
     * 文本解密
     *
     * @param base64String 待解密文本
     * @param password     密码
     * @return 返回明文
     * @throws Exception
     */
    public static String decryptFromBase64String(String base64String, String password) throws Exception {
        byte[] data = Base64.decodeBase64(base64String);
        byte[] contentData = decrypt(data, password);
        return new String(contentData, UTF8);
    }

    /**
     * 文本加密
     *
     * @param content  明文
     * @param password 密码
     * @return 返回16进制内容
     * @throws Exception
     */
    public static String encryptToHex(String content, String password) throws Exception {
        byte[] data = content.getBytes(UTF8);
        byte[] result = encrypt(data, password);
        return Hex.encodeHexString(result);
    }

    /**
     * 文本解密
     *
     * @param hex      待解密文本
     * @param password 密码
     * @return 返回明文
     * @throws Exception
     */
    public static String decryptFromHex(String hex, String password) throws Exception {
        byte[] data = Hex.decodeHex(hex);
        byte[] contentData = decrypt(data, password);
        return new String(contentData, UTF8);
    }

}




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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【YOLO v5 v7 v8 v9小目标改进】新CNN架构 InceptionNeXt:怎么让大卷积核既好用又快

新CNN架构 InceptionNeXt&#xff1a;怎么让大卷积核既好用又快 提出背景问题: 如何提高大核心卷积的效率&#xff0c;同时保持或提升模型性能&#xff1f; 改进思路MetaNeXtInception深度卷积InceptionNeXt 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 提出背…

EC600模块通过AT指令接入阿里云物联网平台并发布属性

摘要&#xff1a;本文介绍一下如何通过EC600模块的AT指令&#xff0c;将设备属性值发送到阿里云物联网平台的方法。 这个模块供电可以是 5-16V 和电脑通过USB串口连接&#xff0c;4线即可。未来集成到自己的系统中的时候&#xff0c;可以直接发送指令即可。 使用的软件是FreeAT…

Apache ECharts数据可视化技术

介绍 官方地址:Apache ECharts 快速入门案例echarts.init //初始化方法 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>ECharts</title><!-- 引入刚刚下载的 ECharts 文件 --><script src"echart…

4.Rust中的所有权(Rust成名绝技)

Rust成名绝技 Rust 之所以能成为万众瞩目的语言&#xff0c;就是因为其内存安全性。在以往&#xff0c;内存安全几乎都是通过 GC 的方式实现&#xff0c;但是 GC 会引来性能、内存占用以及全停顿等问题&#xff0c;在高性能场景、实时性要求高和系统编程上是不可接受的&#x…

代码随想录-贪心算法

贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 455. 分发饼干 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count 0;int sIndex s.length - 1;for (int i g.length - 1; i > 0; i--) …

Mamba模型底层技术详解,与Transformer到底有何不同?

导读&#xff1a; 基于状态空间模型&#xff08;State Space Model&#xff09;的Mamba模型最近在深度学习领域有赶超Transformer的势头。其最主要的优势就在于其在长序列任务上的优异性能与较低的计算复杂度。本文就Mamba模型的原理进行解析&#xff0c;分析Mamba模型在结构上…

Dynamo初学常识梳理(四)——Revit图元

希望想学 Dynamo 的小伙伴坚持住&#xff0c;每天积累一点点知识&#xff0c;Dynamo 你很快就能上手的&#xff01;Dynamo 并不是你想的那样难学哦&#xff01; 今天要讲的是如何从 Dynamo 中获取 Revit 的图元&#xff0c;这些节点很常用&#xff0c;不需要全背下来&#xff0…

田宏斌:以人为本的听力健康管理实践经验 | 演讲嘉宾公布

一、助辅听器材Ⅲ分论坛 助辅听器材Ⅲ分论坛将于3月28日同期举办&#xff01; 听力贯穿人的一生&#xff0c;听觉在生命的各个阶段都是至关重要的功能&#xff0c;听力问题一旦出现&#xff0c;会严重影响生活质量。助辅听器材能有效提高生活品质。在这里&#xff0c;我们将分享…

【MybatisPlus】QueryWrapper、UpdateWrappe、LambdaQueryWrapper、LambdaUpdateWrapper

一、Wrapper简介 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都是 MyBatis-Plus 框架中用于构建条件的工具类&#xff0c;它们之间的关系是继承关系。其中 QueryWrapper 和 UpdateWrapper 是基于普通的对象属性名来构建条件的&#xff0c;而 La…

2024最新Android大厂面试真题大全,推荐学习

历时半年&#xff0c;我们终于整理出了这份市面上最全面的最新Android面试题解析大全&#xff01; 章节目录 第一章&#xff1a;Android 基础 面试题 第二章&#xff1a;Android 高级 面试题 第三章&#xff1a;开源框架实战面试解析 第四章&#xff1a;Java 面试题 第五章&a…

SpringBoot源码解读与原理分析(三)条件装配

文章目录 2.3 Spring Framework的条件装配2.3.1 基于Profile的装配1.Profile源码解读2.使用Profile注解&#xff08;3&#xff09;命令行参数配置Profile3.Profile运用于实际开发4.Profile的不足 2.3.2 基于Conditional的装配1.Conditional源码解读2.Conditional使用3.Conditio…

Kosmos-1: 通用接口架构下的多模态大语言模型

Kosmos-1: 通用接口架构下的多模态大语言模型 FesianXu 20230513 at Baidu Search Team 前言 在大规模语言模型&#xff08;Large Language Model, LLM&#xff09;看似要带来新一番人工智能变革浪潮之际&#xff0c;越来越多尝试以LLM作为通用接口去融入各种任务的工作&#…

WordPress建站入门教程:小皮面板phpstudy如何安装PHP和切换php版本?

小皮面板phpstudy支持的PHP版本有很多&#xff0c;包括5.2.17、5.3.29、5.4.45、5.5.9、5.6.9、7.0.9、7.1.9、7.2.9、7.3.4、7.3.9、7.4.3、8.0.2、8.2.9。那么我们如何安装其他的php版本和切换网站的php版本呢&#xff1f;只需要简单几步即可&#xff0c;具体如下&#xff1a…

JavaWeb - 2 - HTML、CSS

什么是HTML、CSS&#xff1f; HTML&#xff08;HyperText Markup Language&#xff09;&#xff1a;超文本标记语言 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大&#xff0c;除了文字信息&#xff0c;还可以定义图片、音频、视频等内容 标记语言&…

不用下载的工具却能保存西瓜视频的原画视频,支持无水印!

近年来&#xff0c;西瓜视频可谓是炙手可热&#xff0c;得益于其强大的后盾——抖音&#xff0c;以及推出的"中视频计划"。这个计划慷慨地斥资20亿用于支持视频制作者&#xff0c;因此在西瓜视频平台上&#xff0c;我们目睹了大量优质的长视频如雨后春笋般涌现。 对于…

SpringCloud 各自组件的停更/升级/替换

一、停更不停用 现在 SpringCloud 不再修复 bug&#xff0c;也不再接收合并请求&#xff0c;也不再发布新版本&#xff0c;但是目前还是可以继续使用的。 二、以前的组件 以前 SpringCloud 常用的组件如下图&#xff0c;服务的注册和发现使用 Eureka&#xff0c;服务的负载和调…

工业镜头的重要参数之视场、放大倍率、芯片尺寸--51camera

今天来简单介绍下工业镜头中常用的参数中的三个&#xff1a; 1、视场 视场&#xff08;FOV&#xff09;也称视野,是指能被视觉系统观察到的物方可视范围。 对于镜头而言&#xff0c;可观察到的视场跟镜头放大倍率及相机芯片选择有关。因此需要根据被观察物体的尺寸&#xff…

threejs展示glb模型

原模型为rvt模型 <template><div ref"threeJsContainer"class"three-js-container"></div> </template> <script> import { defineComponent } from "vue"; import * as THREE from "three"; import…

如何选择阿里云服务器配置,过来人说说

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

C++核心编程之内存分区模型,引用,函数提高

1&#xff0c;类型分区模型 c程序在执行中&#xff0c;将内存大方向划分为4个区域 1&#xff0c;代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的 2&#xff0c;全局区&#xff1a;存放全局变量和静态变量以及常量 3&#xff0c;栈区&#xff1…