Java中常用的加密算法及其实现原理详解(二)

本系列文章简介:

        随着互联网的快速发展,信息的安全保护愈发重要。在软件开发中,加密算法被广泛应用于数据的加密和解密过程中,以保护敏感信息的机密性和完整性。Java作为一种广泛应用于企业级开发的编程语言,也提供了丰富的加密算法库。

        本文将介绍Java中常用的加密算法,包括对称加密算法、非对称加密算法和哈希算法等,并详细解析它们的实现原理。了解这些加密算法及其实现原理,有助于理解和应用Java中的加密算法库。在实际开发中,我们可以根据需求选择合适的加密算法,并在合适的场景下使用不同的加密算法组合,以提高数据的安全性和可靠性。同时,我们也需要注意加密算法的安全性,及时更新和升级加密算法版本,以应对不断增强的安全风险。

        欢迎大家订阅《Java技术栈高级攻略》专栏,一起学习,一起涨分!

目录

1、前言

2、散列算法

2.1 散列算法的工作原理

2.2 MD5、SHA算法的原理及其在Java中的实现

2.3 散列算法的优缺点

3、数字签名算法

3.1 数字签名算法的工作原理

3.2 RSA、DSA、ECDSA、EdDSA数字签名算法的原理及其在Java中的实现

3.3 数字签名算法的优缺点

4、应用场景

4.1 举例说明各种加密算法在实际应用中的场景及使用方法

4.2 分析加密算法的适用性和安全性要求

5、结语


1、前言

        在计算机领域中,数据安全性是一个非常重要的问题。为了保护数据的机密性和完整性,常常需要使用加密算法对数据进行加密和解密。Java是一种流行的编程语言,提供了许多常用的加密算法的实现。

        本文将跟随《Java中常用的加密算法及其实现原理详解(一)》的进度,继续介绍Java中常用的加密算法。希望通过本系列文章的学习,您将能够更好地理解Java中常用的加密算法的内部工作原理,掌握Java中常用的加密算法的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Java中常用的加密算法的潜力,为系统的高效运行提供有力保障。

2、散列算法

2.1 散列算法的工作原理

散列算法是一种将任意长度的输入转化为固定长度输出的算法。它通过将输入数据映射到固定长度的散列值,使得不同的输入产生的散列值具有高度不同的概率。

散列算法的工作原理包括以下几个步骤:

  1. 压缩:散列算法会将输入数据进行压缩,将其转化为固定长度的中间结果。

  2. 映射:散列算法通过一个映射函数将中间结果映射到输出空间中的一个位置。这个映射函数通常是非线性和不可逆的,即不能通过输出值推导出输入值。

  3. 冲突处理:由于输入数据的长度是不确定的,不同的输入可能会产生相同的散列值,这就是冲突。散列算法通过不同的冲突处理方法来解决冲突,常见的方法有链接法、开放寻址法等。

  4. 输出:最终,散列算法会将映射到输出空间的位置作为散列值输出。

散列算法的工作原理可以用以下伪代码表示:

function hash(input):intermediate_result = compress(input)hash_value = map(intermediate_result)return hash_value

散列算法的工作原理保证了以下特性:

  1. 一致性:对于相同的输入,散列算法应始终产生相同的散列值。

  2. 高效性:散列算法应具有高效的计算性能,能够在合理的时间内完成散列计算。

  3. 均匀性:散列算法应使不同的输入产生的散列值分布均匀,以减少冲突的概率。

  4. 不可逆性:散列算法应满足不可逆性,即不能通过散列值推导出原始输入值。

常见的散列算法有MD5、SHA-1、SHA-256等。这些算法在不同的应用领域中被广泛使用,例如密码学、数据完整性验证等。

2.2 MD5、SHA算法的原理及其在Java中的实现

MD5(Message Digest Algorithm 5)和SHA(Secure Hash Algorithm)是常见的哈希算法。哈希算法用于将任意长度的数据转换为固定长度的摘要或哈希值。哈希算法具有以下特点:

  1. 输入不同,产生的哈希值一定不同。
  2. 哈希过程是单向的,即无法通过哈希值得出原始数据。
  3. 哈希值的长度是固定的,MD5为128位,SHA1为160位,SHA256为256位。

