基于Cipher的Java加密工具类

一、什么是Cipher

        Cipher是一种用于加密和解密信息的算法或方法。它将原始的明文转化为密文,从而保护信息的安全性和机密性。使用密码学中的数学原理和技术,Cipher可以对数据进行加密处理,使其在传输或存储过程中对未授权的访问者不可读。在必要时,只有具有正确密钥或密码的人才能解密并获取原始的明文信息。

        Cipher可以分为对称加密和非对称加密两种类型。对称加密使用相同的密钥进行加密和解密,速度较快,但密钥管理较为复杂。而非对称加密使用一对密钥,私钥用于解密,公钥用于加密,在安全性上更加可靠,但运算速度较慢。

        实际应用中,Cipher被广泛应用于保护敏感数据的传输,如网上银行、电子商务、密码学通信等领域。通过使用Cipher,可以保护个人隐私、防止信息被窃取或篡改,提高数据的安全性和机密性。

二、Java中的Cipher类

       在Java中,Cipher是一个提供加密和解密功能的类。它位于javax.crypto包下,用于实现各种加密算法。Cipher类可以用于对数据进行加密和解密操作,同时还可以进行数字签名和验签。

代码示例:

package com.blockchain.qgy.demo.cipherdemo;import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.util.Arrays;
import java.util.Random;public class CipherDemo {public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {//密钥StringBuilder sb = new StringBuilder("QGY");while(sb.length() < 8) {sb.append((char)new Random().nextInt(128));}byte[] keyBytes = sb.toString().getBytes();//生成密钥SecretKey key = new SecretKeySpec(keyBytes,"DES");System.out.println("密钥:"+key);Cipher instance = Cipher.getInstance("DES");System.out.println("初始化Cipher对象");instance.init(Cipher.ENCRYPT_MODE,key);System.out.println("Cipher对象:"+instance);Provider provider = instance.getProvider();System.out.println("Cipher对象提供者:"+provider);String algorithm = instance.getAlgorithm();System.out.println("Cipher对象的算法名称:"+algorithm);int blockSize = instance.getBlockSize();System.out.println("返回块的大小:"+blockSize);byte[] iv = instance.getIV();System.out.println("返回新缓冲区的初始化向量:"+iv);AlgorithmParameters parameters = instance.getParameters();System.out.println("返回Cipher使用的参数:"+parameters);ExemptionMechanism exemptionMechanism = instance.getExemptionMechanism();System.out.println("Cipher使用的豁免机制对象:"+exemptionMechanism);byte[] bytes = instance.doFinal(new byte[]{'Q', 'G', 'Y'});System.out.println("bytes:"+Arrays.toString(bytes));System.out.println("bytes->update:"+Arrays.toString(instance.update(bytes)));}
}

上面是一个Cipher类加密的简单示例,在Cipher类中常用的常量字段有7个:

  1. public static final int ENCRYPT MODE:用于将 Cipher 初始化为加密模式的常量。
  2. public static final int DECRYPT MODE:用于将 Cipher 初始化为解密模式的常量。
  3. public static fnal int WRAP MODE:用于将 Cipher 初始化为密钥包装模式的常量。
  4. public static finalint UNWRAP MODE:用于将 Cipher 初始化为密钥解包模式的常量。
  5. public static final int PUBLIC KEY:用于表示要解包的密钥为“公钥”的常量。
  6. public static final int PRIVATE KEY:用于表示要解包的密钥为“私钥”的常量。
  7. public static final intSECRET KEY:用于表示要解包的密钥为“秘密密钥”的常量。

三、封装好的加密工具类

加密工具类:

package com.blockchain.qgy.util;import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;/*** 基于Cipher实现的加密和解密工具类** @author QGY**/
public class DeEnCoderCipherUtil {//加密、解密模式,即加密算法名称private final static String CIPHER_MODE = "DES";//DES密钥private static String DEFAULT_DES_KEY = "主播主播,你的MD5加密确实很强,但还是太吃操作了,有没有更加简单和强势的加密工具推荐一下,有的兄弟,有的,这就是当前版本T0.5的强势加密算法";/*** 不允许创建对象*/private DeEnCoderCipherUtil(){}/*** function 字符串加密方法** @param plaintext:要加密的字符串* @param key:密钥* @return 加密后的字符串*/public static String getCipherText(String plaintext,String key){//判断入参是否正确if(Strings.isNullOrEmpty(plaintext) || Strings.isNullOrEmpty(key)) return null;try{byte[] cipherText = getCipherText(plaintext.getBytes(), key.getBytes());return new BASE64Encoder().encode(cipherText);} catch (Exception e){e.printStackTrace();}return null;}/*** function 字节加密方法** @param plaintext:要加密的字节* @param key:密钥* @return 加密后的字节*/private static byte[] getCipherText(byte[] plaintext,byte[] key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {//1.生成随机数SecureRandom random = new SecureRandom();//2.基于密钥数据创建DESKeySpec对象DESKeySpec desKeySpec = new DESKeySpec(key);//3.创建密钥工厂,将DESKeySpec转换成SecretKey对象来保存对称密钥SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(CIPHER_MODE);SecretKey secretKey = keyFactory.generateSecret(desKeySpec);//4.Cipher对象进行加密Cipher cipher = Cipher.getInstance(CIPHER_MODE);//5.初始化Cipher对象cipher.init(Cipher.ENCRYPT_MODE,secretKey,random);//返回密文return cipher.doFinal(plaintext);}public static String getPlainText(String cipherText,String key){//判断入参if(Strings.isNullOrEmpty(cipherText) ||  Strings.isNullOrEmpty(key)) return null;try{BASE64Decoder decoder = new BASE64Decoder();return new String(getPlainText(decoder.decodeBuffer(cipherText),key.getBytes()));}catch (Exception e) {e.printStackTrace();}return null;}private static byte[] getPlainText(byte[] cipherText,byte[] key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {//1.生成随机数SecureRandom random = new SecureRandom();//2.基于密钥数据创建DESKeySpec对象DESKeySpec desKeySpec = new DESKeySpec(key);//3.创建密钥工厂,将DESKeySpec转换成SecretKey对象来保存对称密钥SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(CIPHER_MODE);SecretKey secretKey = keyFactory.generateSecret(desKeySpec);//4.Cipher对象进行解密Cipher cipher = Cipher.getInstance(CIPHER_MODE);//5.初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE,secretKey,random);//返回明文return cipher.doFinal(cipherText);}
}

strings工具类:

package com.blockchain.qgy.util;import java.util.Objects;/*** 字符串工具类** @author QGY**/
public class Strings {/*** 判断字符串是否为空或null** @param string* @return 布尔值*/public static Boolean isNullOrEmpty(String string){if (Objects.isNull(string)) return true;if (string.isEmpty()) return true;return false;}
}

注意:这里密钥的长度为8,如果有其他需求可以通过进一步封装达到自身需求 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ ——— 仿函数

目录 何为仿函数 仿函数和模板的配合使用 何为仿函数 代码演示&#xff1a; class Add { public:int operator()(int x, int y){return x y;} }; 这是一个 Add 类&#xff0c;类里面有一个公有成员函数重载&#xff0c;重载的是括号 那么调用的时候&#xff1a; Add ad…

Charles 4.6.7 浏览器网络调试指南:流量过滤与分析(六)

1. 概述 在网络调试和优化过程中&#xff0c;Charles 不仅可以实现简单的网络抓包操作&#xff0c;还支持更高级的抓包技巧和流量分析功能。这些功能能够帮助开发者深入挖掘网络请求的细节&#xff0c;为复杂问题提供有效的解决方案。本文将重点讲解 Charles 的过滤规则、自定…

Haproxy入门学习二

一、Haproxy的算法 1.haproxy通过固定参数balance指明对后端服务器的调度算法&#xff0c;其中balance参数可以配置在listen或backend选项中 2.haproxy的调度算法分为静态和动态调度算法&#xff0c;其中有些算法可以根据参数在静态和动态算法中相互转换 3.静态算法&#xff1a…

程序地址空间

程序地址空间回顾&#xff08;这真的是吗&#xff1f;&#xff09; 我们之前学习C/C的时候是否听过&#xff1a;对于自己的C/C程序&#xff0c;我们默认认为自己的内存地址空间是&#xff1a; 代码区&#xff08;Text Segment&#xff09;&#xff1a;存放程序的机器指令代码&…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.21 索引宗师:布尔索引的七重境界

1.21 索引宗师&#xff1a;布尔索引的七重境界 目录 #mermaid-svg-Iojpgw5hl0Ptb9Ti {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Iojpgw5hl0Ptb9Ti .error-icon{fill:#552222;}#mermaid-svg-Iojpgw5hl0Ptb9Ti .…

nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

一、安装nvm 1. 下载nvm 点击 网盘下载 进行下载 2、双击下载好的 nvm-1.1.12-setup.zip 文件 3.双击 nvm-setup.exe 开始安装 4. 选择我接受&#xff0c;然后点击next 5.选择nvm安装路径&#xff0c;路径名称不要有空格&#xff0c;然后点击next 6.node.js安装路径&#…

【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)

