AES加密中的CBC和ECB

2024-02-11 06:12
文章标签 aes 加密 ecb cbc

本文主要是介绍AES加密中的CBC和ECB,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.说明

2.ECB模式(base64)

3.CBC模式


1.说明

AES是常见的对称加密算法,加密和解密使用相同的密钥,流程如下:

主要概念如下:

①明文

②密钥

用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过加密算法(如非对称加密或者md5加密等)加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。

③加密函数

将明文,密钥及IV变量作为参数,生成加密后的密文,有的加密模式没有IV变量

④解密函数

将密文,密钥及IV变量作为参数,生成解密后的明文,有的加密模式没有IV变量

⑤密文

2.加密模式的组成

①密钥长度

分为AES128,AES192,AES256。

AES128:要求密钥长度为16个字节,分为四行四列的矩阵。

AES192:要求密钥长度为24个字节,分为四行六列的矩阵。

AES256:要求密钥长度为32个字节,分为四行八列的矩阵。

②加密模式

ECB,CBC,CFB,OFB,CTR,CCM,GCM,XTS

③填充模式

 AES加密是以16个字节为一组进行分组加密,要求明文的长度一定是16个字节的整数倍,如果不够16个字节的倍数,需要按照填充模式进行填充。填充模式如下:

NONE:不填充,要求明文长度必须是16个字节的整数倍。

PKCS7:缺多少就补充多少个字节数量。

ZERO:缺多少就补充多少个字节的0。

ANSI923:最后一个字节填充缺少的数量,其他字节填充0。

ISO7816_4:填充的第一个字节为16进制的0x80,其他字节填充0。

ISO10126:最后一个字节填充缺少的数量,其他字节填充随机数。

注意:当明文长度已经是16个字节的整数倍时,当填充模式为NONE以外的模式时,也会进行填充,填充16个16。

2.ECB模式(base64)

加密执行流程:

(1)前端加密及解密

①引入依赖

npm install crypto-js 

②加密及解密的工具类

import CryptoJS from 'crypto-js'// ECB模式
export function Encrypt(word,key) {let srcs = CryptoJS.enc.Utf8.parse(word);let keyInfo = CryptoJS.enc.Utf8.parse(key);let encrypted = CryptoJS.AES.encrypt(srcs, keyInfo, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7})
//返回base64格式的加密结果return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}export function Decrypt(word,key) {let keyInfo = CryptoJS.enc.Utf8.parse(key);let base64 = CryptoJS.enc.Base64.parse(word);let srcs = CryptoJS.enc.Base64.stringify(base64);const decrypt = CryptoJS.AES.decrypt(srcs, keyInfo, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);return decryptedStr;
}

密钥长度必须是16个字节,24个字节或者32个字节,如果不是,可以进行加密,但是不能进行解密。

前端填充方式:

        /*** Padding namespace.*/export namespace pad {/*** PKCS #5/7 padding strategy.*/const Pkcs7: Padding;/*** ANSI X.923 padding strategy.*/const AnsiX923: Padding;/*** ISO 10126 padding strategy.*/const Iso10126: Padding;/*** ISO/IEC 9797-1 Padding Method 2.*/const Iso97971: Padding;/*** Zero padding strategy.*/const ZeroPadding: Padding;/*** A noop padding strategy.*/const NoPadding: Padding;}

(2)后端加密及解密

①引入依赖

        <dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version></dependency>

②后端加密及解密工具类

