首页 > 编程语言 >AES算法

AES算法

时间:2024-07-22 17:22:30浏览次数:15  
标签:AES 加密 String 算法 密文 new

介绍

AES(高级加密标准,Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由比利时密码学家Vincent Rijmen和Joan Daemen设计,他们设计的算法最初被称为Rijndael。AES于2001年被美国国家标准与技术研究院(NIST)选为官方的加密标准,用以取代旧的DES标准。

以下是AES算法的一些关键特性:

  • 对称密钥:AES是一种对称密钥加密算法,这意味着加密和解密过程使用相同的密钥。
  • 密钥长度:AES支持三种密钥长度,分别是128位、192位和256位,分别对应AES-128、AES-192和AES-256。
  • 块大小:AES使用固定大小的块加密数据,块大小为128位。
  • 安全性:AES被认为是非常安全的加密算法,目前没有已知的有效的攻击方法可以快速破解AES加密。
  • 性能:AES算法设计时考虑了性能,它在多种硬件和软件平台上都能高效运行。
  • 模式:AES可以与不同的工作模式结合使用,以适应不同的安全需求。常见的工作模式包括ECB(电子密码本模式)、CBC(密码块链接模式)、CTR(计数器模式)等。
  • 填充:由于AES是块加密算法,它需要处理固定大小的数据块。如果数据不是块大小的整数倍,就需要使用填充(padding)机制来确保数据能够被正确加密。常见的填充方式包括PKCS#7和零填充。
  • 应用广泛:AES被广泛应用于各种安全领域,包括无线通信、安全协议、文件加密等。
  • 实现:AES算法的实现可以在软件和硬件中找到,许多编程语言和库都提供了AES加密的实现。
    AES算法的加密和解密过程都包括多个轮次的变换,每一轮都涉及一系列复杂的操作,如字节代换(Substitution)、行移位(ShiftRow)、列混淆(MixColumn)和轮密钥加(AddRoundKey)。在最后一轮中,除了AddRoundKey之外,不包括MixColumn步骤。由于AES的高安全性和效率,它已成为全球范围内加密通信和数据保护的首选算法之一。

Java实现AES加解密

public class AesUtil {

    /**
     * 加密/解密算法名称
     */
    private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
    /**
     * 秘钥算法
     */
    private static final String KEY_ALGORITHM = "AES";


    /**
     * 数据加密: 明文 -> 密文
     */
    public static String encrypt(String plainString, String key, String ivs) {
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            SecretKey secKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, secKey, new IvParameterSpec(ivs.getBytes()));
            // 加密数据, 返回密文,使用base64编码密文byte数组,返回密文字符串
            return new String(Base64.getEncoder().encode(cipher.doFinal(plainString.getBytes(StandardCharsets.UTF_8))));
        } catch (InvalidAlgorithmParameterException | NoSuchPaddingException | IllegalBlockSizeException |
                 NoSuchAlgorithmException | BadPaddingException | InvalidKeyException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 数据解密: 密文 -> 明文
     */
    public static String decrypt(String cipherString, String key, String ivs) {
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            SecretKey secKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, secKey, new IvParameterSpec(ivs.getBytes()));
            // 解密数据, 返回明文,对base64编码的密文解码成密文byte数组,再使用AES解码
            byte[] plainBytes = cipher.doFinal(Base64.getDecoder().decode(cipherString));
            return new String(plainBytes);
        } catch (InvalidAlgorithmParameterException | IllegalBlockSizeException | NoSuchPaddingException |
                 NoSuchAlgorithmException | BadPaddingException | InvalidKeyException e) {
            throw new RuntimeException(e);
        }
    }
}

标签:AES,加密,String,算法,密文,new
From: https://www.cnblogs.com/jiayuan2006/p/18316460

相关文章

  • 【动态规划】【官解+整洁度优化+状态压缩-空间优化算法】力扣198.打家劫舍
    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜......
  • Aquila优化算法(基本原理+matlab源代码)—— 基于Aquila Optimizer原始论文分析
    Matlab源代码位于:AquilaOptimizer:Ameta-heuristicoptimizationalgorithm-FileExchange-MATLABCentral(mathworks.cn)1Aquila优化算法AO是一种基于种群优化方法,受启发于Aquila捕获猎物的方式。Aquila捕获猎物的方式主要有四种:(1)有垂直弯曲的高空翱翔(2)用短滑翔攻......
  • 常见的排序算法——堆排序(五)
    本文记述了堆排序改用前序表示法基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想堆排序算法按照层次操作堆中的元素,即物理位置k的节点与位置2k或2k+1的节点交换。然而用前序表示的堆,其父子节点的位置关系不能简单地计算出来。因此,当算法......
  • 代码随想录算法训练营第17天 | 复习二叉搜索树
    2024年7月19日题654.最大二叉树熟练运用递归即可classSolution{publicTreeNodeconstructMaximumBinaryTree(int[]nums){intmaxNum=Integer.MIN_VALUE;intflag=-1;for(inti=0;i<nums.length;i++){if(nums[i]>maxNum){......
  • 「代码随想录算法训练营」第十七天 | 二叉树 part7
    235.二叉搜索树的最近公共祖先题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/题目难度:中等文章讲解:https://programmercarl.com/0235.二叉搜索树的最近公共祖先.html视频讲解:https://www.bilibili.com/video/BV1Zt4y1F7ww?share_so......
  • 二分查找算法基础
    一.二分查找二分查找,又叫“折中查找”,其通过问题的性质,每次将问题规模缩小一半,对应的时间复杂度为O(logN)。二分查找不仅能用作数组元素的查找,还可用于单调函数的求解。对于二分查找算法,它包含head(头指针),tail(尾指针), mid三个变量,这里的头尾指针其实并不是指针,一般为整型,表......
  • 代码随想录算法训练营第十一天| 144. 二叉树的前序遍历 , 94. 二叉树的中序遍历, 145.二
    今天主要学习了二叉树的基本概念,以及多种遍历方法。包含分别使用迭代思想和递归思想的前序遍历,中序遍历,后序遍历以及层次遍历。二叉树的基础知识二叉树二叉树的种类可以分为满二叉树和完全二叉树。满二叉树指的是一个二叉树仅包含度为0和度为2的结点,并且度为0的节点在同一层......
  • 推式子——拓展欧几里德算法exgcd
    试求方程\(ax+by=\gcd(a,b)\)的一组整数解,其中\(a\)和\(b\)是给定的数提前准备好一个式子:辗转相除法\[\gcd(a,b)=\gcd(b,a\bmodb)\]同时我们可以注意到,\(\bmod\)的等价版本:\[a\bmodb=a-b\lfloor\frac{a}{b}\rfloor\]开始推式子首先考虑\(b=0\)的情况,因为......
  • 代码随想录算法训练营第一天leetcode704二分查找27移除元素
    leetcode704,这是leetcode提交四次后通过的结果:classSolution{  publicintsearch(int[]nums,inttarget){    if(nums.length==1&&nums[0]==target)      return 0;    if(nums.length==2)      if(nums[0]==target)......
  • C语言-常用算法-23
     题目:分数计算器程序源代码:#include<stdio.h>intgys(intx,inty){returny?gys(y,x%y):x;}intgbs(intx,inty){returnx/gys(x,y)*y;}voidyuefen(intfz,intfm){ints=gys(fz,fm);fz/=s;fm/=s;printf("结果是:%d/%d&quo......