AES入门 万字详解(附推荐论文和研究领域)

news2024/11/17 5:37:30

目录

前言

加密过程

SubBytes(字节替换)

ShiftRows(行移位)

MixColumns(列混淆)

AddRoundKey(轮密钥加)

轮密钥生成过程

概述

具体步骤

代码实现方式

Java + Java Cryptography Architecture (JCA):

Python + Cryptography库:

Python示例

安全性分析

不同加密模式

加密模式分类

AES 与不同加密模式结合

如果要深入研究AES, 论文与研究领域推荐

论文

研究领域


前言

密码学是研究保护信息安全的科学,主要涉及加密和解密的方法。在密码学中,对称加密算法使用相同的密钥进行加密和解密操作,而分组密码是一种按照固定长度对数据进行加密的算法。

对称加密算法可以进一步分为块密码流密码。块密码将输入数据划分为固定大小的数据块,然后对每个数据块进行加密。而流密码将输入数据与密钥流进行异或运算,逐位地对数据进行加密。

AES(Advanced Encryption Standard)是一种块密码,它是目前最常用和广泛应用的对称加密算法之一。它在1997年由比利时密码学家Joan Daemen和Vincent Rijmen所设计,并于2001年成为美国联邦政府采用的标准加密算法。

AES算法的设计目标是提供高度安全性和较高的性能。它支持不同的密钥长度(128位、192位和256位),并采用迭代的轮函数来加密数据。

加密过程

AES算法主要由四个操作构成:SubBytes、ShiftRows、MixColumns和AddRoundKey。这些操作在每个加密轮次中进行,并且每个轮次都有不同的轮密钥。

  1. SubBytes(字节替换):SubBytes操作是AES算法中的非线性操作。它将输入的每个字节替换为S盒中对应位置的字节。S盒是一个固定的字节替换表,用于提供混淆和扩散的作用。

  2. ShiftRows(行移位):ShiftRows操作对输入的状态矩阵进行行移位。在AES算法中,第一行保持不变,第二行向左循环移动一个字节,第三行向左循环移动两个字节,第四行向左循环移动三个字节。这个操作使得每一列的字节在不同的行中进行混洗。

  3. MixColumns(列混淆):MixColumns操作对输入的状态矩阵的每一列进行线性变换。它使用一个固定的矩阵乘法来混淆每一列的字节,增加AES算法的扩散性质。

  4. AddRoundKey(轮密钥加):AddRoundKey操作对输入的状态矩阵与当前轮次的轮密钥进行异或运算。轮密钥是由主密钥经过密钥扩展算法生成的,每个轮次都有一个对应的轮密钥。

这些操作被迭代应用于输入数据,通常在10个加密轮次中完成(具体取决于密钥长度)。在每个加密轮次之后,密钥都会经过一系列的变换,以增加安全性。

密钥扩展算法是AES算法中的另一个重要部分。它根据初始密钥生成每个轮次所需的轮密钥。密钥扩展算法使用SubBytes和循环左移操作来生成轮密钥,并在每个轮次中应用列混淆操作。

SubBytes(字节替换)

SubBytes操作是AES算法中的非线性操作,它将输入的每个字节替换为S盒中对应位置的字节。S盒是一个固定的字节替换表,用于提供混淆和扩散的作用。

示例: 假设我们有一个输入状态矩阵(4x4矩阵),表示为以下16个字节的十六进制值:

53 65 63 72
65 74 20 41
45 53 20 61
65 73 74 68

SubBytes操作将根据S盒将每个字节替换为对应的字节值。这里是一个示例S盒的部分内容

S盒: 
63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76

 进行SubBytes操作后的结果:

8F 84 EB 49
84 A8 8D 20
49 8D 20 3E
A8 F6 20 F2

在实际的AES算法中,S盒是一个更大的表,但这个示例能够帮助你理解SubBytes操作的概念。 

ShiftRows(行移位)