MD5算法的原理是将原始数据进行分组处理,然后针对每个分组进行一系列的位运算和数据置换操作,最终得到128位的消息摘要。MD5算法已经被证明存在一定的安全弱点,因此在加密领域的使用逐渐减少。

SHA算法是由美国国家安全局(NSA)设计,目前常用的SHA算法有SHA-1、SHA-256等。SHA-1和MD5类似,但SHA-1的输出长度更长,为160位。SHA-256基于SHA-2系列,输出长度为256位。

在Java中,可以使用Java.security.MessageDigest类来实现MD5和SHA算法的功能。示例代码如下:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class HashAlgorithmExample {public static String md5(String input) throws NoSuchAlgorithmException {MessageDigest md = MessageDigest.getInstance("MD5");byte[] messageDigest = md.digest(input.getBytes());StringBuilder sb = new StringBuilder();for (byte b : messageDigest) {sb.append(String.format("%02x", b));}return sb.toString();}public static String sha1(String input) throws NoSuchAlgorithmException {MessageDigest md = MessageDigest.getInstance("SHA-1");byte[] messageDigest = md.digest(input.getBytes());StringBuilder sb = new StringBuilder();for (byte b : messageDigest) {sb.append(String.format("%02x", b));}return sb.toString();}public static String sha256(String input) throws NoSuchAlgorithmException {MessageDigest md = MessageDigest.getInstance("SHA-256");byte[] messageDigest = md.digest(input.getBytes());StringBuilder sb = new StringBuilder();for (byte b : messageDigest) {sb.append(String.format("%02x", b));}return sb.toString();}public static void main(String[] args) throws NoSuchAlgorithmException {String input = "Hello World";System.out.println("MD5: " + md5(input));System.out.println("SHA-1: " + sha1(input));System.out.println("SHA-256: " + sha256(input));}
}

以上示例代码使用MessageDigest类的getInstance方法来获取对应的MessageDigest对象,然后使用digest方法将输入数据转换为对应的摘要,再使用StringBuilder将摘要转换为十六进制字符串输出。

需要注意的是,在使用MessageDigest.getInstance方法获取MessageDigest对象时,需要处理可能抛出的NoSuchAlgorithmException异常。

2.3 散列算法的优缺点

散列算法的优点:

  1. 散列算法具有高效性,能够快速地计算出给定输入的散列值。
  2. 散列算法的输出长度固定,不会随输入的大小而变化,这有助于提高散列表的性能。
  3. 散列算法的输出值经过了一定的扰动,使得输入的微小变化也会导致输出的大变化,这有助于保证散列值的唯一性。
  4. 散列算法具有不可逆性,即无法从散列值推导出原始输入值,这有助于保护输入值的机密性。

散列算法的缺点:

  1. 散列算法存在哈希冲突的问题,即不同的输入可能会产生相同的散列值。可以通过使用更好的散列算法或解决冲突的技术来减少哈希冲突的发生。
  2. 散列算法对输入的微小变化非常敏感,即输入的微小变化会导致输出的大变化。这可能会导致对于需要对输入进行较小修改的场景效果不佳。
  3. 散列算法的输出长度固定,这在某些场景下可能会造成浪费,因为输入可能很小,而算法的输出却有固定的长度。

需要根据具体的应用场景来选择合适的散列算法,并结合其他技术来解决散列算法的缺点。

3、数字签名算法

3.1 数字签名算法的工作原理

数字签名算法的工作原理是使用公钥加密和私钥解密的方式来确保数字内容的完整性、身份认证和不可否认性。

下面是数字签名算法的一般工作流程:

  1. 首先,生成一对非对称密钥,包括一个公钥和一个私钥。公钥可以被分享给任何人,而私钥必须保密。

  2. 数字签名的生成方首先使用哈希函数对要签名的数据进行散列处理,生成一个固定长度的消息摘要。

  3. 然后,使用私钥对消息摘要进行加密,生成数字签名。

  4. 数字签名随着原始数据一起发送给验证方。

  5. 验证方使用公钥对接收到的数字签名进行解密,得到消息摘要。

  6. 验证方使用相同的哈希函数对接收到的原始数据进行散列处理,生成另一个消息摘要。

  7. 验证方比较两个消息摘要是否相同。如果相同,说明数据没有被篡改,验证成功;如果不同,则说明数据被篡改,验证失败。

