加密与安全_解密AES加密中的IV和Seed

embedded/2024/12/23 7:38:55/
iv id="article_content" class="article_content clearfix">iv id="content_views" class="markdown_views prism-dracula">

iv class="toc">

文章目录

  • 概述
    • IV(Initialization Vector,初始化向量)
    • Seed(种子)
  • Code
  • 小结
iv>
在这里插入图片描述


概述

在AES加密中,**IV(Initialization Vector,初始化向量)Seed(种子)**是两个不同的概念,尽管它们都涉及到随机性和加密安全性,但用途和作用有所不同。

IV(Initialization Vector,初始化向量)

  • 用途:IV 是在加密块模式(如 CBC, CFB, OFB, 等)中使用的一个随机或伪随机的输入值。它确保相同的明文在加密时产生不同的密文,从而增强了加密的安全性。
  • 特点
    • IV 通常是一个固定长度的随机数,长度与加密算法的块大小相同(例如,对于AES,IV长度为128位,即16字节)。
    • 在加密过程中,IV 通常与明文的第一个块进行某种形式的操作(如异或)来产生第一个加密块。后续块则依赖于前一个加密块。
    • IV 不需要保密,但要确保每次加密都不相同,以防止模式分析攻击。

Seed(种子)

  • 用途:Seed 通常用于生成随机数或伪随机数。在加密算法中,随机数生成器需要一个初始值,Seed 用来设置这个初始状态,以便生成一系列的伪随机数。
  • 特点
    • Seed 可以是一个任意长度的数值,用于初始化随机数生成器(如在密钥生成、随机填充、生成IV等场景中使用)。
    • 使用相同的 Seed 初始化同一个随机数生成器,将生成相同的伪随机数序列。因此,Seed 的选取应尽量多样化和随机化,以避免生成可预测的随机数序列。

Code

seed_35">seed