ShiftRows操作对输入的状态矩阵进行行移位。在AES算法中,第一行保持不变,第二行向左循环移动一个字节,第三行向左循环移动两个字节,第四行向左循环移动三个字节。这个操作使得每一列的字节在不同的行中进行混淋。

示例: 假设我们有一个输入状态矩阵,经过SubBytes操作后的结果如下:

8F 84 EB 49
84 A8 8D 20
49 8D 20 3E
A8 F6 20 F2

 经过ShiftRows操作后,状态矩阵的行发生了移位:

8F 84 EB 49
A8 8D 20 84
20 3E 49 8D
F2 A8 F6 20

通过行移位,AES算法在每一列中进行了字节的混淋,增加了加密的强度。 

MixColumns(列混淆)

MixColumns操作对输入的状态矩阵的每一列进行线性变换。它使用一个固定的矩阵乘法来混淆每一列的字节,增加AES算法的扩散性质。

示例: 假设我们有一个经过ShiftRows操作后的状态矩阵:

8F 84 EB 49
A8 8D 20 84
20 3E 49 8D
F2 A8 F6 20

经过MixColumns操作后,每一列的字节将进行混淆: 

8F A8 20 F2
84 8D 3E A8
EB 20 49 F6
49 84 8D 20

MixColumns操作通过矩阵乘法将每一列的字节进行线性混淆,增加了加密算法的复杂性和安全性。 

AddRoundKey(轮密钥加)

AddRoundKey操作对输入的状态矩阵与当前轮次的轮密钥进行异或运算。轮密钥是由主密钥经过密钥扩展算法生成的,每个轮次都有一个对应的轮密钥。

示例: 假设我们有一个经过MixColumns操作后的状态矩阵:

8F A8 20 F2
84 8D 3E A8
EB 20 49 F6
49 84 8D 20

当前轮次的轮密钥如下(与状态矩阵的大小相匹配):

 10 51 31 2B
 AE 03 10 32
 D5 42 B3 E4
 57 C1 9D 79

 经过AddRoundKey操作后,状态矩阵的每个字节与轮密钥对应的字节进行异或运算:

9F F9 11 D9
2A 8E 2E 9A
3E 62 78 12
1E 45 10 59

AddRoundKey操作通过与轮密钥的异或运算,将轮密钥的信息引入到状态矩阵中,进一步增加了AES算法的复杂性和安全性。 

这样,我们就详细解释了AES算法的四个操作,并通过示例说明了它们的作用。这些操作在每个加密轮次中迭代应用,使得AES算法能够提供高度的安全性和扩散性质。

轮密钥生成过程

概述

轮密钥是通过主密钥经过密钥扩展算法生成的。密钥扩展算法将主密钥转换为每一轮所需的轮密钥。

密钥扩展算法涉及以下步骤:

  1. 初始轮密钥生成:

    • 首先,将主密钥拆分为与状态矩阵大小相匹配的若干个字。
    • 这些字作为初始轮密钥。
  2. 轮密钥扩展:

    • 接下来,通过迭代应用密钥扩展算法生成额外的轮密钥。
    • 密钥扩展算法根据当前轮密钥和特定的算术运算生成下一轮的轮密钥。

具体的密钥扩展算法如下:

  1. 密钥扩展算法的第一步是将初始轮密钥作为每一轮的轮密钥。

  2. 对于之后的每一轮(从第1轮到第n轮),执行以下操作:

    • 将前一轮的最后4个字节作为"暂存区"。
    • 对"暂存区"执行一系列的变换:
      • 字节向左循环移位。
      • 对每个字节进行S盒字节替换(SubBytes操作)。
      • 对"暂存区"的第一个字节与固定的轮常数进行异或运算。
    • 将变换后的"暂存区"与前一轮的第一个字节到第四个字节进行异或运算,生成当前轮的轮密钥。
  3. 重复步骤2,直到生成所有所需的轮密钥。