package com.example.utils;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;/*** ECB加解密工具类*/
public class AesTool {private static String ALGO = "AES";private static byte[] keyValue = "TD2g45EfXqGnBLaXpzPZ6A==".getBytes();/*** <p>description: 加密</p >* <p>param: [Data] </p >* <p>return: java.lang.String </p >* <p>author: zhangcj </p >* <p>date: 2021/12/29 </p >*/public static String encrypt(String data) {try {Key key = generateKey();Cipher c = Cipher.getInstance(ALGO);c.init(1, key);byte[] encVal = c.doFinal(data.getBytes());String encryptedValue = Base64.encodeBase64String(encVal);return encryptedValue;} catch (Exception var5) {throw new RuntimeException(var5);}}// public static String decrypt(String encryptedData, String keyValue) {//     try {//         Key key = generateKey(keyValue);//         Cipher c = Cipher.getInstance(ALGO);//         c.init(2, key);//         byte[] decordedValue = Base64.decodeBase64(encryptedData);//         byte[] decValue = c.doFinal(decordedValue);//         String decryptedValue = new String(decValue);//         return decryptedValue;//     } catch (Exception var6) {//         throw new RuntimeException(var6);//     }// }public static String decrypt(String content,String password) throws Exception {byte[] contentNew = Base64.decodeBase64(content);SecretKeySpec skeySpec = new SecretKeySpec(password.getBytes("UTF-8"), "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // "算法/模式/补码方式"cipher.init(Cipher.DECRYPT_MODE, skeySpec);return new String(cipher.doFinal(contentNew));}private static Key generateKey() throws Exception {Key key = new SecretKeySpec(keyValue, ALGO);return key;}private static Key generateKey(String key) throws Exception {return new SecretKeySpec(key.getBytes(), ALGO);}
}

③调用方式

        String decrypt = AesTool.decrypt("D5DT/9wwi89s0ny9VYwMTA==", "5bzMeuzs2XQfG8QFyx1hGg==");System.out.println(decrypt);

(3)说明

 ECB模式加密,将明文及密钥通过CryptoJS.enc.Utf8.parse进行转换,将UTF8编码的字符串转换为字节数组,然后加密模式及填充方式,最后生成密文。

密文分为两种格式,一种是base64,另一种是hex。

前端加密之后,后端进行解密时,首先根据前端的密文格式,将密文转换成字节数组,再设置和前端一致的模式和补充方式进行解密。

ECB模式加密安全性较低,但性能很高,相同的明文段加密后的密文一致。

前端加密需要的密钥可以由后端生成,生成方式如下:

        // 方式1KeyGenerator keyGen = KeyGenerator.getInstance("AES");keyGen.init(128);SecretKey secretKey = keyGen.generateKey();byte[] keyBytes = secretKey.getEncoded();String key = Base64.getEncoder().encodeToString(keyBytes);System.out.println(key);// 方式2SecureRandom secureRandom = new SecureRandom();KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128, secureRandom);byte[] key2 = keyGenerator.generateKey().getEncoded();String base64Key = java.util.Base64.getEncoder().encodeToString(key2);System.out.println(base64Key);

主要分为两步:生成一个随机的AES密钥;将密钥已base64编码的形式保存或传输。

3.CBC模式

(1)前端加密及解密

①引入依赖

npm install crypto-js 

②加密及解密工具类