数字签名的工作原理是基于非对称加密算法中的公钥和私钥的配对性质。由于私钥只有签名方知道,其他人无法生成与私钥对应的合法签名。而对于验证方来说,只需要使用公钥就可以验证签名的合法性。这种机制能够确保数据的完整性、身份认证和不可否认性。

3.2 RSA、DSA、ECDSA、EdDSA数字签名算法的原理及其在Java中的实现

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,也可以用于数字签名。RSA基于大数分解的困难性,其原理是使用两个不同的大素数生成公钥和私钥,公钥用于加密,私钥用于解密或签名。在数字签名中,发送者使用私钥对消息进行签名,接收者使用公钥进行验证。

在Java中,可以使用Java的内置类库java.security来实现RSA数字签名算法。具体实现步骤如下:

  1. 生成RSA密钥对:
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    keyPairGenerator.initialize(2048);
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    
  2. 使用私钥进行签名:
    Signature signature = Signature.getInstance("SHA256withRSA");
    signature.initSign(keyPair.getPrivate());
    signature.update(data);
    byte[] signatureBytes = signature.sign();
    
  3. 使用公钥进行验证:
    Signature signature = Signature.getInstance("SHA256withRSA");
    signature.initVerify(keyPair.getPublic());
    signature.update(data);
    boolean verified = signature.verify(signatureBytes);
    

DSA(Digital Signature Algorithm)是一种数字签名算法,专门用于数字签名。DSA的原理是基于离散对数难题的困难性,其使用了大素数和离散对数的计算。DSA相对于RSA,生成的签名更短,但加密和解密的性能较低。

在Java中,可以使用Java的内置类库java.security来实现DSA数字签名算法。具体实现步骤如下:

  1. 生成DSA密钥对:
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
    keyPairGenerator.initialize(1024);
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    
  2. 使用私钥进行签名:
    Signature signature = Signature.getInstance("SHA256withDSA");
    signature.initSign(keyPair.getPrivate());
    signature.update(data);
    byte[] signatureBytes = signature.sign();
    
  3. 使用公钥进行验证:
    Signature signature = Signature.getInstance("SHA256withDSA");
    signature.initVerify(keyPair.getPublic());
    signature.update(data);
    boolean verified = signature.verify(signatureBytes);
    

ECDSA(Elliptic Curve Digitl Signature Algorithm)是一种基于椭圆曲线的数字签名算法,其原理是基于椭圆曲线上的离散对数难题的困难性。ECDSA相对于RSA和DSA,生成的签名更短,但加密和解密的性能更高。

在Java中,可以使用Java的内置类库java.securityjava.security.interfaces来实现ECDSA数字签名算法。具体实现步骤如下:

  1. 生成ECDSA密钥对:
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
    keyPairGenerator.initialize(new ECGenParameterSpec("secp256r1"));  // 指定椭圆曲线参数
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    
  2. 使用私钥进行签名:
    Signature signature = Signature.getInstance("SHA256withECDSA");
    signature.initSign(keyPair.getPrivate());
    signature.update(data);
    byte[] signatureBytes = signature.sign();
    
  3. 使用公钥进行验证:
    Signature signature = Signature.getInstance("SHA256withECDSA");
    signature.initVerify(keyPair.getPublic());
    signature.update(data);
    boolean verified = signature.verify(signatureBytes);
    

EdDSA(Edwards-curve Digital Signature Algorithm)是一种基于扭曲爱德华曲线的数字签名算法,其原理是基于扭曲爱德华曲线上的离散对数难题的困难性。EdDSA相对于RSA、DSA和ECDSA,具有更高的性能和更好的安全性。

在Java中,可以使用第三方库Bouncy Castle来实现EdDSA数字签名算法。具体实现步骤如下:

  1. 引入Bouncy Castle库:
    Security.addProvider(new BouncyCastleProvider());
    
  2. 生成EdDSA密钥对:
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EdDSA", "BC");
    keyPairGenerator.initialize(new EdDSAParameterSpec(EdDSANamedCurveTable.getByName("Ed25519")));
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    
  3. 使用私钥进行签名:
    Signature signature = Signature.getInstance("EdDSA", "BC");
    signature.initSign(keyPair.getPrivate());
    signature.update(data);
    byte[] signatureBytes = signature.sign();
    
  4. 使用公钥进行验证:
    Signature signature = Signature.getInstance("EdDSA", "BC");
    signature.initVerify(keyPair.getPublic());
    signature.update(data);
    boolean verified = signature.verify(signatureBytes);
    