注意:在AES算法中,轮密钥的长度与状态矩阵的大小相匹配。对于128位密钥,轮密钥的总长度为176位(11个字,每个字16位)。对于192位密钥,轮密钥的总长度为208位(13个字)。对于256位密钥,轮密钥的总长度为240位(15个字)。

通过密钥扩展算法,AES算法可以生成每一轮所需的轮密钥。这些轮密钥与状态矩阵进行异或运算,提供了加密过程中的混淆和扩散效果,从而增加了AES算法的安全性和复杂性。

具体步骤

让我们以128位密钥为例,演示AES算法中轮密钥的生成过程。

假设我们有一个128位的主密钥(16个字节),表示为以下十六进制值:

主密钥:2B 7E 15 16 28 AE D2 A6 AB F7 15 88 09 CF 4F 3C

首先,我们将主密钥分割成四个字

在AES算法中,一个字表示一个数据单元,它的大小由算法的密钥长度确定。在AES中,字的大小为32位,即4个字节。

每个字节由8位组成,因此一个字由4个字节组成,即: 1 字 = 4 字节 = 4 x 8 = 32 位

这个32位的字是AES算法中的基本单位,用于进行状态矩阵和轮密钥的操作。

): 

2B 7E 15 16
28 AE D2 A6
AB F7 15 88
09 CF 4F 3C

这些字作为初始轮密钥,即第0轮的轮密钥

接下来,我们将应用密钥扩展算法生成其他轮的轮密钥。

 第1轮的轮密钥生成:

第一个字(W[0])到第四个字(W[3])来自初始轮密钥:

W[0] = 2B 7E 15 16
W[1] = 28 AE D2 A6
W[2] = AB F7 15 88
W[3] = 09 CF 4F 3C

 对于后续的字(W[4]到W[43]),按照变换规则生成:

首先,我们对 w[3] 进行循环左移一位,并进行S盒替换,然后与轮常数进行异或运算。这样我们得到 w[4]

w[3]: 0x09CF4F3C
RotWord: 0xCF4F3C09
SubWord: 0x8A84EB01
Rcon(1): 0x01000000
w[4]: 0x8A84EB01 ^ 0x01000000 = 0x8B84EB01

代码解释:

  • w[3]: 0x09CF4F3C: 这表示在密钥扩展过程中生成的第3个字(w[3]),其十六进制表示为0x09CF4F3C。

  • RotWord: 0xCF4F3C09: 这是将第3个字进行循环左移操作得到的结果,其中字节顺序发生了变化。在这个例子中,字节0x09移动到了字节0xCF的位置。

  • SubWord: 0x8A84EB01: 这是将RotWord得到的结果应用S盒变换(SubBytes)得到的新字。S盒是AES中的一个非线性变换,用于替换字节的值。

  • Rcon(1): 0x01000000: 这表示轮常数(Rcon)的值,它是在密钥扩展过程中使用的固定常数。在这个例子中,Rcon的值为0x01000000,表示第一个轮常数。

  • w[4]: 0x8A84EB01 ^ 0x01000000 = 0x8B84EB01: 这是根据前面的结果计算得到的第4个字(w[4]),通过将SubWord的结果与Rcon(1)进行异或操作得到。在这个例子中,0x8A84EB01和0x01000000异或的结果为0x8B84EB01。

接下来,我们根据 w[4]w[0] 进行异或运算,得到 w[5]

w[4]: 0x8B84EB01
w[0]: 0x2B7E1516
w[5]: 0x8B84EB01 ^ 0x2B7E1516 = 0xA0FAFE17

 w[4]、w[5]、w[6]和w[7]拼接在一起就形成了第二个轮密钥。在AES密钥扩展过程中,每4个字(32位)的组合形成一个完整的轮密钥。

密钥扩展过程将继续进行,生成一共44个32位字。每4个进行组合,就形成11个轮密钥

代码实现方式

Java + Java Cryptography Architecture (JCA):

Java是一种广泛使用的编程语言,也有很好的密码学支持。

Java Cryptography Architecture (JCA)是Java平台的密码学架构,提供了AES算法的实现。