import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.UUID;/*** AES 对称性加密* <p>* 需要依赖 Apache Commons Codec** @author artisan*/
public class AesUtil {/*** 加密算法类型*/static final String ALGORITHM_KEY = "AES";/*** 算法长度*/private static final int KEY_SIZE = 128;/*** 生成一个种子字符串* 该方法通过生成一个唯一标识符(UUID)来创建一个唯一的种子字符串* 使用UUID可以确保生成的种子在一定范围内具有唯一性** @return 返回一个UUID作为种子字符串*/public static String generateSeed() {return UUID.randomUUID().toString();}/*** 使用 种子(密码)、模式 创建密码加密** @param seed 种子(密码)* @param mode 模式,加密:{@link Cipher#ENCRYPT_MODE},解密:{@link Cipher#DECRYPT_MODE}* @return 返回 密码加密* @throws NoSuchAlgorithmException 算法类型异常* @throws NoSuchPaddingException   算法填充异常* @throws InvalidKeyException      无效的密钥异常*/public static Cipher cipher(String seed, int mode) throws NoSuchAlgorithmException,NoSuchPaddingException, InvalidKeyException {KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM_KEY);byte[] seedBytes = seed.getBytes();keyGenerator.init(KEY_SIZE, new SecureRandom(seedBytes));SecretKey secretKey = keyGenerator.generateKey();byte[] encodedBytes = secretKey.getEncoded();SecretKeySpec secretKeySpec = new SecretKeySpec(encodedBytes, ALGORITHM_KEY);Cipher cipher = Cipher.getInstance(ALGORITHM_KEY);cipher.init(mode, secretKeySpec);return cipher;}/*** 使用 种子(密码)将内容 加密** @param originalText 原文* @param seed         种子(密码)* @return 返回 加密结果* @throws NoSuchAlgorithmException  算法类型异常* @throws NoSuchPaddingException    算法填充异常* @throws InvalidKeyException       无效的密钥异常* @throws BadPaddingException       错误填充异常* @throws IllegalBlockSizeException 非法的块大小异常*/public static byte[] encrypt(byte[] originalText, String seed) throws NoSuchAlgorithmException, NoSuchPaddingException,InvalidKeyException, BadPaddingException, IllegalBlockSizeException {Cipher cipher = cipher(seed, Cipher.ENCRYPT_MODE);return cipher.doFinal(originalText);}/*** 使用 种子(密码)将内容 加密** @param originalText 原文* @param seed         种子(密码)* @return 返回 加密结果* @throws NoSuchAlgorithmException  算法类型异常* @throws NoSuchPaddingException    算法填充异常* @throws InvalidKeyException       无效的密钥异常* @throws BadPaddingException       错误填充异常* @throws IllegalBlockSizeException 非法的块大小异常*/public static byte[] encrypt(String originalText, String seed) throws NoSuchAlgorithmException, NoSuchPaddingException,InvalidKeyException, BadPaddingException, IllegalBlockSizeException {return encrypt(originalText.getBytes(), seed);}/*** 使用 种子(密码)将内容 加密** @param originalText 原文* @param seed         种子(密码)* @return 返回 加密结果* @throws NoSuchAlgorithmException  算法类型异常* @throws NoSuchPaddingException    算法填充异常* @throws InvalidKeyException       无效的密钥异常* @throws BadPaddingException       错误填充异常* @throws IllegalBlockSizeException 非法的块大小异常*/public static String encryptStr(String originalText, String seed) throws NoSuchAlgorithmException, NoSuchPaddingException,InvalidKeyException, BadPaddingException, IllegalBlockSizeException {byte[] encryptBytes = encrypt(originalText.getBytes(), seed);return Hex.encodeHexString(encryptBytes);}/*** 使用 种子(密码)将内容 解密** @param cipherText 密文* @param seed       种子(密码)* @return 返回 解密原文* @throws NoSuchAlgorithmException  算法类型异常* @throws NoSuchPaddingException    算法填充异常* @throws InvalidKeyException       无效的密钥异常* @throws BadPaddingException       错误填充异常* @throws IllegalBlockSizeException 非法的块大小异常*/public static byte[] decrypt(byte[] cipherText, String seed) throws NoSuchAlgorithmException, BadPaddingException,IllegalBlockSizeException, NoSuchPaddingException, InvalidKeyException {Cipher cipher = cipher(seed, Cipher.DECRYPT_MODE);return cipher.doFinal(cipherText);}/*** 使用 种子(密码)将内容 解密** @param cipherText 密文* @param seed       种子(密码)* @return 返回 解密原文* @throws NoSuchAlgorithmException  算法类型异常* @throws NoSuchPaddingException    算法填充异常* @throws InvalidKeyException       无效的密钥异常* @throws BadPaddingException       错误填充异常* @throws IllegalBlockSizeException 非法的块大小异常* @throws DecoderException          解码器异常*/public static byte[] decrypt(String cipherText, String seed) throws NoSuchAlgorithmException, BadPaddingException,IllegalBlockSizeException, NoSuchPaddingException, InvalidKeyException, DecoderException {byte[] contentBytes = Hex.decodeHex(cipherText);return decrypt(contentBytes, seed);}/*** 使用 种子(密码)将内容 解密** @param cipherText 密文* @param seed       种子(密码)* @return 返回 解密原文* @throws NoSuchAlgorithmException  算法类型异常* @throws NoSuchPaddingException    算法填充异常* @throws InvalidKeyException       无效的密钥异常* @throws BadPaddingException       错误填充异常* @throws IllegalBlockSizeException 非法的块大小异常* @throws DecoderException          解码器异常*/public static String decryptStr(String cipherText, String seed) throws NoSuchAlgorithmException, BadPaddingException,IllegalBlockSizeException, NoSuchPaddingException, InvalidKeyException, DecoderException {byte[] decryptFrom = Hex.decodeHex(cipherText);byte[] decryptBytes = decrypt(decryptFrom, seed);return new String(decryptBytes);}}

测试代码