import CryptoJS from 'crypto-js'// CBC模式
export function Encrypt1(word,key,iv) {let srcs = CryptoJS.enc.Utf8.parse(word);let keyInfo = CryptoJS.enc.Utf8.parse(key);let ivInfo = CryptoJS.enc.Utf8.parse(iv);let encrypted = CryptoJS.AES.encrypt(srcs, keyInfo, {iv: ivInfo ,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7})return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}
export function Decrypt1(word,key,iv) {let keyInfo = CryptoJS.enc.Utf8.parse(key);let ivInfo = CryptoJS.enc.Utf8.parse(iv);let base64  = CryptoJS.enc.Base64.parse(word);let srcs = CryptoJS.enc.Base64.stringify(base64);const decrypt = CryptoJS.AES.decrypt(srcs, keyInfo, {iv: ivInfo ,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);return decryptedStr;
}

 (2)后端加密及解密

①引入依赖

        <dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version></dependency>

②加密及解密工具类

package com.example.utils;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;/*** @Author linaibo* @Date 2024/2/7 15:53* CBC加解密工具* @Version 1.0*/public class AexCbcTool {// public static String decryptAES(String content,String key, String ivInfo) throws Exception {//     SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("ASCII"), "AES");//     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//     IvParameterSpec iv = new IvParameterSpec(ivInfo.getBytes());//     cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);//     byte[] encrypted1 = Base64.decodeBase64(content);//先用bAES64解密//     return new String(cipher.doFinal(encrypted1));// }/*** 解密** @param enc       加密内容* @param uniqueKey 唯一key* @return*/public static String decrypt(String enc, String uniqueKey, String iv) throws Exception {byte[] key = uniqueKey.getBytes();SecretKey secretKey = new SecretKeySpec(key, "AES");IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8"));Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);byte[] encrypted1 = Base64.decodeBase64(enc);//先用bAES64解密byte[] plainBytes = cipher.doFinal(encrypted1);return new String(plainBytes, "UTF-8");}/*** 加密** @param src* @param uniqueKey* @return*/public static String encrypt(String src, String uniqueKey, String iv) throws Exception {byte[] key = uniqueKey.getBytes();SecretKey secretKey = new SecretKeySpec(key, "AES");IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8"));Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);byte[] cipherBytes = cipher.doFinal(src.getBytes("UTF-8"));String encryptedValue = Base64.encodeBase64String(cipherBytes);return encryptedValue;}}

https://blog.51cto.com/u_16175526/7323980

AES算法的CBC和ECB两种工作模式_aes iv需要保密吗-CSDN博客

AES加解密模式_aes_cbc_encrypt-CSDN博客

AES解密报错Invalid AES key length: xx bytes与Given final block not properly padded的解决方法-CSDN博客

这篇关于AES加密中的CBC和ECB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699029

相关文章

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

3.比 HTTP 更安全的 HTTPS(工作原理理解、非对称加密理解、证书理解)

所谓的协议 协议只是一种规则,你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则,任何人都可以定协议 我们不需要太了解细节,这些制定和完善协议的人去做的,我们只需要知道协议的一个大概 HTTPS 协议 1、概述 HTTPS(Hypertext Transfer Protocol Secure)是一种安全的超文本传输协议,主要用于在客户端和服务器之间安全地传输数据

ja-netfilter的前世今生和非对称加密的欺骗原理

文章目录 ja-netfilter起源官网插件插件配置文件插件的综合应用更多用法 非对称加密欺骗原理非对称加密和数字证书激活过程和欺骗手段分析代码示例第一步:生成自签名证书脚本第二步:使用自签名证书对产品激活信息进行签名 样例数据样例激活码(注:用于代码演示,直接粘贴到JetBrains 家 IDE 中无法完成激活!不用试,肯定提示无效,无法激活!!)样例power.conf(配合ja-ne

Linux加密框架设计与实现

本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:原文作者是独孤九贱大佬 原文地址:http://bbs.chinaunix.net/thread-3627341-1-1.html

Android的登陆MD5加密

1:导入代码 public class MD5Util {private static final String TAG = "MD5Util";/**** MD5加码 生成32位md5码*/public static String string2MD5(String inStr) {Log.e(TAG, "string2MD5: -------------------------");Mess

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

如何实现加密功能

文章目录 1. 概念介绍2. 方法与功能2.1 基本用法2.2 加密算法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"FlutterCacheManager组件"相关的内容,本章回中将介绍一个加密工具包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 加密主要是为了保护一些重要数据,我们在实际项目中会用到加密工具,因此在本章回中介绍一个加密工具

详解BitLocker模式及加密数据和解密方法及无法访问解决之道

BitLocker主要有两种工作模式:TPM模式和U盘模式,同时为了实现更高程度的安全,我们还可以同时启用这两种模式。 BitLocker 自动设备加密在全新安装体验 (OOBE) 期间启动。 但是,只有在用户使用 Microsoft 帐户或 Azure Active Directory 帐户登录后,才会启用(提供)保护。 在此之前,保护已暂停,数据不受保护。 使用本地帐户不会启用 BitLoc

加密方式的判断---神器 hash_identifier

加密作为保障数据安全的一种方式,它不是现在才有的,它产生的历史相当久远,它是起源于要追溯于公元前2000年(几个世纪了),虽然它不是现在我们所讲的加密技术(甚至不叫加密),但作为一种加密的概念,确实早在几个世纪前就诞生了。当时埃及人是最先使用特别的象形文字作为信息编码的,随着时间推移,巴比伦、美索不达米亚和希腊文明都开始使用一些方法来保护他们的书面信息。 加密在网络上的作用就是防止有用或私有

RC4加密解密算法123

RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码。 RC4是流密码streamcipher中的一种,为序列密码。RC4加密算法是Ron Rivest在1987年设计出的密钥长度可变的加密算法簇。起初该算法是商业机密,直到1994年,它才公诸于众。由于RC4具有算法简单,运算速度快,软硬件实现都