你可以使用Java编写代码,利用JCA中的相关类和方法来实现AES算法的加密和解密操作。

Python + Cryptography库:

Python是一种简单易学且广泛使用的编程语言,适合用于实现算法。

Cryptography是一个功能强大的密码学库,提供了AES算法的实现。

你可以通过安装Cryptography库来开始实践,具体的安装方法可以参考Cryptography官方文档。

一旦安装完毕,你可以编写Python代码来使用Cryptography库实现AES算法的加密和解密操作。

Python示例

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import secrets

def aes_encrypt(key, plaintext):
    """
    使用AES算法对明文数据进行加密。

    Args:
        key (bytes): 密钥,长度为128位。
        plaintext (bytes): 待加密的数据。

    Returns:
        bytes: 加密后的密文数据。
    """
    backend = default_backend()    # 创建一个默认的后端实例

    # 创建一个Cipher对象,指定使用的AES算法和加密模式(ECB模式)
    cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=backend)

    # 创建一个加密器(encryptor)对象
    encryptor = cipher.encryptor()

    # 调用加密器的update()方法对明文数据进行加密
    ciphertext = encryptor.update(plaintext) + encryptor.finalize()

    """
    update()方法接受明文数据作为输入,并返回部分加密的密文数据。
    finalize()方法用于处理最后的加密块,并返回最终的密文数据。
    将部分密文数据和最终密文数据相加得到完整的密文数据。
    """

    return ciphertext

def aes_decrypt(key, ciphertext):
    """
    使用AES算法对密文数据进行解密。

    Args:
        key (bytes): 密钥,长度为128位。
        ciphertext (bytes): 待解密的数据。

    Returns:
        bytes: 解密后的明文数据。
    """
    backend = default_backend()
    cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=backend)
    decryptor = cipher.decryptor()
    plaintext = decryptor.update(ciphertext) + decryptor.finalize()
    return plaintext

# 生成随机密钥
key = secrets.token_bytes(16)  # 生成一个16字节(128位)的随机密钥

# 示例用法
plaintext = b'Hello, AES!'  # 待加密的数据

ciphertext = aes_encrypt(key, plaintext)
print("加密后的结果:", ciphertext)

decrypted_text = aes_decrypt(key, ciphertext)
print("解密后的结果:", decrypted_text.decode())

安全性分析

密钥长度:AES支持不同密钥长度,包括128位、192位和256位。较长的密钥长度提供更高的安全性,因为破解一个更长的密钥所需的计算复杂度更高。目前,AES的128位密钥长度已经被广泛接受为安全的,尽管仍然没有找到有效的攻击方法来破解AES。

均匀性:AES设计的一个重要特征是其S盒、行移位和列混淆等操作的均匀性。这意味着每个输入和输出位之间的关系是复杂和非线性的,增加了密码分析者分析密文以及从中推导出密钥的难度。

密钥扩展:AES使用密钥扩展算法来生成多个轮密钥,这些轮密钥用于加密和解密的每一轮。密钥扩展算法的复杂性增加了对密钥的破解难度,因为即使攻击者获得部分密钥信息,也难以从中恢复出完整的密钥。

差分和线性密码分析:AES的设计考虑了差分和线性密码分析等密码分析方法。这些分析方法试图利用明文-密文对之间的关联性,从而获取密钥信息。AES的结构和变换操作在一定程度上阻碍了这些攻击,使得成功进行差分和线性密码分析变得非常困难。

基于时间和空间的攻击:在一些特定的情况下,可以利用AES的实现漏洞或者侧信道攻击来破解密钥。这些攻击方法通常需要物理接触或者特定环境条件,并且对硬件或软件实现的细节敏感。因此,实施者需要注意对AES算法的正确实现和防范侧信道攻击。

不同加密模式

加密模式分类

可以参考我写的这篇文章

密码学中的加密模式icon-default.png?t=N5F7http://t.csdn.cn/FJVVM

AES 与不同加密模式结合

AES-CBC模式(Cipher Block Chaining)

