密码学:一文读懂非对称加密算法 DH、RSA
文章目录
- 前言
- 非对称加密算法的由来
- 非对称加密算法的家谱
- 1.基于因子分解难题
- 2.基于离散对数难题
- 密钥交换算法-DH
- 密钥交换算法-DH的通信模型
- 初始化DH算法密钥对
- 甲方构建DH算法本地密钥
- 乙方构建DH算法本地密钥
- DH算法加密消息传递
- 典型非对称加密算法-RSA
- RSA的通信模型
- RSA特有的的“公钥加密,私钥解密”
- “公钥加密,私钥解密”是否可取?
- RSA算法和DH算法的区别和联系
- 常见使用场景
- 总结
- QA
- Q1:一般来说使用公钥加密还是私钥加密?
- 参考资料
前言
我们可能没有在瑞士苏黎世银行存入巨额资产的机会,但相信大多数人都在电影中见到这样一组镜头:
户主带着自己的钥匙来到银行,要求取出自己寄放的物品。银行工作人员验明户主身份后,拿出另一把钥匙同户主一起打开保险柜,将用户寄放物品取出。我们可以把这个保险柜称为“双钥保险柜”。
要开启双钥保险柜同时需要两把钥匙。一把钥匙留给户主,由户主保管,我们可以把它叫做公钥。另一把钥匙留给银行,由银行保管,我们可以把它叫做私钥。
将上述内容引申为加密/解密应用,我们就能体会到非对称加密算法与对称加密算法之间的区别。
对称加密算法仅有一个密钥,既可用于加密,亦可用于解密,若完成加密/解密操作,仅需要一个密钥即可。
而非对称加密算法拥有两个密钥,一个用于加密,另一个则用于解密。
若要完成加密/解密操作,需要两个密钥同时参与。
相比对称加密算法的单钥体系,非对称加密算法的双钥体系就更为安全。但非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端情况下,非对称加密算法甚至比对称加密要慢1000倍。
非对称加密算法的由来
密钥管理是对称加密算法系统不容忽视的问题,它成为安全系统中最为薄弱的环节。为了弥补这一弱势,非对称加密算法应运而生。
1976年,W.Diffie和M.Hellman在IEEE (Institute of Electrical and Electronics Engineers,美国电气和电子工程师协会)的刊物上发表《密码学的新方向》文,首次提出非对称加密算法。
非对称加密算法有别于对称加密算法,将密钥一分为二,公钥公开,私钥保密。
公钥通过非安全通道发放,私钥则由发放者保留。公钥与私钥相对应,成对出现。公钥加密的数据,只可使用私钥对其解密。反之,私加密的数据,只可使用公钥对其解密。
非对称加密算法与对称加密算法相比,密钥管理问题不复存在,在安全性上有着无法逾越的高度,但却无法回避加密/解密效率低这一问题。因此,非对称加密算法往往应用在一些安全性要求相当高的领域,如B2C、B2B等电子商务平台。
注意:
针对非对称加密算法的低效问题,各密码学机构主张将对称加密算法与非对称加密算法相结合,使用对称加密算法为数据加密/解密,使用公钥和私钥为对称加密算法密钥加密/解密。利用对称加密算法的高效性,加之非对称加密算法的密钥管理,提升整体加密系统的安全性。
在算法设计上,非对称加密算法对待加密数据长度有着极为苛刻的要求。
例如,RSA算法要求待加密数据不得大于53个字节,非对称加密算法主要用于交换对称加密算法的秘密密钥,而非数据交换。
非对称加密算法的家谱
非对称加密算法源于DH算法 (Diffie-Hellman,密钥交换算法),由W.Diffie和M.Hellman共同提出。该算法为非对称加密算法奠定了基础,堪称非对称加密算法之鼻祖。
DH算法提出后,国际上相继出现了各种实用性更强的非对称加密算法,其构成主要是基于数学问题的求解,主要分为两类:
1.基于因子分解难题
RSA算法是最为典型的非对称加密算法,该算法由美国麻省理工学院(MIT)的Ron Rivest、AdiShamir和Leonard Adleman三位学者提出,并以这三位学者的姓氏开头字母命名,称为RSA算法。
RSA算法是当今应用范围最为广泛的非对称加密算法,也是第一个既能用于数据加密也能用于数字签名的算法。
2.基于离散对数难题
EIGamal算法由Taher EIGamal提出,以自己的名字命名。该算法即可用于加密/解密,也可用于数字签名,并为数字签名算法形成标准提供参考。
美国的DSS( Digital Signature Standard,数据签名标准)的DSA ( Digital SignatureAlgorithm,数字签名算法)经EIGamal算法演变而来。
ECC (Elliptical Curve Cryptography,圆曲线加密)算法以圆曲线理论为基础,在创建密钥时可做到更快、更小,并且更有效。
ECC 算法通过圆曲线方程式的性质产生密钥,而不是采用传统的方法利用大质数的积来产生。
密钥交换算法-DH
对称加密算法提高数据安全性的同时带来了密钥管理的复杂性。
消息收发双方若想发送加密消息,必须事先约定好加密算法并发放密钥。而如何安全的传递密钥,成为对称加密算法的一个棘手问题。密钥交换算法 (Diffie-Hellman算法,简称DH算法)成为解决这一问题的金钥匙!
1976年,W.Diffie和MHellman在发表的论文中提出了公钥加密算法思想,但当时并没有给出具体的实施方案,原因在于没有找到单向函数(也就是消息摘要算法),但在该文中给出了通信双方通过信息交换协商密钥的算法,即Diffie-Hellman密钥交换算法(通常简称为DH算法)。
该算法的目的在于让消息的收发双方可以在安全的条件下交换密钥,以备后续加密/解密使用。因此,DH算法是第一个密钥协商算法,但仅能用于密钥分配,不能用于加密或解密消息。
DH密钥交换算法的安全性基于有限域上的离散对数难题。基于这种安全性,通过DH算法进行密钥分配,使得消息的收发双方可以安全地交换一个秘密密钥,再通过这个密钥对数据进行加密和解密处理。
密钥交换算法-DH的通信模型
以消息传递模型为例,甲方作为发送者,乙方作为接收者。
下面分析甲乙双方如何构建密钥、交互密钥和加密数据。
初始化DH算法密钥对
甲乙两方构建密钥需要经过以下几个步骤:
1)由消息发送的一方构建密钥,这里由甲方构建密钥
2)由构建密钥的一方向对方公布其公钥,这里由甲方向乙方发布公钥
3)由消息接收的一方通过对方公钥构建自身密钥,这里由乙方使用甲方公钥构建乙方密钥。
4)由消息接收的一方向对方公布其公钥,这里由乙方向甲方公布公钥
这里要注意的是,乙方构建自己的密钥对的时候需要使用甲方公钥作为参数。这是很关键的一点,如果缺少了这一环节则无法确保甲乙双方获得同一个秘密密钥,消息加密更无从谈起。
假设甲乙双方事先约定好了用于数据加密的对称加密算法(如AES算法)并构建本地密钥 (即对称加密算法中的秘密密钥),
甲方构建DH算法本地密钥
甲方需要使用自己的私钥和乙方的公钥才能构建本地密钥,即用于数据加密/解密操作的对称加密算法的秘密密钥。
乙方构建DH算法本地密钥
乙方构建本地密钥的方式与甲方相类似,同样需要通过使用自己的私钥和甲方的公钥构建本地密钥。
虽然甲乙两方使用了不同的密钥来构建本地密钥,但甲乙两方得到密钥其实是一致的。也正因于此,甲乙双方才能顺利地进行加密消息的传递。
DH算法加密消息传递
最后,甲乙双方构建了本地密钥后,可按基于对称加密算法的消息传递模型完成消息传递。如图:
作为对称加密体制向非对称加密体制的一种过渡,DH算法仅仅比一般的对称加密算法多了密钥对的构建和本地密钥的构建这两项操作,而真正的数据加密/解密操作仍由对称加密算法完成。
典型非对称加密算法-RSA
DH算法的诞生为后续非对称加密算法奠定了基础,较为典型的对称加密算法(如EIGamal、RSA和ECC算法等)都是在DH算法提出后相继出现的,并且其算法核心都源于数学问题。
RSA算法基于大数因子分解难题,而ElGamal算法和ECC算法则是基于离散对数难题。
目前,各种主流计算机语言都提供了对RSA算法的支持。
1978年,美国麻省理工学院(MIT)的Ron Rivest、 Adi Shamir和LeonardAdleman三位学者提出了一种新的非对称加密算法,这种算法以这三位学者的姓氏开头字母命名,被称为RSA算法。
RSA算法是唯一被广泛接受并实现的通用公开加密算法,目前已经成为非对称加密算法国际标准。不仅如此,RSA算法既可用于数据加密也可用于数字签名。
RSA算法将非对称加密算法推向了一个高潮,但它并不是没有缺点。相比DES以及其他对称加密算法而言,RSA算法要慢得多。作为加密算法,尤其是作为非对称加密算法的典型,针对RSA算法的破解自诞生之日起就从未停止过。
RSA的通信模型
通过了解基于DH算法的消息传递模型,我们更容易理解基于非对称加密算法的消息传递模型的工作方式。或者说,基于DH算法的消息传递模型更为底层。
RSA算法代表了真正的非对称加密算法,其操作较之DH算法较为简单在构建密钥对方面,RSA算法就相当简单。
我们仍以甲乙两方收发消息为例。
甲方作为消息的发送方,乙方作为消息的接收方。我们假设甲乙双方在消息传递之前已将RSA算法作为消息传递的加密算法。为完成加密消息传递,甲乙双方需要以下操作:
-
由消息发送的一方构建密钥对,这里由甲方完成
-
由消息发送的一方公布公钥至消息接收方,这里由甲方将公钥公布给乙方。
完成这两步操作后,甲乙双方就可以进行加密消息传递了,如图:
这里需要读者朋友注意:
甲方向乙方发送数据时,使用私钥对数据做加密处理;乙方接收到加密数据后,使用公钥对数据做解密处理。
在非对称加密算法领域中,对于私钥加密的数据,只能使用公钥解密。简言之,“私钥加密,公钥解密”。
RSA特有的的“公钥加密,私钥解密”
相对于“私钥加密,公钥解密”的实现,RSA算法提供了另一种加密/解密方式:“公钥加密,私钥解密”。
这使得乙方可以使用公钥加密数据,如图:
“公钥加密,私钥解密”是否可取?
用公钥加密数据的方式是否可取呢?
公钥是通过甲方发送给乙方的,其在传递过程中很有可能被截获,也就是说窃听者很有可能获得公钥。
如果窃听者获得了公钥,向甲方发送数据,甲方是无法辨别消息的真伪的。
因此,虽然可以使用公钥对数据加密,但这种方式还是会有存在-定的安全隐患。
如果要建立更安全的加密消息传递模型,就需要甲乙两方构建两套非对称加密算法密钥,仅遵循“私钥加密,公钥解密”的方式进行加密消息传递。
RSA算法和DH算法的区别和联系
RSA算法实现较之DH算法实现较为简单,大部分内容与DH算法较为接近。与DH算法不同的是,RSA算法仅需要一套密钥即可完成加密/解密操作。
常见使用场景
非对称加密在信息安全领域中有许多常用场景,其中一些主要的应用包括:
-
安全通信: 非对称加密用于安全地传输密钥以保护对称加密通信。在SSL/TLS协议中,服务器和客户端使用非对称加密(如RSA)协商会话密钥,然后使用对称加密算法来加密实际数据传输。
-
数字签名: 非对称加密用于生成和验证数字签名,以确保数据的完整性和真实性。发送者使用私钥对数据签名,而接收者使用公钥来验证签名,从而确认数据未被篡改且确实由特定发送者生成。
-
身份验证: 非对称加密用于实现安全身份验证。例如,SSH(Secure Shell)协议使用非对称加密来进行客户端和服务器之间的身份验证,确保只有授权的用户可以远程登录。
-
数字证书: 非对称加密在数字证书中发挥关键作用。数字证书包含了公钥,用于证明实体的身份。这在Web浏览器和服务器之间建立安全连接时特别重要,例如在HTTPS通信中。
-
密钥交换: 非对称加密用于安全地交换密钥。例如,Diffie-Hellman密钥交换协议使用非对称加密来协商密钥,使得通信双方可以安全地共享密钥而不必在通信通道上传输密钥。
-
加密文件和存储: 非对称加密可以用于加密文件和数据,以确保只有拥有私钥的用户能够解密和访问数据。这提供了对数据隐私的保护,即使公钥是公开的。
-
电子邮件加密: 非对称加密可用于电子邮件加密,确保只有目标收件人能够解密和阅读电子邮件内容。PGP(Pretty Good Privacy)是一个常见的使用非对称加密的电子邮件加密协议。
这些场景突显了非对称加密在建立安全通信、保护数据完整性和实现身份验证方面的重要性。
总结
在实际应用中,我们很少会直接使用非对称加密算法进行数据加密。真正对数据进行加密的算法其实都是对称加密算法。非对称加密算法的主要职责是用来初始化对称加密算法的秘密密钥。
这里,其实在真正的项目实战中,我们缺少了对于数据校验的部分。
对于这项关键操作我们有两种选择:
- 使用消息摘要算法对其数据进行摘要/验证
- 使用数字签名对其数据进行签名/验证
非对称加密算法通常配合数字证书、SSL/TLS协议构建单向认证或双向认证使用。
QA
Q1:一般来说使用公钥加密还是私钥加密?
以下是ChatGPT3.5的回答,我不太清楚是不是正确的,请知道的朋友评论区指教一下,谢谢!
通常情况下,非对称加密系统中更常见的是使用公钥加密,而不是私钥加密。以下是一些典型的应用场景:
-
公钥加密用于加密通信: 在安全通信中,发送方可以使用接收方的公钥来加密消息,确保只有接收方能够使用其私钥解密并访问消息。这种方式提供了保密性,因为只有接收方知道其私钥,其他人无法解密消息。
-
数字签名和身份验证: 发送方可以使用其私钥对消息进行签名,而接收方可以使用发送方的公钥验证签名。这种方式用于确保消息的完整性和验证发送方的身份。
-
密钥交换: 公钥加密也用于在通信开始前安全地交换对称加密的密钥。例如,通过使用接收方的公钥,发送方可以加密一个随机生成的对称密钥,并将其发送给接收方。接收方可以使用其私钥解密对称密钥,然后双方可以使用对称密钥进行更高效的加密和解密通信。
虽然公钥加密在上述场景中更为常见,但私钥加密也有其用途,例如在数字签名和身份验证中。然而,私钥加密的主要问题是,由于私钥需要保持机密,密钥的安全分发和管理变得尤为重要。在实际应用中,通常会结合使用公钥加密和私钥加密,以发挥它们各自的优势。
参考资料
《Java加密与解密艺术》
ChatGPT3.5
相关文章:

密码学:一文读懂非对称加密算法 DH、RSA
文章目录 前言非对称加密算法的由来非对称加密算法的家谱1.基于因子分解难题2.基于离散对数难题 密钥交换算法-DH密钥交换算法-DH的通信模型初始化DH算法密钥对甲方构建DH算法本地密钥乙方构建DH算法本地密钥DH算法加密消息传递 典型非对称加密算法-RSARSA的通信模型RSA特有的的…...

ZooKeeper 实战(二) 命令行操作篇
文章目录 ZooKeeper 实战(二) 命令行操作篇1. 服务端命令1.1. 服务启动1.2. 查看服务1.3. 重启服务1.4. 停止服务 2. 客户端命令2.1. 启动客户端2.2. 查看节点信息查看根节点详情 ls -s /添加一个watch监视器 ls -w /列举出节点的级联节点 ls -R / 2.3. 查看节点状态2.4. 创建节…...
关于在前台应用路由调用子应用
需求 在实际写项目的过程中,关于一些前台的官网首页,会需要在一写特定的路由侠调用子应用的需求,在编写的过程中在公用的方法中,来进行处理,处理思想如下,在特定的.vue文件中, 后端 通过后端…...

Spring学习 Spring事务控制
7.1.事务介绍 7.1.1.什么是事务? 当你需要一次执行多条SQL语句时,可以使用事务。通俗一点说,如果这几条SQL语句全部执行成功,则才对数据库进行一次更新,如果有一条SQL语句执行失败,则这几条SQL语句全部不…...
c++一些使用频率较高的库函数
目录 memset() memset()接受三个参数: 注意 swap() reverse() reverse函数接收两个参数: reverse()反转整形向量元素顺序示例 …...