以上是RSA、DSA、ECDSA和EdDSA数字签名算法的原理及其在Java中的实现方式。注意,以上代码只是简化示例,实际应用中可能需要更多的异常处理、密钥管理和数据编码等步骤。

3.3 数字签名算法的优缺点

数字签名算法的优点:

  1. 确认身份验证:数字签名可以用于验证消息的发送方是否属实,因为只有持有私钥的人才能生成正确的数字签名。这可以防止恶意人员伪造或篡改消息。

  2. 数据完整性:数字签名还可以保证消息的完整性,因为一旦消息被签名,任何对消息的修改都会导致签名验证失败。

  3. 不可否认性:数字签名是不可否认的,也就是说,签名的人无法否认自己的签名行为。这对于法律和商业交易等领域非常重要。

  4. 高度安全性:数字签名算法通常使用数学上的难题,如RSA算法、DSA算法等。这些算法的安全性非常高,很难被破解。

数字签名算法的缺点:

  1. 计算复杂度高:数字签名算法通常需要进行大量的数学运算,特别是在密钥生成和签名验证过程中。这会导致计算的复杂性增加。

  2. 需要公钥分发:数字签名算法需要消息的接收方知道签名者的公钥,以进行签名验证。但是,公钥的分发可能存在安全问题,如窃取和篡改。

  3. 需要信任中心:在某些数字签名算法中,需要一个可信的第三方机构作为公钥的信任中心。这可能导致单点故障和中心化的问题。

  4. 不适用于大数据处理:由于数字签名算法涉及大量的数学运算,对于大量数据的处理可能会导致性能下降。因此,对于大数据环境,可能需要采用其他更高效的签名算法。

综上所述,数字签名算法具有确保身份验证、数据完整性和不可否认性的优点,但也存在计算复杂度高、需要公钥分发、需要信任中心和不适用于大数据处理等缺点。在实际应用中,需要根据具体的需求和情况选择最合适的数字签名算法。

4、应用场景

4.1 举例说明各种加密算法在实际应用中的场景及使用方法

各种加密算法在实际应用中的场景和使用方法是多种多样的。以下是一些常见的示例:

  1. 对称加密算法(例如AES):
  • 场景:对大量数据进行加密和解密,例如在保护数据库中的敏感信息、存储在云中的文件或通信过程中的大量数据传输。
  • 使用方法:使用相同的密钥进行加密和解密。发送方使用密钥对数据进行加密,接收方使用相同的密钥对数据进行解密。

     2. 非对称加密算法(例如RSA):

  • 场景:在需要安全地进行密钥交换和数字签名的情况下使用。常见的应用包括访问控制、电子邮件加密、身份验证和安全的远程访问。
  • 使用方法:使用一对密钥,包括公钥和私钥。公钥用于加密消息和验证签名,私钥用于解密消息和生成签名。

     3. 哈希算法(例如SHA-256):

  • 场景:保护数据完整性,通常用于验证文件或消息是否在传输过程中被篡改。
  • 使用方法:将输入数据传递给哈希函数,生成唯一的固定长度哈希值。可以比较两个哈希值是否相等来验证数据是否被篡改。

     4. 数字签名算法(例如ECDSA):

  • 场景:在需要身份验证和数据完整性保护的情况下使用,例如在电子商务交易中。
  • 使用方法:使用私钥对消息的哈希值进行签名,生成一个唯一的数字签名。接收方使用发送方的公钥验证签名的有效性。

这些只是一些常见的示例,实际上各种加密算法可以根据具体的应用场景和安全需求进行组合和定制。

4.2 分析加密算法的适用性和安全性要求