特点:每个明文块与前一个密文块进行异或操作,提供较高的安全性。支持并行加密和解密。

优点:较好的安全性,适用于保护机密性较高的数据。

缺点:性能较低,对于长时间的数据传输可能会有延迟。需要管理初始向量(IV)的生成和传输。

常用领域:网络通信、文件加密、数据库加密等。

AES-ECB模式(Electronic Codebook)

特点:每个明文块都独立加密,简单易实现。

优点:加密和解密过程简单。

缺点:相同的明文块会生成相同的密文块,可能存在安全性问题。不适合加密大量数据或需要保护机密性的数据。

常用领域:少量数据加密,图像加密,简单加密需求等。

AES-CFB模式(Cipher Feedback)

特点:将前一个密文块的输出与密钥流进行异或操作,支持按块加密。

优点:支持并行加密和解密,可以灵活地控制反馈位数。

缺点:对于实时性要求高的应用可能存在延迟。需要管理密钥流的生成和传输。

常用领域:流式数据加密,实时通信,安全传输协议等。

AES-OFB模式(Output Feedback)

特点:将前一个密文块的输出作为输入进行加密,生成独立的密钥流。

优点:支持并行加密和解密,适用于流式数据加密。

缺点:不提供数据完整性验证,可能存在重放攻击。需要管理密钥流的生成和传输。

常用领域:流媒体加密,实时数据传输,安全存储等。

AES-CTR模式(Counter)

特点:使用计数器生成密钥流,支持并行加密和解密。

优点:高效的并行加密和解密,适用于流式数据加密。

缺点:不提供数据完整性验证,可能存在重放攻击。需要管理计数器的生成和传输。

常用领域:高性能数据加密,云存储加密,实时通信等。

如果要深入研究AES, 论文与研究领域推荐

论文

Joan Daemen and Vincent Rijmen, "AES Proposal: Rijndael" (1999) - 这是AES算法的原始提案论文,详细介绍了AES的设计原理和算法细节。

Vincent Rijmen and Joan Daemen, "The Design of Rijndael: AES - The Advanced Encryption Standard" (2002) - 这是一篇关于AES算法设计的详细论文,深入探讨了AES的结构、密钥扩展和加密过程。

Lars R. Knudsen, "The Block Cipher Square" (1997) - 这篇论文介绍了AES算法的一个重要候选方案——Square密码,对AES的设计起到了一定的影响。

Matthew J.B. Robshaw and Stefan J. Fluhrer, "AES Proposal: The Rijndael Block Cipher" (1999) - 这篇论文对AES算法的性能和安全性进行了详细分析和评估,并提供了一些实验结果和比较。

Niels Ferguson, "Improved Cryptanalysis of Rijndael" (2001) - 这篇论文探讨了对Rijndael算法(即AES的前身)的改进型密码分析攻击方法,对于理解AES的安全性和防御机制有一定的参考价值。

除了上述论文,还有许多与AES相关的研究论文、学术文章和标准文档可供参考。可以进一步搜索与AES相关的学术数据库和加密学领域的期刊,如IEEE Transactions on Information Theory、Journal of Cryptology等,以获取更多深入的信息和研究成果。

研究领域

AES在网络安全中的应用:你可以研究有关AES在网络通信和数据传输中的应用,例如基于AES的VPN(Virtual Private Network)、TLS/SSL(Transport Layer Security/Secure Sockets Layer)协议的加密等。相关论文可能包括关于网络安全协议的研究、数据保护机制和加密通信的安全性分析。

AES在云计算和数据隐私中的应用:研究AES在云计算环境下的数据加密和隐私保护方面的应用。相关论文可能涉及基于AES的云存储加密、数据安全外包、可搜索加密等方面的研究。

AES在物联网(IoT)中的应用:研究AES在物联网设备和通信中的应用,例如安全的传感器网络、物联网通信协议的加密保护等。相关论文可能涉及物联网安全、轻量级密码学算法和AES在资源受限设备上的实施等方面的研究。