1. 简介 柱状图作为科研论文中常用的实验结果对比图&#xff0c;本文采用了3组实验对比的效果展示图&#xff0c;代码已调试好&#xff0c;只需替换数据即可生成相关柱状图&#xff0c;为科研加分。通过获得Nature配色的柱状图&#xff0c;让你的论文看起来档次更高&#xff0…

CTFSHOW-WEB入门-命令执行29-32

题目&#xff1a;web 29 题目&#xff1a;解题思路&#xff1a;分析代码&#xff1a; error_reporting(0); if(isset($_GET[c])){//get一个c的参数$c $_GET[c];//赋值给Cif(!preg_match("/flag/i", $c)){eval($c);//if C变量里面没有flag&#xff0c;那么就执行C…

【以音频软件FFmpeg为例】通过Python脚本将软件路径添加到Windows系统环境变量中的实现与原理分析

在Windows系统中&#xff0c;你可以通过修改环境变量 PATH 来使得 ffmpeg.exe 可在任意路径下直接使用。要通过Python修改环境变量并立即生效&#xff0c;如图&#xff1a; 你可以使用以下代码&#xff1a; import os import winreg as reg# ffmpeg.exe的路径 ffmpeg_path …

LCR 139.训练计划 I

目录 题目过程解法双指针法&#xff08;两端开始&#xff09;快慢指针 题目 教练使用整数数组 actions 记录一系列核心肌群训练项目编号。为增强训练趣味性&#xff0c;需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组 形式返回。 过…