【从零开始学技术】Fiddler 抓取 https 请求大全
1.Fiddler代理浏览器设置 注意浏览器代理区别 Chrome/IE浏览器使用的都是系统代理设置 在chrome浏览器的设置中搜索代理,可以看到 打开IE浏览器,选择设置->Internet选项 Firefox浏览器使用的是单独的一套代理系统 在Firefox的代理设置中,我…...
第二百六十四回
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了SliverPadding组件相关的内容,本章回中将介绍Sliver综合示例.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在前面的章回中介绍了各种Sliver相关的组件:SliverList,SliverGr…...

用Kimi chat识别并整理图片里面的文字
Kimi chat是有OCR功能的,可以识别图片中的文字。 下面这张图片是一本书的注释,里面提到有不少图书,利用Kimi chat就可以轻松完成提取其中图书书名的任务。 先拿一张图片来做实验。Kimichat的回复: 在您提供的文件内容中…...

驾驭未来:从传统运维到智能化运维的转型之路
随着科技的飞速发展,企业的业务需求也在不断变化。为了满足这些需求,企业的IT架构逐渐向云原生、容器化和微服务化演进。作为支撑企业业务发展的运维人员,我们需要紧跟时代步伐,不断提升自己的技能和认知水平。 在2023年全球运维大…...