AES在移动设备和移动应用中的应用:研究AES在移动设备上的应用,如移动应用程序的数据加密、移动支付的安全性等。相关论文可能包括移动安全、移动应用隐私保护和加密算法在移动平台上的性能优化等方面的研究。

AES在硬件实现和加速方面的应用:研究AES在硬件设备上的实现和加速技术,如使用专门的加密硬件、FPGA(Field Programmable Gate Array)和ASIC(Application-Specific Integrated Circuit)等。相关论文可能涉及硬件安全、AES的硬件优化和高性能加密芯片设计等方面的研究。

要了解这些领域的研究和应用问题,可以查阅相关的学术数据库、国际会议论文集和学术期刊,如ACM Transactions on Information and System Security、IEEE Transactions on Dependable and Secure Computing等。此外,关注加密学、网络安全和信息安全领域的国际会议和研讨会,例如ACNS(Applied Cryptography and Network Security)、NDSS(Network and Distributed System Security Symposium)等,也可以获取最新的研究成果和学术论文。

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

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

相关文章

Build your own unconditional confidence

不要活在既定的社会价值体系中 人类的偏好大多数时候都是愚昧的 I play whatever gods give me 情绪价值稳定 解决问题的能力 Dont label yourself 真正的强者不会吝啬对他人的赞美 敬畏自然,敬畏未知事物 核心是你对这个事情是否感兴趣,觉得有价…

Java-三种基本控制结构及相关面试题

文章目录 前言一、 顺序控制结构1.1 概念1.2 代码1.3 NS图中体现 二、分支控制结构2.1 概念2.2 if语句2.3 switch语句2.4 NS图中的体现 三、循环控制结构3.1 概念3.2 for循环3.3 while循环3.4 do-while循环3.5 增强 for 循环NS图中的体现 四、相关面试题什么是控制流语句&#…

springboot解析@transaction注解原理

目录 第一步、全局搜索Transactional.class 第二步、查看哪里配置BeanFactoryTransactionAttributeSourceAdvisor 第四、SpringTransactionAnnotationParser是什么时候被注入的 第三、总结 先看一下transaction的官网文档 16. Transaction Management 第一步、全局搜索Tr…

Ansible-playbook-roles安装lnmp

使用roles安装lnmp 1、准备四台主机 192.168.142.10 192.168.142.20 192.168.142.30 192.168.142.40 2、10作为ansible管理端 首先ssh连接剩下三台主机 3、vim/etc/ansible/hosts 添加[nginxservers]配置nginx ip,[phpservers]php ip,[mysqlservers]mysql ip 4、cd /etc/ansibl…

ubuntu 20.04 qemu arm64 linux6.3.8 开发环境搭建

开发环境 ubuntu 20.04 VMware Workstation Pro 16 基于qemu(模拟器),ARM64 :virt cortex-a57 平台 搭建Linux 6.3.8 (当前最新版本) 准备 Linux 内核下载,下载最新稳定版本,当前为 linux-…

基于ipv6实现几乎零成本的内网穿透方案,小白的踩坑历程与经验分享

基于ipv6实现几乎零成本的内网穿透方案,小白的踩坑历程与经验分享 前言 最近想远程访问家里nas的想法老在脑海中浮现,原因大概是本人二开了一个管理系统,并在上面跑了些定时任务做自动化,就有了远程访问系统的需求。同时又想到&…

Python潮流周刊#7:我讨厌用 asyncio