《多阶段渐进式图像修复》学习笔记

paper&#xff1a;2102.02808 GitHub&#xff1a;swz30/MPRNet: [CVPR 2021] Multi-Stage Progressive Image Restoration. SOTA results for Image deblurring, deraining, and denoising. 目录 摘要 1、介绍 2、相关工作 2.1 单阶段方法 2.2 多阶段方法 2.3 注意力机…

21.2-工程中添加FreeRTOS(掌握) 用STM32CubeMX添加FreeRTOS

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 **V3:HAL库开发、手把手教学下面功能&#xff1a;PID速度控制、PID循迹、PID跟随、遥控、…

gitee——报错修改本地密码

有时候当我们向远端push本地的仓库时会有一些报错的行为。 如下&#xff1a; 这是因为我们在gitee修改了密码时&#xff0c;本地还没有更新提交&#xff0c;总是报错 解决修改密码报错 如下&#xff1a; 1.在本地点击搜索栏找到控制面板 步骤如下

联想Y7000+RTX4060+i7+Ubuntu22.04运行DeepSeek开源多模态大模型Janus-Pro-1B+本地部署

直接上手搓了&#xff1a; conda create -n myenv python3.10 -ygit clone https://github.com/deepseek-ai/Janus.gitcd Januspip install -e .pip install webencodings beautifulsoup4 tinycss2pip install -e .[gradio]pip install pexpect>4.3python demo/app_januspr…

批量卸载fnm中已经安装的所有版本

直接上代码 fnm list | awk -F NR>1 {print line} {line$2} | xargs -n 1 -I {} fnm uninstall {}原理 fnm list 列出 fnm 中所有已经安装的 node 版本 awk -F NR>1 {print line} {line$2} 以空格分隔-F {line$2}&#xff0c;取从左到右第 2 段&#xff08;v22.11…

(done) MIT6.S081 2023 学习笔记 (Day6: LAB5 COW Fork)

网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/cow.html 任务1&#xff1a;Implement copy-on-write fork(hard) (完成) 现实中的问题如下&#xff1a; xv6中的fork()系统调用会将父进程的用户空间内存全部复制到子进程中。如果父进程很大&#xff0c;复制过程…

如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt

文章目录 xps转txt方法一方法二 pdf转txt整页转txt提取pdf表格&#xff0c;并转为txt 总结另外参考XPS文件转换为TXT文件XPS文件转换为PDF文件PDF文件转换为TXT文件提取PDF表格并转为TXT示例代码&#xff08;部分&#xff09; 本文测试代码已上传&#xff0c;路径如下&#xff…

C++,STL,【目录篇】

文章目录 一、简介二、内容提纲第一部分&#xff1a;STL 概述第二部分&#xff1a;STL 容器第三部分&#xff1a;STL 迭代器第四部分&#xff1a;STL 算法第五部分&#xff1a;STL 函数对象第六部分&#xff1a;STL 高级主题第七部分&#xff1a;STL 实战应用 三、写作风格四、…

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器

一、高级定时器简介 高级定时器的简介在前面一章已经介绍过&#xff0c;可以点击下面链接了解&#xff0c;在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数&#xff0c;还独有一个重复计…

Mybatis是如何进行分页的?

大家好&#xff0c;我是锋哥。今天分享关于【Mybatis是如何进行分页的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Mybatis是如何进行分页的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 实现分页的方式有很多种&#xff0c;最常见…