加密算法的适用性和安全性要求是评估加密算法是否适用于特定的应用场景,并且能够提供足够的安全保障。以下是分析加密算法的适用性和安全性要求的一些关键点:

  1. 安全性要求:加密算法的安全性要求包括抵抗各种攻击的能力,例如穷举攻击、差分攻击、线性攻击等。安全性要求包括对明文、密文和密钥的机密性、完整性和可用性的保护。

  2. 适用性:加密算法的适用性要求是指该算法能够满足特定应用场景的需求。例如,一些应用场景可能需要高速的加密和解密速度,而另一些场景可能需要支持大量并发连接或者低延迟。因此,适用性要求涉及性能、资源消耗和可伸缩性等方面。

  3. 算法强度:加密算法的强度决定了其抵抗攻击的能力。算法强度可以通过分析算法的数学性质、密钥长度以及对已知攻击的抵抗能力来评估。强度越高,破解难度越大,安全性越高。

  4. 可信度:加密算法的可信度是指算法被广泛接受和认可的程度。可信度包括算法的可审计性、公开性和标准化程度。算法的可信度对于其在实际应用中的可靠性和安全性非常重要。

  5. 算法设计:加密算法的设计要考虑到各种攻击和漏洞,以及算法的可扩展性和灵活性。算法设计的好坏直接关系到算法的安全性和性能。

总结来说,加密算法的适用性和安全性要求是一个综合考虑各种因素的过程,包括算法的强度、性能、资源消耗、可信度和设计等方面。只有在这些要求得到满足的情况下,才能确保加密算法能够提供足够的安全保障。

5、结语

        文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!

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

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

相关文章

ubuntu更换国内镜像源,下载增速

方法一:通过脚本更换源 1.备份原来的源 sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 将原来的源保留一下,以后想用还可以继续用 2.更换源 sudo gedit /etc/apt/sources.list 使用gedit打开文档,将下面的阿里源复制进去&am…

Java零基础入门-java8新特性(完结篇)

一、概述 ​上几期,我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念,而这一期,我们要来玩点好的东西,那就是java8,我们都知道java8是自2004年发布java5之后最重要且一次重大的版本更新&a…

走进车厂 | 移远通信以前沿车载技术,照亮智能网联汽车产业创新发展之路

无钥匙自动解锁方便快捷、实时路况导航精准高效、语音指令轻松控制车辆、车载娱乐系统丰富多样……随着智能化、数字化浪潮的不断推进,现如今的汽车出行焕然一新。 正如我们所见,汽车产业正在经历前所未有的变革。物联网、车联网等前沿技术的发展和应用&…

idea Springboot校园新闻系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 校园新闻发布系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库&a…

ubuntu无法粘贴复制windows中的内容,分辨率无法自适应电脑自带系统

1、直接在命令行执行以下命令 sudo apt-get autoremove open-vm-tools //卸载已有的工具 sudo apt-get install open-vm-tools //安装工具open-vm-tools sudo apt-get install open-vm-tools-desktop //安装open-vm-tools-desktop 2、重启Ubuntu系统即可 3.如果上述…

mbti,ESTP型人格的心理问题分析

什么是ESTP型人格 ESTP分别代表外向,实感,理智,依赖,而ESTP型人格则是一种性格上十分激进,喜欢冒险,并且总是因为情绪起伏过大,而一下子做出应激行为的相对冒险的人格。具有ESTP型人格的人一般…

蓝桥杯 --- 日期问题模板

目录 1.如何判断闰年 2.如何遍历当前年份的每一天 3.如果想要输出某一年某一天到某一年某一天之间一共有多少天。 4.精确到具体周几到周几的问题分析 5.如何直接通过一层for循环枚举年月日 习题: 蓝桥杯竞赛特别喜欢考日期问题,今天给大家分享一下…

EfficientVMamba实战:使用 EfficientVMamba实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

HarmonyOS(鸿蒙)——单击事件

2.4 实现ClickedListener接口并重写onClick方法 2.5 实现onClick方法中的具体逻辑,以此完成点击事件的相关业务操作 三、测试 3.1 登录远程模拟器 3.2 运行项目 四、精选好文 一、简介 1.1 什么是组件 组件就是文本、按钮、图片等元素的统称 1.2 什么是事件 …

grep无法使用完整的正则表达式

问题描述 grep无法使用完整的正则表达式,比如前置断言、后置断言、\d和\t、\n等 问题原因 使用了扩展正则,而不是perl正则。规则和perl正则不同 从文档上讲得很清楚: -E PATTERN is an extended regular expression 他是扩展表达式&#…