△点击上方“Python猫”关注 ,回复“1”领取电子书 你好,我是猫哥。这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明。(标题取自其中一则分享,不代表全部内容都是该主题&#xff…

MySQL 数据库初体验

文章目录 数据库的基本概念数据表数据库数据库管理系统数据库系统 数据库的发展史当今主流数据库介绍SQL Server (微软公司产品)Oracle (甲骨文公司产品)DB2 (IBM公司产品)MySQL (甲骨文公司收购…

S7-200 PLC通信方式有哪些

更多关于西门子S7-200PLC内容请查看:西门子200系列PLC学习课程大纲(课程筹备中) S7-200 PLC通信按通信对象方式分为三种情况:A.与计算机通信;B.与其他PLC通信;C.与其他设备和仪器通信; A.S7-200 PLC与计算机通信 如下图1-1 S7-…

长度延展攻击【密码学】(三)

一、什么是长度延展 假设有两段数据,S和M,以及一个单向散列函数h。 如果我们要将两段数据合并起来,并且还要计算合并后的散列值,这就叫做单向散列函数的长度延展。 二、长度延展攻击 如果S和M都是公开信息,那么S在前还…

网络层:网际控制报文协议ICMP

网络层:网际控制报文协议ICMP 笔记来源: 湖科大教书匠:网际控制报文协议ICMP 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 主机或路由器使用ICMP来发送差错报告报文和询问报文 ICMP报文被封装在IP数据报中发送…

合宙Air724UG Cat.1模块硬件设计指南--I2C接口

I2C接口 简介 I2C总线(Inter-Integrated Circuit)是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。 特性 支持 Fast mode (400Kbps)和 Slow mode&…

探索人工智能在自动化测试中的应用

自动化测试技术从最初的模拟硬件方式,到基于数据驱动,基于关键字驱动,再到现在基于功能和指令驱动的自动化测试技术,在各类软件项目中的应用也越来越多,越来越成熟。自动 背景 自动化测试技术从最初的模拟硬件方式&a…

MATLAB | 如何使用MATLAB获取顶刊《Nature》全部绘图(附带近3年全部图像)

我出了如何使用MATLAB获取期刊《Cell》全部绘图,立马就有粉丝问《Nature》、《Sience》、《PNAS》啥的会不会安排,这期就给大家安排《Nature》全部绘图获取,之后其他期刊也会慢慢安排,但是不会一次性全出完(毕竟不能抓住一个主题就…

【第三次】21级计科计算机组成原理课外练习

【第三次】21级计科计算机组成原理课外练习 一、单选题二、填空题三、程序填空题 一、单选题 2-1假设变量x的位数为n(n>8),x的最低有效字节不变,其余各位全变为0,则对应C语言表达式为。 A.x | ~ 0xFF B.x ^ 0xFF C…

css基础四:说说设备像素、css像素、设备独立像素、dpr、ppi 之间的区别?

一、背景 在css中我们通常使用px作为单位,在PC浏览器中css的1个像素都是对应着电脑屏幕的1个物理像素 这会造成一种错觉,我们会认为css中的像素就是设备的物理像素 但实际情况却并非如此,css中的像素只是一个抽象的单位,在不同…

循环码生成矩阵与监督 (校验) 矩阵

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 循环码生成多项式与…

详解七层反向代理与四层反向代理【Nginx+Tomcat负载均衡、动静分离】

文章目录 1. 反向代理和正向代理概述2.七层反向代理实例2.1 实验环境描述2.2 部署Nginx负载均衡器2.3 部署2台Tomcat应用服务器2.3.1 部署CentOS 7-5 Tomcat服务器2.3.2 部署CentOS 7-6 Tomcat多实例服务器 3.四层反向代理实例3.1 实验环境描述3.2 部署Nginx负载均衡器&#xf…

2023年护网常见面试题汇总!看过的都通过面试啦!

​时间过得很快,回想起去年的这个时候,我也正在准备秋招,今天的我刚刚结束培训。 我的个人情况就读于某双非大学,信息与计算科学(大数据方向,校企合作,一个介于数学与计算机之间的专业&#xf…

JVM调优参数+Visual GC 插件安装及使用,jvm分析

调优的目的是什么呢? 1.就是让系统更加的丝滑,让用户体验变得更好。 2.提升系统的性能,提高效率,充分利用jvm内存。 更多参考->JVM常用调优参数 一.JVM参数配置位置 1.java.lang.OutOfMemoryError: Java heap space 解决方…