AES加密学习

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);
    }

}




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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

家用洗地机哪个型号好用?介绍几个值得考虑的品牌

作为家里的主要清洁工&#xff0c;我一直以来都是负责家里的清洁工作。我经常使用吸尘器和扫地机器人来轮流清洁&#xff0c;虽然效果还不错&#xff0c;但是这种方式太费时间和精力了。特别是在脸上厨房里做完饭和孩子吃完饭后留下的残渣时&#xff0c;我总是需要用传统的拖多…

超级简单的Docker安装(centos7)

文章目录 先安装所需要的工具包设置远程仓库安装启动docker查看版本 先安装所需要的工具包 yum install -y yum-utils #安装工具包&#xff0c;缺少这些依赖将无法完成&#xff1b;设置远程仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/doc…

【漏洞复现】锐捷 EWEB auth 远程命令执行漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

洗地机热门品牌测评:石头/希亦/顺造/云鲸洗地机哪个好?哪个牌子最值得入手

大家好&#xff0c;博主是一个热爱生活和科技的居家测评博主。在过去的三年多时间里&#xff0c;我专注于清洁家电——洗地机。我深入测评了三十多款洗地机&#xff0c;现在我将用简单易懂的语言来分享洗地机的选购技巧和热门洗地机机型推荐。 洗地机选购技巧&#xff1a; 看…

掌握java中继承

目录 1.概念&#xff1a; 2.使用&#xff1a; 3.super关键字 4.子类构造方法 5.super和this关键字 6.初始化时代码块的执行顺序 7.继承的方式 8.final关键字 1.概念&#xff1a; 是面向对象程序设计代码可以重复使用的重要手段&#xff0c;允许程序员在保持原有类特性的…

#stm32外设总结电容触摸按键

BS8116A-3 IRQ 外部中断请求 NMOS输出内部上拉 SCL SDA IIC通信接口 VDD 供电电压2.2-5.5V Ct电容: 0~25 pF 电容越大灵敏度越低 1、 软件使用流程 初始化 将IIC的两个引脚初始化为复用开漏模式 按键引脚设置上拉输入 下降沿触发外部中断 void KEY_Init(void) {//uint8_t …

【Unity】分拣机的数字双胞胎集成到Unity3D开发平台中

Unity HMI 一、前言 该项目的重点是通过OPC UA进行客户端-服务器通信的简单演示&#xff0c;该演示在Unity3D中实现&#xff08;服务器- B&R Automation PLC&#xff0c;客户端- Unity3D&#xff09;。该项目展示了数字孪生的分拣机与一些额外的功能。该应用程序使用多线程…

E4991A 射频阻抗/材料分析仪

新利通 E4991A 射频阻抗/材料分析仪 —— 1 MHz到 3 GHz —— 简述 E4991A 射频阻抗/材料分析提供极限阻抗测量性能和功能强大的内置分析功能。它将为元器件和电路设计人员测量 3 GHz 以内的元器件提供创新功能&#xff0c;帮助他们进行研发工作。与反射测量技术不同&#x…

想开发苹果群控软件?先了解这些代码!

随着智能设备的普及&#xff0c;群控软件的需求日益增加&#xff0c;特别是针对苹果设备的群控软件&#xff0c;因其出色的性能和广泛的用户基础&#xff0c;受到了开发者们的青睐。 然而&#xff0c;开发一款功能强大的苹果群控软件并非易事&#xff0c;需要深入了解苹果的开…

Research Agent:具有解决基于大型文本语料库的复杂问题,具备深度多跳推理的能力

原文地址&#xff1a;https://towardsdatascience.com/the-research-agent-4ef8e6f1b741 2023 年 8 月 29 日 问题简介 在2021年&#xff0c;开始应对基于大量文本回答问题的挑战。在预训练transformers之前的时代&#xff0c;这个问题很难破解。 人工智能和大型预训练tran…

k8s常用命令大全

k8s常用的命令 下面是一些常用的Kubernetes&#xff08;K8s&#xff09;命令&#xff0c;以及它们的简要说明。这些命令可以帮助您管理和操作Kubernetes集群中的资源。 集群管理命令&#xff1a; kubectl cluster-info: 显示集群的基本信息。 kubectl config use-context &l…

Qt 5.14.2 网络编程揭秘:构建高效HTTP客户端与文件下载器

引言 在当今的软件开发世界中&#xff0c;网络通信已成为不可或缺的一部分。Qt&#xff0c;作为一个跨平台的C框架&#xff0c;为我们提供了强大的网络编程能力。本文将带你深入Qt的网络模块&#xff0c;探索如何使用QNetworkAccessManager、QNetworkRequest和QNetworkReply等核…

Qt插件之输入法插件的构建和使用(二)

文章目录 主键盘搭建Google开源引擎音节分割工具类参考项目下载搭建好各个基础控件之后,就可以开发输入法的主界面和引擎了,这也是输入法的核心。 主键盘搭建 输入法的主界面本质上是一个QStackedWidget容器,将各个类型的输入键盘插入到容器中,然后根据业务需要切换不同的…

寡姐出击!《黑寡妇2》AI电影宣传片重磅来袭

寡姐出击&#xff01;《黑寡妇2》AI电影宣传片重磅来袭 The Black Widow returns, but darkness follows her. Black Widow 2 - Secrets buried deep will rise. A web of lies and deceit threatens her very existence. In the shadows, a new enemy lurks, waiting to strik…

跨网络传输的大致过程+图解(软件虚拟层),ip地址介绍,ip地址和mac地址对比

目录 跨网络传输 引入​​​​​​​ 举例 -- 唐僧西天取经 结论 介绍 ip地址 引入 介绍 类型 公有ip 私有ip 版本 ipv4 ipv6 ip地址和mac地址的唯一性问题 数据包转发的过程 引入 思考 -- 如何跨子网 过程 图解 封装和解包 去掉差异 ip地址/协议的重要…

智慧城市如何助力疫情防控:科技赋能城市安全

目录 一、引言 二、智慧城市与疫情防控的紧密结合 三、智慧城市在疫情防控中的具体应用 1、智能监测与预警系统 2、智慧医疗与健康管理 3、智能交通与物流管理 4、智慧社区与基层防控 四、科技赋能城市安全的未来展望 五、结论 一、引言 近年来&#xff0c;全球范围内…

华为od机试C卷-开源项目热度榜单

1、题目描述 某个开源社区希望将最近热度比较高的开源项目出一个榜单&#xff0c;推荐给社区里面的开发者。 对于每个开源项目&#xff0c;开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、issue…

利用“定时执行专家”循环执行BAT、VBS、Python脚本——含参数指定功能

目录 一、软件概述 二、VBS脚本执行设置 三、触发器设置 四、功能亮点 五、总结 在自动化办公和日常计算机任务管理中&#xff0c;定时执行脚本是一项非常重要的功能。今天&#xff0c;我将为大家带来一款名为“定时执行专家”的软件的评测&#xff0c;特别是其定时执行VB…

YOLOX论文解读

paper&#xff1a;YOLOX: Exceeding YOLO Series in 2021 official implementation&#xff1a;https://github.com/Megvii-BaseDetection/YOLOX 本文的创新点 本文在YOLOv3的基础上进行了一些改进&#xff1a;包括将检测头进行解耦的decoupled head、从anchor-based转为anc…

Python使用错误总结

【1】cannot import name ‘ParameterSource’ from ‘click.core’ 其根本原因在于是black模块&#xff0c;其模块版本可能过时&#xff0c;升级black模块版本即可&#xff1a; pip install black --upgrade【2】partially initialized module ‘charset_normalizer’ has n…