LabVIEW在旋转机械故障诊断中的随机共振增强应用
在现代工业自动化领域,准确的故障诊断对于保障机械设备的稳定运行至关重要。传统的故障检测方法往往因噪声干扰而难以捕捉到微弱的故障信号。随着LabVIEW在数据处理和系统集成方面的优势日益凸显,其在旋转机械故障诊断中的应用开始发挥重要作用ÿ…...
尚硅谷大数据技术-数据湖Hudi视频教程-笔记02【核心概念(基本概念、数据写、数据读)】
大数据新风口:Hudi数据湖(尚硅谷&Apache Hudi联合出品) B站直达:https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘:https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…...

鸿蒙(HarmonyOS)应用开发指南
1. 概述 1.1 简介 鸿蒙(即 HarmonyOS ,开发代号 Ark,正式名称为华为终端鸿蒙智能设备操作系统软件)是华为公司自 2012 年以来开发的一款可支持鸿蒙原生应用和兼容 AOSP 应用的分布式操作系统。该系统利用“分布式”技术将手机、电…...

Android 13 辅助屏导航栏不显示问题
问题 在Android 13 上开启辅助屏幕。但是发现辅助屏systemui 导航按 icon没有显示,但是点击对应的区域有作用 分析 可以用 anroid device monitor 工具分析视图 解决 public NavigationBarView(Context context, AttributeSet attrs) {super(context, attrs);…...

【QT】标准对话框
目录 1 概述 2 QFileDialog对话框 1.选择打开一个文件 2.选择打开多个文件 3.选择已有目录 4.选择保存文件名 3 QColorDialog对话框 4 QFontDialog对话框 5 QInputDialog标准输入对话框 1.输入文字 2.输入整数 3.输入…...
微信小程序跳转方式及问题
一、五种跳转方式 1.wx.navigateTo() 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面 通常推荐使用 wx.navigateTo进行跳转,以便返回原页面,以提高加载速度 wx.navigateTo({url: })2.wx.redirectTo() 关闭当前页面&#x…...

Redis实现分布式会话
Redis实现分布式会话 1 什么是分布式会话 1 这是我么之前学过的注册登录模式 2 如果非常多的人访问,因为单台服务器的访问承受能力是有限的,那么我们就想用多态服务器来承担压力 3 一般通过负载均衡的方式来实现,来分担服务器的压力。 4 负…...

AntDesignBlazor示例——暗黑模式
本示例是AntDesign Blazor的入门示例,在学习的同时分享出来,以供新手参考。 示例代码仓库:https://gitee.com/known/BlazorDemo 1. 学习目标 暗黑模式切换查找组件样式覆写组件样式 2. 添加暗黑模式切换组件 1)双击打开MainL…...

高通平台开发系列讲解(USB篇)adb function代码分析
文章目录 一、FFS相关动态打印二、代码入口三、ffs_alloc_inst四、ep0、ep1&ep2的注册五、读写过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍高通平台USB adb function代码f_fs.c。 一、FFS相关动态打印 目录:msm-4.14/drivers/usb/gadget/fun…...

SQL基础知识3
一、删除数据 1、delete操作 删除之前一定要查询一下,确保删除的数据是对的 逻辑删除:在表中新增一个字段:flag/status 二、更新数据 本质上的逻辑删除 三、查询数据 1、联表查询 1、内连接 交集的部分叫内连接 小知识:一般…...

GBASE南大通用数据库如何检索单行
SELECT 语句返回的行集是它的活动集。单个 SELECT 语句返回单个行。您可使用嵌入式 SELECT 语句来从数据库将单个行检索到主变量内。然而,当 SELECT 语句返回多行数 据时,程序必须使用游标来一次检索一行。在 检索多行 中讨论“多行”选择操作。 要检索单…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...