C++ 不同进制数的表示和转换

在 C++ 中,可以使用不同的方式来表示和转换不同进制数,包括二进制、八进制、十进制和十六进制。 1. 不同进制数的表示 #include <iostream>int main() {int binary = 0b1010; // 二进制,以 0b 或者 0B 开头int octal = 012; // 八进制,以 0 开头int decimal =…

AI编程005/ 逆向生成mysql的建表语句

1/ 通过insert into 语句生成建表语句 有些时候我们能获取到表的insert语句&#xff0c;但是没有表结构。我们可以借助AI工具&#xff0c;让其逆向生成mysql的建表语句。 提示词如下&#xff1a; 根据下面的SQL语句&#xff0c;逆向生存mysql的建表语句&#xff0c;每个字段…

Elasticsearch 8.x ELK 搭建并配置 SSL

说明&#xff1a;这只是本人在家里组网搭建的集群&#xff0c;所以内容排版可能比较随意了&#xff0c;没有耐心的同学直接跳过去看别的文章吧&#xff0c;我只是放在这里留作记录方便以后翻阅 ELK 的坑实在太多了&#xff0c;自己在物理机(多台)逐渐摸索的&#xff0c;安装最新…

洞察规则与人情:游走于无形的智者

在这个纷繁复杂的世界里&#xff0c;规则和人情构成了我们日常生活的框架和纽带。然而&#xff0c;有些人似乎拥有一种特殊的能力&#xff0c;他们能够洞察这些规则和人情的本质&#xff0c;甚至能够在一定程度上操纵和改变它们。这些人&#xff0c;我们可以称他们为游走于无形…

一文掌握线程池实现原理

线程池简介 Java在使用线程执行程序时&#xff0c;需要调用操作系统内核的API创建一个内核线程&#xff0c;操作系统要为线程分配一系列的资源&#xff1b;当该Java线程被终止时&#xff0c;对应的内核线程也会被回收。因此&#xff0c;频繁的创建和销毁线程需要消耗大量资源。…

提高空调压缩机能效的通用方法

压缩机的能效提高主要依靠技术改进而不是大幅度增加材料的消耗&#xff0c;这也是技术经济性最好的节能手段。 1、改进电机效率&#xff0c;电机效率的提高意味着压缩机电效率的提高和压缩机总体效率的提高&#xff1b; 1.1、降低定子铜耗 降低定子绕组中电流通过所产生的铜耗…

Android Studio下载及安装和Gradle的配置(非常详细)从零基础入门到精通,看完这一篇就够了

文章目录 下载安装修改Sdk的位置创建项目修改Gradle的位置查看AS版本工具栏–View项工具栏–Build下的功能说明Build Variants视图说明下载模拟器&#xff08;avd&#xff09;/安卓虚拟设备 屏幕熄灭功能关闭虚拟设备功能删除自己开发的应用软件将开发的应用运行到虚拟设备上。…

如何快速写出漂亮的Button按钮呢?

你是否曾在浏览网页时&#xff0c;被那些色彩鲜艳、功能多样的按钮所吸引&#xff1f;无论是提交表单&#xff0c;还是触发一个动作&#xff0c;按钮都扮演着不可或缺的角色。今天聊聊网页设计中的 <button> 标签。 1. 基础语法 什么是 <button> 标签 <butto…

GIS水文分析计算流向学习

1 初步操作 流向&#xff0c;即水文表面水的流向&#xff1b; 水文分析的很多功能需要基于流向栅格&#xff1b; 在 SuperMap 中&#xff0c;对中心栅格的8个邻域栅格进行编码&#xff1b; 每一个中心栅格的水流方向都由这八个值中的某一个值来确定&#xff1b; 我还没弄懂水…

在 Git Bash 中调整字体大小,可以按照以下步骤进行操作,注意这里是linux虚拟机,命令都是Linux方式的

在 Git Bash 中调整字体大小&#xff0c;可以按照以下步骤进行操作&#xff1a; 打开 Git Bash 终端。 在终端中&#xff0c;点击顶部菜单栏的 "Options"&#xff08;选项&#xff09;。 在弹出的下拉菜单中&#xff0c;选择“text”文本 右侧font那里&#xf…