import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.junit.jupiter.api.Test;import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;/*** AES 对称加密 测试类** @author artisan */
public class AesUtils {/*** 生成一个种子字符串* 该方法通过生成一个唯一标识符(UUID)来创建一个唯一的种子字符串* 使用UUID可以确保生成的种子在一定范围内具有唯一性** @return 返回一个UUID作为种子字符串*/public static String generateSeed() {return UUID.randomUUID().toString();}/*** 字符串加密与解密*/@Testpublic void string() throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException,NoSuchAlgorithmException, NoSuchPaddingException, DecoderException {String content = "21dsikhjihiuseiu23isdjahjsfhuahfuiashufsdajiafjihaseuihfwauisdloa'aops][sogjier";String seed =  generateSeed();System.out.println(seed.length());System.out.println("原文:" + content);System.out.println("种子(密码):" + seed);String encryptStr = Aes.encryptStr(content, seed);System.out.println("加密结果:" + encryptStr);String decryptStr = Aes.decryptStr(encryptStr, seed);System.out.println("解密结果:" + decryptStr);}/*** 字节与字符串*/@Testpublic void byteAndString() throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException,NoSuchAlgorithmException, NoSuchPaddingException, DecoderException {String content = "artisan go go go";String seed =  generateSeed();System.out.println("原文:" + content);System.out.println("种子(密码):" + seed);byte[] encryptBytes = Aes.encrypt(content, seed);String encryptStr = Hex.encodeHexString(encryptBytes);System.out.println("加密结果:" + encryptStr);byte[] decryptBytes = Aes.decrypt(encryptStr, seed);System.out.println("解密结果:" + new String(decryptBytes));}/*** 字节*/@Testpublic void bytes() throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException,NoSuchAlgorithmException, NoSuchPaddingException, DecoderException {String content = "aedksej sdksfdkhoweio (*&*^&^^^";String seed = generateSeed();System.out.println("原文:" + content);System.out.println("种子(密码):" + seed);byte[] encryptBytes = Aes.encrypt(content, seed);String encryptStr = Hex.encodeHexString(encryptBytes);System.out.println("加密结果:" + encryptStr);byte[] contentBytes = Hex.decodeHex(encryptStr);byte[] decryptBytes = Aes.decrypt(contentBytes, seed);System.out.println("解密结果:" + new String(decryptBytes));}}

在这里插入图片描述


IV

package com.artisan.shuangxiang_aesrsa;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;/*** AES工具类,提供AES加密和解密功能* 使用AES/CBC/PKCS5Padding算法进行加密和解密** @author artisan*/
public class AESUtil {/*** 定义加密算法类型为AES/CBC/PKCS5Padding*/private static final String ALGORITHM = "AES/CBC/PKCS5Padding";/*** 使用AES算法加密数据** @param data 待加密的字符串* @param key  加密使用的SecretKey* @param iv   加密使用的初始化向量(IvParameterSpec)* @return 加密后的字符串,以Base64编码* @throws Exception 如果加密过程中发生错误,抛出异常*/public static String encryptAES(String data, SecretKey key, IvParameterSpec iv) throws Exception {// 创建Cipher实例,指定使用AES/CBC/PKCS5Padding算法Cipher cipher = Cipher.getInstance(ALGORITHM);// 初始化Cipher为加密模式,传入密钥和初始化向量cipher.init(Cipher.ENCRYPT_MODE, key, iv);// 将待加密数据转换为字节数组,并执行加密操作byte[] encryptedData = cipher.doFinal(data.getBytes());// 将加密后的数据使用Base64编码,并返回return Base64.getEncoder().encodeToString(encryptedData);}/*** 使用AES算法解密数据** @param encryptedData 待解密的字符串,以Base64编码* @param key           解密使用的SecretKey* @param iv            解密使用的初始化向量(IvParameterSpec)* @return 解密后的字符串* @throws Exception 如果解密过程中发生错误,抛出异常*/public static String decryptAES(String encryptedData, SecretKey key, IvParameterSpec iv) throws Exception {// 创建Cipher实例,指定使用AES/CBC/PKCS5Padding算法Cipher cipher = Cipher.getInstance(ALGORITHM);// 初始化Cipher为解密模式,传入密钥和初始化向量cipher.init(Cipher.DECRYPT_MODE, key, iv);// 将待解密数据从Base64解码为字节数组byte[] decodedData = Base64.getDecoder().decode(encryptedData);// 执行解密操作byte[] decryptedData = cipher.doFinal(decodedData);// 将解密后的数据转换为字符串,并返回return new String(decryptedData);}
}

测试代码

package com.artisan.shuangxiang_aesrsa;import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;/*** @author artisan*/
public class Main_OnlyAES {/*** 使用RSA公钥加密AES密钥,以及使用RSA私钥解密AES密钥的全过程* 同时展示了使用AES密钥加密和解密数据的应用** @param args 命令行参数* @throws Exception 可能抛出的异常*/public static void main(String[] args) throws Exception {// 生成AES和RSA密钥SecretKey aesKey = KeyGeneration.generateAESKey();String aesKeyString = Base64.getEncoder().encodeToString(aesKey.getEncoded());System.out.println("AES密钥: " + aesKeyString);// 初始化IV(通常需要确保IV的安全传输)  16字节的IV向量IvParameterSpec iv = new IvParameterSpec(new byte[16]);// 使用AES加密和解密数据String originalData = "我是需要加密的数据artisan GO GO GO !!!";String encryptedData = AESUtil.encryptAES(originalData, aesKey, iv);System.out.println("加密的数据: " + encryptedData);String decryptedData = AESUtil.decryptAES(encryptedData, aesKey, iv);System.out.println("解密的数据: " + decryptedData);}
}

在这里插入图片描述

小结

