基于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.mzph.cn/bicheng/69561.shtml

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

相关文章

[MySQL]事务的理论、属性与常见操作

目录 一、事物的理论 1.什么是事务 2.事务的属性&#xff08;ACID&#xff09; 3.再谈事务的本质 4.为什么要有事务 二、事务的操作 1.事务的支持版本 2.事务的提交模式 介绍 自动提交模式 手动提交模式 3.事务的操作 4.事务的操作演示 验证事务的回滚 事务异常…

后盾人JS--闭包明明白白

延伸函数环境生命周期 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

Python爬虫之——Cookie存储器

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &…

MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题

无论在使用QT或者MFC进行界面开发时&#xff0c;都会出现在一个对话框里面存在好多的选项&#xff0c;导致对话框变得非常长或者非常大&#xff0c;就会显现的不美观&#xff0c;在这种情况下通常是添加一个页面的滚动条来解决这个问题&#xff0c;下面我们就来介绍给MFC的对话…

(undone) 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) (doing) 现实中的问题如下&#xff1a; xv6中的fork()系统调用会将父进程的用户空间内存全部复制到子进程中。如果父进程很大&#xff0c;复制过…

分享| RL-GPT 框架通过慢agent和快agent结合提高AI解决复杂任务的能力-Arxiv

结论 “RL-GPT: Integrating Reinforcement Learning and Code-as-policy” RL-GPT 框架为解决大语言模型在复杂任务处理中的难题提供了创新有效的途径&#xff0c; 旨在将强化学习&#xff08;RL&#xff09;和代码即策略相结合&#xff0c; 以解决大语言模型&#xff08…

PPT自动化 python-pptx -7: 占位符(placeholder)

占位符&#xff08;placeholder&#xff09;是演示文稿中用于容纳内容的预格式化容器。它们通过让模板设计者定义格式选项&#xff0c;简化了创建视觉一致幻灯片的过程&#xff0c;同时让最终用户专注于添加内容。这加快了演示文稿的开发速度&#xff0c;并确保幻灯片之间的外观…

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

一个简单的自适应html5导航模板

一个简单的 HTML 导航模板示例&#xff0c;它包含基本的导航栏结构&#xff0c;同时使用了 CSS 进行样式美化&#xff0c;让导航栏看起来更美观。另外&#xff0c;还添加了一些 JavaScript 代码&#xff0c;用于在移动端实现导航菜单的展开和收起功能。 PHP <!DOCTYPE htm…

【算法应用】基于A*-蚁群算法求解无人机城市多任务点配送路径问题

目录 1.A星算法原理2.蚁群算法原理3.结果展示4.代码获取 1.A星算法原理 A*算法是一种基于图搜索的智能启发式算法&#xff0c;它具有高稳定性和高节点搜索效率。主要原理为&#xff1a;以起点作为初始节点&#xff0c;将其加入开放列表。从开放列表中选择具有最小总代价值 f (…

自制一个入门STM32 四足机器人具体开发顺序

0 前期准备 1. 知识储备 学习 STM32 微控制器的基础知识&#xff0c;包括 GPIO、定时器、串口通信等外设的使用&#xff0c;可通过官方文档、教程和视频课程进行学习。了解舵机控制原理&#xff0c;因为四足机器人通常使用舵机来实现关节运动。掌握基本的机械结构设计知识&am…

洛谷P11464 支配剧场

支配剧场 题目背景 May all the beauty be blessed. 题目描述 布洛妮娅和符华在寻找琪亚娜的途中&#xff0c;被支配之律者困在了支配剧场的高塔回廊之中。布洛妮娅敏锐地发现&#xff0c;虚无回廊是由一些支配之律者生成的积木构成的&#xff0c;只要击碎其中一些积木&#…

http3网站的设置(AI不会配,得人工配)

堡塔PHP项目中配置nginx1.26.0设置http3协议 # 文件所在服务器中的路径 /www/server/nginx/conf/nginx.confuser www www; worker_processes auto; error_log /www/wwwlogs/nginx_error.log crit; pid /www/server/nginx/logs/nginx.pid; worker_rlimit_nofile 512…

Python-基于PyQt5,json和playsound的通用闹钟

前言&#xff1a;刚刚结束2024年秋季学期的学习&#xff0c;接下来我们继续来学习PyQt5。由于之前我们已经学习了PyQt5以及PyUIC,Pyrcc和QtDesigner的安装&#xff0c;配置。所以接下来我们一起深入PyQt5&#xff0c;学习如何利用PyQt5进行实际开发-基于PyQt5&#xff0c;json和…

预测不规则离散运动的下一个结构

有一个点在19*19的平面上运动&#xff0c;运动轨迹为 一共移动了90步&#xff0c;顺序为 y x y x y x 0 17 16 30 10 8 60 15 15 1 3 6 31 10 7 61 14 15 2 12 17 32 9 9 62 16 15 3 4 12 33 10 9 63 18 15 4 3 18 34 15 12 6…

固有频率与模态分析

目录 引言 1. 固有频率&#xff1a;物体的“天生节奏” 1.1 定义 1.2 关键特点 1.3 实际意义 2. 有限元中的模态分析&#xff1a;给结构“体检振动” 2.1 模态分析的意义 2.2 实际案例 2.2.1 桥梁模态分析 2.2.2 飞机机翼模态分析 2.2.3 具体事例 3. 模态分析的工具…

供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇

综述 我们之前在供应链系统设计-中台系统设计系列&#xff08;五&#xff09;- 供应链中台实践概述文章中针对中台到底是什么进行了描述&#xff0c;对于中台的范围也进行划分&#xff0c;如下图所示&#xff1a; 关于商品中心&#xff0c;我们之前用4篇文章介绍了什么是商品中…

C27.【C++ Cont】时间、空间限制和STL库的简单了解

&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;春节篇&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8; 目录 1.竞赛中的…

步进电机加减速公式推导

运动控制梯形速度曲线相关算法请参考下面系列文章 PLC运动控制基础系列之梯形速度曲线_三菱运动控制模块梯形加减速-CSDN博客文章浏览阅读3.1k次,点赞3次,收藏7次。本文是关于PLC运动控制的基础教程,重点介绍了梯形速度曲线的概念、计算和应用。讨论了梯形加减速在启动和停…

指针的介绍3后

1.函数指针变量 1.1函数的地址 void test(int (*arr)[2]) {printf("zl_dfq\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 由上面的程序运行可知&#xff1a; 函数名就是函数的地址 &函数名也可以拿到函…