java 实现对称加密的方法

news/2024/5/10 1:50:41/文章来源:https://blog.csdn.net/qq_42751978/article/details/130316134

 

对称加密是一种加密算法,它和非对称加密的区别在于:加密和解密使用不同的密钥,对称加密使用同一个密钥对数据进行加密和解密。 今天我们来学习下对称加密的实现方法,不需要使用到私钥,只需要用到公钥。 首先我们来看下这个加密解密的过程: 我们先来看下输入参数,这里使用了公钥密码来进行对称加密: 输出结果为: 在此基础上,我们再来看下这个对称加密的算法: 通过上面的代码可以看出,要想进行解密需要先解密公钥,然后再用私钥进行解密。

  • 1、使用公钥来加密数据

    使用公钥加密的原理是,数据长度固定,使用密钥将数据加密。例如,如果要对1-8位的数字进行加密,则需要使用32位的密钥。首先生成32位的密钥,然后对其进行加密得到256位的数据。最后,将数据保存到一个字符串中,然后将该字符串发送到接收方。 使用公钥加密后,就相当于给数据加上了一个密码。如果想要对数据进行解密,就需要解密公钥并将其还原成原来的内容。 在上面的代码中,使用了4个字符: 在这里我们需要注意下参数 name中的a和b,在没有密钥的情况下是无法对其进行加密的。公钥的长度固定为32位,所以我们需要使用32位的密钥才能对数据进行加密。 使用公钥进行加密后,我们还需要对数据进行解密才能得到原来的内容。这里可以通过发送一段伪随机数来实现解密,伪随机数是由16位随机数和64位随机数组合而成:

  • 2、生成对称密钥

    我们知道,加密和解密是通过不同的密钥来完成的,对称密钥就是加密和解密的钥匙。生成对称密钥就是使用私钥,然后用公钥去加密数据。所以我们需要找到一个对称密钥生成算法,通过这个算法来生成对称密钥。我们在 Java中找到了一个生成对称密钥的算法: 这里我们使用了 RSA算法,使用 RSA算法来计算公钥密码。RSA算法是基于大数分解的一种计算方法,由美国国家科学基金会于1986年提出,并于1987年通过了美国国家标准与技术研究院(NIST)的评审。 RSA算法有两个参数,一个是私钥,另一个是公钥。从上面的代码中我们可以看出, RSA算法需要两个参数:公钥和私钥。也就是说,我们需要找到一个私钥和一个公钥。下面我们来看下具体的实现过程: 第一步:获取公钥:首先在官网上找到 RSA算法,然后点击“免费下载”。 第二步:下载并解压 RSA文件 第三步:使用 RSA算法生成私钥:然后我们使用一个`. java. lang`文件来生成一个`. java. lang`文件(注意这里使用的是 java)。 第四步:使用 java. lang把`. java. lang`文件里面的`write_key’`替换为`write_primes’。 第五步:获取公钥并加密:然后将此密钥对数据进行加密(这里需要注意一下,我们需要使用的是公钥,不是私钥) 第六步:使用私钥解密:最后将此密钥对数据进行解密。 上面的代码中使用了三个参数,其中第一个参数是私钥值,第二个参数是公钥值,最后一个参数是加密和解密的公钥。通过上面的代码可以看出,我们先使用了私钥对数据进行加密,然后再将加密后的数据和原来的数据进行对比。结果如下:

  • 3、解密数据

    这个时候,我们可以使用以下方法进行解密: 使用 path ()方法获取公钥,并使用 path ()方法获取私钥。 其中 path ()方法的参数为:公钥; 我们可以发现,这里的密钥长度是50,这就说明了要想进行加密,需要至少50个字符才能完成。 这里我们使用了字符串来作为输入参数,因为字符串是不可能进行加密的,所以它可以用来做解密操作。 在上面的代码中,我们采用了两个函数分别对数据进行解密。 第一个函数是用来对数据进行加密的,第二个函数是用来解密数据的。当然在实际工作中,我们只需要解密第一个函数即可。

  • 4、验证加密的结果

    当我们完成了密码的生成,加密,解密等操作之后,接下来我们就需要验证下加密的结果是否正确,可以通过以下几种方式来验证: (1)查看输入的参数是否和返回的参数相同,如果相同则说明是正确的,如果不相同则说明没有正确加密; (2)我们可以通过查看参数的返回类型来验证是否正确,比如: 我们可以使用 javac. append ()方法将返回类型转换为数字签名: (3)使用 java. util. toString ()方法将返回类型转换为字符串: 可以看出,上面几种验证方式都是需要将返回的类型进行转换的,但是不管是哪种方法都需要在编译期完成。这也是为什么我们不建议大家在程序运行时进行转换类型的原因。 那么上面我们说了这么多怎么去使用对称加密来实现呢?接下来我们来看下实现对称加密的核心原理: 通过上面这段代码,我们可以看出,这里使用了两个私钥(公钥)来对数据进行加密和解密。但是这里有个问题:为什么要使用两个私钥来进行加密呢?因为一个私钥只能处理一个数字签名,如果有多个数字签名,那么私钥就不能处理了。 这就需要使用两个公钥了,一个公钥是公开的,另一个公钥是保密的。通过上面这段代码我们就可以很好地理解对称加密的原理了。 以上就是今天所讲到的内容了,相信通过这段话大家已经对对称加密有了一定的了解。如果还有什么不明白或者不懂的地方请留言。

  • 5、总结

    在实际项目中,我们会使用到对称加密和非对称加密两种加密方式,如果不考虑速度的话,我们建议使用非对称加密。 如果是考虑速度的话,建议使用对称加密,因为它的算法简单、占用资源小、效率高。但是对称加密会存在一些问题: 1.当客户端不知道公钥的时候,无法对数据进行解密; 2.私钥的安全等级不如公钥高; 3.私钥不能存储在客户端; 4.当客户端被攻击时,可能会造成数据泄露。 因此,在实际应用中,建议使用非对称加密方式。

以下是常用的Java对称加密代码:

1. AES加密
```java
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESUtil {
private static final String KEY = "1234567890123456"; // 密钥
public static String encrypt(String content) throws Exception {
SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(content.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String content) throws Exception {
SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] encryptedBytes = Base64.getDecoder().decode(content);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes, "UTF-8");
}
}
```
2. DES加密
```java
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class DESUtil {
private static final String KEY = "12345678"; // 密钥
public static String encrypt(String content) throws Exception {
SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(content.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String content) throws Exception {
SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] encryptedBytes = Base64.getDecoder().decode(content);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes, "UTF-8");
}
}
```
3. Blowfish加密
```java
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class BlowfishUtil {
private static final String KEY = "1234567890123456"; // 密钥
public static String encrypt(String content) throws Exception {
SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(content.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String content) throws Exception {
SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] encryptedBytes = Base64.getDecoder().decode(content);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes, "UTF-8");
}
}
```

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

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

相关文章

leetcode328. 奇偶链表

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。 请注意,偶数组和奇数组内部的相…

022:Mapbox GL 加载geojson数据,形成热力图,自定义样式

第022个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载geojson数据,形成热力图. paint设置的参数:heatmap-color,heatmap-intensity,heatmap-opacity,heatmap-radius,heatmap-weight,visibility,具体请参考下面的api链接。 直接复制下面的 vue+mapbox源代…

Java编译器插件Manifold(流形)

流形 文天祥正气歌中有云:“天地有正气,杂然赋流形”。 流形是一种抽象而又具体的事务,要研究一个事务就要格物,不格物就不能知道事物的具体描绘形式。流形大多数情况下是一种数学计算方式,可以将一个复杂的模型抽象…

V2.4版本商超标签专用路由器

PICK_Router_V2.4 产品参数 产品型号 PICK_Router_V2.4 尺寸(mm) 21*14*4.3mm 工作温度 -10-70℃ 产品重量 465g 供电方式 DC12V or POE 工作频率 2.4G 通信速率 50-250kbps 通信方式 10/100Mbps有线网络&2.4G 通信半径 30m 支持标签数量 >10000…

设计模式 -- 命令模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

【Redis】Redis十大数据类型—列表List

介绍 List列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向List列表添加元素。 列表的最大长度是2^32-1,也就是每个列表支持超过40亿个元素。 实现 底层数据结构是由双向链表或压缩列表实现。 如果列表的元素个数小于 512 个…

YOLOv7如何提高目标检测的速度和精度,基于模型结构提高目标检测速度

目录 一、目标检测二、目标检测的速度和精度的权衡1、速度和精度的概念和定义2、如何评估目标检测算法的速度和精度3、速度和精度之间的权衡 三、基于模型结构提高目标检测速度1、Backbone网络的选择2、特征金字塔网络的设计3、通道注意力机制4、混合精度训练 一、目标检测 目…

3个实用的文字转语音方法,让你时刻保持信息更新!

现在,我们生活节奏加快,信息量也越来越大,有时候想了解新闻却又不想眼睛再去盯着手机屏幕了,这时候文字转语音工具就可以帮助我们实现听新闻的需求。如果你还不了解文字如何转换成语音,别担心,今天我将向大…

不同的场景上线时钟同步系统需要注意些什么

时钟同步系统一般都是用在学校或者医院的环境当中,一般时钟同步系统由硬件和软件相组成。对于局域网部署,通常使用NTP协议。对于广域网部署,通常需要考虑网络延迟和安全性等因素。此外,时钟同步系统在不同的使用场景当中的需求也不…

15天学习MySQL计划-多表联查(基础篇)第四天

15天学习MySQL计划(多表联查)第四天 1.多表查询 1.1概述 ​ 指从多张表中查询数据 ​ 在项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互…

记录-JavaScript常规加密技术

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 当今Web开发中,数据安全是一个至关重要的问题,为了确保数据的安全性,我们需要使用加密技术。JavaScript作为一种客户端编程语言,可以很好地为数据进行加…

sggJava基础第四天

1 分支结构 分支结构 根据条件,选择性地执行某段代码。 有if…else和switch-case两种分支语句。 概述 顺序结构的程序虽然能解决计算、输出等问题 但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构 if…else形式 单分支结构 代码实现 …

JWT 实现登录认证 + Token 自动续期方案

前言 过去这段时间主要负责了项目中的用户管理模块,用户管理模块会涉及到加密及认证流程。今天就来讲讲认证功能的技术选型及实现。技术上没啥难度当然也没啥挑战,但是对一个原先没写过认证功能的菜鸡来说也是一种锻炼吧。 技术选型 要实现认证功能&a…

JavaScript(JS)-1.JS基础知识

1.JavaScript概念 (1)JavaScript是一门跨平台,面向对象的脚本语言,来控制网页行为的,它能使网页可交互 (2)W3C标准:网页主要由三部分组成 ①结构:HTML负责网页的基本结构(页面元素和内容)。 …

Git从远程仓库克隆仓库后推送到指定分支

git克隆到本地仓库 在得到一个git仓库地址后,首先要配置本地仓库,配置远程仓库地址才可以远程拉取项目。 本地配置的一般流程: git init初始化一个空白git仓库 2. 配置在自己额用户名和邮箱 配置个人信息时方便再团队合作时能知道是谁再何…

适应大、中、小型医院的手术麻醉临床信息管理系统源码

手术麻醉管理系统是一款专门用于医院手术麻醉管理的软件系统,它可以帮助医院和医生更好地管理手术麻醉过程,提高手术麻醉的质量和安全性。本文将介绍手术麻醉管理系统的实现、功能概述、主要功能、系统设置、麻醉管理、术中记录、苏醒室记录、PCA实施及管…

番外12:ADS导出到AD变为PCB文件

番外12:ADS导出到AD变为PCB文件并嘉立创制板 番外12:ADS导出到AD变为PCB文件,此处的示例为功率放大器! STEP 1: 从ADS导出dxf文件 打开制作好的版图文件,在原有基础上打好散热孔和固定孔,散热孔半径0.63…

基于禅道二开领导报表

上周开会的时候公司项目总监说感觉最近开发人员很轻松,工作量不饱和。支付力度不够。 做为开发负责人,对项目总监这个说法我肯定需要给予响应,不然老板也在场,后续项目想要加资源啥的都无法解释。 关注我的人知道,之前…

简单介绍十几款常用的画架构图流程图的软件

简单介绍十几款常用的画架构图流程图的软件 draw.io draw.io是开源免费的在线画图工具,还提供桌面版本。 特性: 实时协作;支持在线离线版本;存储支持多种方式:Google Drive, OneDrive, GitHub, GitLab, Dropbox等&…

StarRC的妙用

在整个R2G的流程里边,寄生参数抽取(StarRC)是比较没有存在感的。大部分的时间,工程师们只是用这个工具来刷SPEF。并不会关注太多。这本身其实是一个好事情,反向证明了参数抽取工具的高度稳定性! 但是&#…