  • IV 是加密过程的一部分,用于确保相同的明文在加密时能产生不同的密文,从而提高安全性。
  • Seed 则是用于初始化随机数生成器,以生成伪随机数,这些伪随机数可以用于生成IV、密钥等。

虽然IV有时可以通过随机数生成器来生成,这个随机数生成器可能使用Seed作为其输入,但它们的概念和用途是不同的。

在这里插入图片描述

iv>
iv>iv id="treeSkill">iv>

http://www.ppmy.cn/embedded/100567.html

相关文章

pwm子系统

一、系统框架 内核的PWM core&#xff0c;向下对实际pwm控制器驱动&#xff0c;提供了pwm_chip,soc厂商编程控制器驱动&#xff0c;只需注册结构体&#xff0c;配置好private_data&#xff0c;实例化pwm_ops操作&#xff0c;编写具体函数即可。 向上为其他驱动调用提供了统一的…

【YOLO家族】Scaled-YOLOv4, Optimal Speed and Accuracy of Object Detection,CVPR 2021

资源 论文题目《YOLOv4: Optimal Speed and Accuracy of Object Detection》 论文地址&#xff1a;https://arxiv.org/abs/2004.10934 论文代码&#xff1a;https://github.com/AlexeyAB/darknet 作者&#xff1a;AlexeyAB 论文链接&#xff1a;https://arxiv.org/pdf/2004.10…

如何使用ssm实现在线作业管理系统的设计与实现+vue

TOC ssm182在线作业管理系统的设计与实现vue 绪论 1.1 选题背景 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。计算机软件可以针对不同行业的营业特…

PHP进阶篇(奇怪的知识又增加了)

这里的知识不太正经哦 但用好了很实用 哈哈 对象和数组的调用 对象&#xff1a;$object->属性名 $object->方法名() 数组&#xff1a;$array[下标名] 这里都理解 但开发需要注意有些地方会产生调用错误 尤其框架model方法处 有的是数组有的是对象 直接返回前端看起…

学习前端面试知识(15)

防抖和节流怎么实现&#xff1f; 参考文章 彻底理清防抖和节流 防抖和节流都是用于控制函数执行频率的方法&#xff0c;防抖是在一定时间内只执行最后一次操作&#xff0c;节流是在一定时间内只执行一次操作&#xff0c;可以通过setTimeout和时间戳等方法实现。 防抖&#x…

王树森《搜索引擎技术》- 课程笔记

课程合集&#xff1a;ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频 (bilibili.com) 课件地址&#xff1a;GitHub - wangshusen/SearchEngine: 搜索引擎原理 目录 概要 1、搜索引擎的基本概念 曝光和点击 垂搜vs通搜 课程安排 2、决定搜索满意度的因素&#…

克服编程挫折:从Bug的迷宫中寻找出口与面对算法保持冷静的策略

在编程学习的道路上&#xff0c;挫折感无疑是每个学习者都必须面对的挑战之一。它们仿佛是一座座高墙&#xff0c;阻挡我们前进的步伐。然而&#xff0c;正如许多有经验的编程高手所证明的那样&#xff0c;挫折并不是终点&#xff0c;而是成长和进步的催化剂。本文将分享一些有…

polarctf靶场[WEB]Don‘t touch me、机器人、uploader、扫扫看

目录 [web]Dont touch me 考点&#xff1a;查看源代码、前端 [web]机器人 考点&#xff1a;robot协议 工具&#xff1a;御剑&#xff0c;kali dirsearch [web]覆盖 考点&#xff1a;parse_str覆盖 [web]扫扫看 考点&#xff1a;目录扫描 工具&#xff1a;御剑、kali d…