[CISSP] [6] 密码学和对称密钥算法
密码学的目标
1. 机密性(Confidentiality)
目标:保护信息不被未授权访问。
- 通过 加密(Encryption)技术确保数据只能被授权方解密和读取。
- 主要方法:
- 对称加密(AES、3DES):用于保护数据存储或高速传输。
- 非对称加密(RSA、ECC):用于安全通信和身份验证(如SSL/TLS)。
- 数据脱敏(Masking)、零知识证明(Zero-Knowledge Proofs)等技术。
2. 完整性(Integrity)
目标:确保数据未被篡改或损坏。
- 使用 哈希算法(Hashing) 生成唯一的摘要值,以检测数据篡改。
- 主要方法:
- 哈希函数(MD5、SHA-256):确保数据完整性。
- 消息认证码(MAC):如 HMAC-SHA256,验证数据完整性和真实性。
- 数字签名:结合哈希算法和公钥加密,确保数据和发送者的身份可信。
3. 可用性(Availability)
目标:确保加密数据在授权情况下仍然可以正常使用。
- 加密算法不能影响系统性能,数据在需要时必须可用。
- 主要方法:
- 密钥管理(Key Management):确保密钥安全存储和分发,避免因密钥丢失导致数据无法解密。
- 冗余和容错(Redundancy & Fault Tolerance):确保加密系统不会因单点故障而失效(如RAID、数据备份)。
- 抗拒绝服务攻击(防止 DoS/DDoS 对加密系统的影响)。
4. 真实性(Authentication)
目标:确保通信双方身份真实,防止伪造身份的攻击。
- 主要方法:
- 数字签名(Digital Signatures):使用公钥加密验证数据来源。
- PKI(公钥基础设施):通过数字证书(如 X.509 证书)验证用户身份。
- 多因素身份验证(MFA):结合密码学技术(如 OTP、FIDO2、证书认证)。
5. 抗抵赖性(Non-repudiation)
目标:防止发送者或接收者否认他们的行为。
- 主要方法:
- 数字签名:提供可靠的身份认证,防止发送者事后否认已发送的数据。
- 时间戳(Timestamping):记录交易时间,确保数据的法律效力。
- 区块链技术:去中心化的交易记录,提高数据可信度。
柯克霍夫原则(Kerckhoffs’s Principle)
柯克霍夫原则(Kerckhoffs’s Principle) 是密码学中的一个核心原则,由荷兰密码学家奥古斯特·柯克霍夫(Auguste Kerckhoffs) 在 1883 年提出。该原则的核心思想是:
“密码系统的安全性不应依赖于算法的保密性,而应仅依赖于密钥的保密性。”
柯克霍夫原则的关键要点包括:
- 加密算法可以公开:攻击者可以知道算法的具体实现,但仍无法破解消息。
- 密钥必须保密:系统的安全性应该完全依赖于密钥的机密性,而不是算法的隐秘性。
- 即使敌人掌握了整个系统(除了密钥),也无法轻易破解:换句话说,即使攻击者知道加密方法,只要密钥足够安全,攻击者仍无法解密数据。
- 系统应当是可用的:即使密钥丢失,系统仍应支持快速更换密钥,而不是整个系统报废。
Nonce(Number Once,随机数/一次性数值)
Nonce 是密码学和计算机安全领域中的一个一次性使用的随机数或计数器值,通常用于防止重放攻击、确保数据唯一性或增强加密安全性。
1. Nonce 的主要作用
Nonce 在加密系统中主要用于以下几个方面:
防止重放攻击(Replay Attack)
- 在身份验证或数据传输过程中,如果没有 Nonce,攻击者可以截取数据包并重复发送,导致安全漏洞。
- 解决方案:使用 随机 Nonce 或 递增计数器 Nonce,确保每条消息都是唯一的,防止重复攻击。
用于密码学协议
- TLS/SSL 握手:客户端和服务器在建立安全连接时,交换 Nonce 以防止旧密钥被重复使用。
- 区块链(如比特币):矿工需要找到一个合适的 Nonce,使得区块哈希满足特定条件(如比特币的 PoW 机制)。
- 加密算法(如 AES-GCM, ChaCha20-Poly1305):加密时,Nonce 确保每次加密生成不同的密文,即使明文相同。
确保随机性和唯一性
- 在加密过程中,Nonce 可以作为初始化向量(IV),确保相同的明文不会生成相同的密文,提高安全性。
- 在身份验证协议(如 Kerberos)中,Nonce 确保身份验证请求是唯一的,防止攻击者重复使用旧请求。
2. Nonce 的类型
Nonce 主要有两种类型:
类型 | 特点 | 应用场景 |
---|---|---|
随机 Nonce | 由加密安全的随机数生成器(CSPRNG)生成 | TLS、区块链、身份验证 |
计数器 Nonce | 递增的数值,确保唯一性 | AES-GCM、数据库事务 |
不同应用场景需要不同的 Nonce 生成方式。例如,在 TLS 协议中,使用的是 随机 Nonce,而 AES-GCM 加密模式通常使用 计数器 Nonce。
3. Nonce 示例
TLS/SSL 中的 Nonce
在 TLS 1.2 和 TLS 1.3 握手过程中,服务器和客户端会交换随机数(Nonce)以避免重放攻击:
Client Hello:Nonce: 0xA1B2C3D4E5F6...
Server Hello:Nonce: 0xF6E5D4C3B2A1...
这样,即使攻击者截获了 TLS 握手信息,无法重用相同的 Nonce 进行攻击。
零知识证明(Zero-Knowledge Proof, ZKP
零知识证明(ZKP, Zero-Knowledge Proof) 是一种密码学协议,允许证明者(Prover) 在不泄露任何秘密信息的情况下,向 验证者(Verifier) 证明自己知道某个秘密。
1. 零知识证明的特点
一个好的零知识证明协议需要满足 3 个关键特性:
- 完备性(Completeness)
- 如果证明者真的知道秘密,验证者就一定会验证通过。
- 可靠性(Soundness)
- 如果证明者不知道秘密,几乎不可能骗过验证者。
- 零知识性(Zero-Knowledge)
- 证明过程中,验证者无法获得任何关于秘密的信息,只知道证明者确实拥有这个秘密。
2. 经典的零知识证明示例
山洞问题(The Ali Baba Cave)
故事背景:
- 山洞有两个入口(A 和 B),里面有一个魔法门,只有知道魔法咒语的人才能打开。
- 佩姬(Peggy) 想向 维克多(Victor) 证明自己知道咒语,但又不想告诉维克多。
证明过程:
- 维克多站在洞外,要求佩姬随机从 A 或 B 进入山洞。
- 佩姬随便选一个入口(比如 A 进入)。
- 维克多在外面随机要求她从 A 或 B 出来。
- 如果佩姬真的知道魔法咒语,她就可以随意从任何出口出来。
- 这个过程重复多次,如果佩姬每次都成功,维克多就相信她知道咒语。
关键点:
- 维克多不会学到咒语(零知识性)。
- 如果佩姬不会咒语,她有 50% 的概率猜对出口,但多次测试后,骗过维克多的概率会接近 0(可靠性)。
3. 真实应用中的零知识证明
区块链 & 加密货币
- ZK-SNARKs & ZK-STARKs(零知识简洁非交互式知识论证):
- Zcash 使用 ZK-SNARKs 进行匿名交易,证明交易有效但不泄露金额和发送方信息。
- Ethereum 也在使用 ZK-Rollups 扩展网络,减少计算量,提高隐私性。
身份验证(无需密码)
- 零知识身份验证:证明用户拥有密码或身份信息,而不泄露具体内容。例如:
- 证明你是某个银行的客户,而不透露你的账户号码。
- 证明你超过 18 岁,而不透露你的出生日期。
电子投票
- 确保投票者的身份被验证,但不暴露他们投给了谁。
4. ZKP 的两种主要类型
类型 | 特点 | 代表应用 |
---|---|---|
交互式零知识证明(Interactive ZKP) | 证明者和验证者多次交互 | 经典的山洞问题 |
非交互式零知识证明(Non-Interactive ZKP, NIZK) | 只需提供一个证明文件,无需多次交互 | ZK-SNARKs、ZK-STARKs |
- ZK-SNARKs(简洁非交互式零知识证明):计算快,但需要可信初始化。
- ZK-STARKs(透明可扩展零知识证明):计算更复杂,但无需可信初始化,安全性更高。
5. 零知识证明的未来
- Web3 & 隐私保护:用于去中心化身份认证(DID)、DAO 投票、NFT 交易保护。
- 隐私支付:未来的银行可能会使用零知识证明处理交易,既能满足合规性,又能保护用户隐私。
- 人工智能 & 机器学习:零知识证明可以用于 AI 模型推理,确保数据安全。
Vernam密码(Vernam Cipher)
Vernam 密码是一种 一次性密码本(One-Time Pad, OTP) 加密方法,由 Gilbert Vernam 在 1917 年发明,被认为是唯一绝对安全的加密算法,但同时难以实际应用。
密码
1. 运动密钥密码(Dynamic Key Cipher)
运动密钥密码指的是加密过程中,密钥会不断变化,而不是使用固定密钥。例如:
- 一次性密码本(One-Time Pad, OTP):每个明文字符使用不同的密钥进行加密。
- 会话密钥(Session Key):TLS 等协议中,每次通信都会生成新的加密密钥。
- 动态密钥扩展(Dynamic Key Expansion):密钥根据某种算法动态变化,如 RSA+AES 组合加密。
优势:
增强安全性,避免长期密钥被攻击。
适用于安全通信协议,如 TLS、IPsec、SSH 等。
2. 块密码(Block Cipher)
块密码是一种对 固定大小的明文块 进行加密的算法,如 AES、DES。它通常将明文分成 多个固定长度的块(如 128 位),然后使用相同的密钥分别加密这些块。
常见的块密码算法:
- AES(高级加密标准):常见于 TLS、VPN、Wi-Fi WPA2 等。
- DES(数据加密标准)(已淘汰)。
- 3DES(三重 DES)(较老,已逐渐被 AES 取代)。
块密码的模式(Block Cipher Modes):
模式 | 特点 |
---|---|
ECB(电子密码本模式) | 不安全,相同明文加密结果相同,容易被分析。 |
CBC(密码块链接模式) | 每个块与上一个密文块 XOR,安全性更高。 |
CFB(密码反馈模式) | 适合流式数据加密。 |
OFB(输出反馈模式) | 适合流式数据加密,避免误差扩散。 |
GCM(Galois/Counter 模式) | 现代模式,支持认证加密(AEAD)。 |
示例(AES-CBC 模式):
from Crypto.Cipher import AES
from Crypto.Random import get_random_byteskey = get_random_bytes(16) # 生成 16 字节密钥
iv = get_random_bytes(16) # 生成 16 字节 IV
cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = b"Hello, World! " # 明文需要填充到 16 字节
ciphertext = cipher.encrypt(plaintext)
print("密文:", ciphertext.hex())
3. 流密码(Stream Cipher)
流密码是一种按 字节或比特 进行加密的算法,适用于 实时数据流(VoIP、视频通话)。它的加密密钥会不断变化,生成一个密钥流(Keystream),然后用 XOR 操作加密明文。
常见流密码算法:
- RC4(已被淘汰):曾用于 Wi-Fi WEP,现在不安全。
- ChaCha20:目前最安全的流密码之一,广泛用于 TLS 1.3、WireGuard VPN。
- Salsa20:ChaCha20 的前身,安全性较高。
流密码 vs 块密码:
对比项 | 块密码 | 流密码 |
---|---|---|
加密单位 | 固定大小的块(如 128 位) | 按位或按字节流式加密 |
速度 | 相对较慢 | 快,适用于实时通信 |
适用场景 | 硬盘加密、数据库加密 | VoIP、视频流加密 |
示例(ChaCha20 加密):
from Crypto.Cipher import ChaCha20
from Crypto.Random import get_random_byteskey = get_random_bytes(32) # ChaCha20 需要 256-bit 密钥
nonce = get_random_bytes(8) # ChaCha20 需要 8 字节 noncecipher = ChaCha20.new(key=key, nonce=nonce)
plaintext = b"Hello, Stream Cipher!"
ciphertext = cipher.encrypt(plaintext)
print("密文:", ciphertext.hex())
4. 混淆(Confusion)与扩散(Diffusion)
这两个概念由 Claude Shannon(香农) 提出,是现代密码学的两个核心设计原则。
混淆(Confusion)
- 让密文和密钥之间的关系尽可能复杂,使攻击者难以推测密钥。
- 方法:使用 S 盒(Substitution box) 进行替换,使密钥和密文之间的关系复杂化。
- 示例:AES 使用 S 盒(S-Box),改变字节值,使其不可预测。
扩散(Diffusion)
- 让明文的每一位都影响密文的多个位,防止攻击者找到明文和密文的直接关系。
- 方法:使用 置换(Permutation),如 AES 的 ShiftRows 和 MixColumns 变换。
- 示例:如果改变明文的 1 位,整个密文都会大幅变化(雪崩效应)。
AES 的混淆与扩散
AES 操作 | 作用 |
---|---|
SubBytes(S 盒) | 通过替换增加混淆 |
ShiftRows | 通过行移位增加扩散 |
MixColumns | 通过列混合增加扩散 |
非对称密钥算法(Asymmetric Encryption)
非对称加密(Asymmetric Encryption)是一种 公钥密码学(Public-Key Cryptography),使用两个不同的密钥:
- 公钥(Public Key):用于加密,可公开。
- 私钥(Private Key):用于解密,必须保密。
特点:
提高安全性:即使公钥泄露,也无法解密数据。
适用于身份验证、数字签名、密钥交换等。
计算速度较慢:相比对称加密(AES),非对称加密计算量大,通常用于加密小数据(如密钥交换)。
1. 经典非对称加密算法
算法 | 密钥长度 | 安全性 | 应用场景 |
---|---|---|---|
RSA | 2048+ 位 | 依赖大整数分解 | SSL/TLS、数字签名 |
ECC(椭圆曲线加密) | 256+ 位 | 比 RSA 更高效 | 区块链、数字签名 |
DSA(数字签名算法) | 1024+ 位 | 主要用于签名 | 数字签名 |
Diffie-Hellman(DH) | 2048+ 位 | 用于密钥交换 | TLS、VPN |
2. RSA 加密
RSA(Rivest-Shamir-Adleman) 是最经典的非对称加密算法,基于大整数分解难题。
RSA 工作原理
-
密钥生成:
- 选取两个大素数
p
和q
。 - 计算
n = p × q
作为 模数(modulus)。 - 计算欧拉函数:
φ(n) = (p-1) × (q-1)
。 - 选择公钥指数
e
(通常为 65537)。 - 计算私钥
d
,使d × e ≡ 1 (mod φ(n))
。
- 选取两个大素数
-
加密:
C = M e m o d n C = M^e \mod n C=MemodnM
是明文,C
是密文。
-
解密:
M = C d m o d n M = C^d \mod n M=Cdmodnd
只能由私钥计算。
Python 示例(RSA 加密 & 解密):
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP# 生成 RSA 密钥对
key = RSA.generate(2048)
public_key = key.publickey()# 加密
cipher_rsa = PKCS1_OAEP.new(public_key)
plaintext = b"Hello, RSA!"
ciphertext = cipher_rsa.encrypt(plaintext)
print("密文:", ciphertext.hex())# 解密
cipher_rsa = PKCS1_OAEP.new(key)
decrypted = cipher_rsa.decrypt(ciphertext)
print("解密后明文:", decrypted.decode())
3. ECC(椭圆曲线加密)
ECC(Elliptic Curve Cryptography)是一种基于椭圆曲线离散对数问题的非对称加密算法,比 RSA 更安全、密钥更短、计算更快。
ECC vs RSA
算法 | 安全等效(RSA vs ECC) | 密钥长度 |
---|---|---|
RSA | 2048 位 | 2048 位 |
ECC | 2048 位 RSA ≈ 256 位 ECC | 256 位 |
ECC 应用:
- 区块链(Bitcoin, Ethereum)
- SSL/TLS
- 移动设备(低功耗场景)
Python 示例(ECC 密钥生成):
from ecdsa import SigningKey, SECP256k1# 生成 ECC 密钥对
private_key = SigningKey.generate(curve=SECP256k1)
public_key = private_key.verifying_keyprint("私钥:", private_key.to_string().hex())
print("公钥:", public_key.to_string().hex())
4. Diffie-Hellman(DH)密钥交换
Diffie-Hellman 不是用于加密,而是用于安全地交换对称密钥。
工作原理
- Alice 和 Bob 选择一个公开的素数
p
和基数g
。 - Alice 选择私钥
a
,Bob 选择私钥b
。 - Alice 计算
A = g^a mod p
并发送给 Bob。 - Bob 计算
B = g^b mod p
并发送给 Alice。 - Alice 计算共享密钥
K = B^a mod p
。 - Bob 计算共享密钥
K = A^b mod p
。 - 最终双方计算出的
K
是相同的,可用于对称加密(如 AES)。
Python 示例(DH 密钥交换):
from cryptography.hazmat.primitives.asymmetric import dh# 生成 DH 参数
parameters = dh.generate_parameters(generator=2, key_size=2048)# 生成 Alice 和 Bob 的私钥
alice_private_key = parameters.generate_private_key()
bob_private_key = parameters.generate_private_key()# 计算公钥
alice_public_key = alice_private_key.public_key()
bob_public_key = bob_private_key.public_key()# 交换公钥并计算共享密钥
alice_shared_key = alice_private_key.exchange(bob_public_key)
bob_shared_key = bob_private_key.exchange(alice_public_key)# 确保双方计算出的密钥相同
assert alice_shared_key == bob_shared_key
print("共享密钥:", alice_shared_key.hex())
5. 数字签名
非对称加密不仅用于加密,还可用于数字签名,用于身份验证和完整性验证。
数字签名过程(以 RSA 为例)
-
签名:
- 计算消息
M
的哈希值H(M)
。 - 用私钥
d
对H(M)
进行签名:S = H(M)^d mod n
。 - 发送
(M, S)
给接收方。
- 计算消息
-
验证:
- 用公钥
e
计算H(M) = S^e mod n
。 - 如果计算结果与接收到的
M
经过哈希计算的值相同,则签名有效。
- 用公钥
Python 示例(RSA 签名 & 验证):
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256# 生成 RSA 密钥
key = RSA.generate(2048)
public_key = key.publickey()# 签名
message = b"Hello, Digital Signature!"
hash_msg = SHA256.new(message)
signature = pkcs1_15.new(key).sign(hash_msg)# 验证
try:pkcs1_15.new(public_key).verify(hash_msg, signature)print("签名验证成功!")
except:print("签名验证失败!")
对称密码的运行模式(Block Cipher Modes of Operation)
在 对称加密(Symmetric Encryption) 中,块密码(Block Cipher)如 AES(高级加密标准) 需要特定的**运行模式(Modes of Operation)**来加密数据块。这些模式决定了如何处理多个块的数据。
1. 电子密码本模式(ECB - Electronic Codebook)
特点
- 每个数据块(128 位)单独加密,相同的明文块加密后总是相同的密文块。
- 容易受到模式分析攻击(相同的输入总是产生相同的输出)。
- 不推荐使用!
适用场景
不建议用于任何安全应用!
2. 密码块链接模式(CBC - Cipher Block Chaining)
特点
- 每个密文块都会影响下一个块,避免模式泄露。
- 需要一个随机初始化向量(IV),保证相同明文每次加密结果不同。
- 如果某个块损坏,后续解密可能会受到影响。
加密过程
C i = E k ( P i ⊕ C i − 1 ) C_i = E_k(P_i \oplus C_{i-1}) Ci=Ek(Pi⊕Ci−1)
C_i
:第i
块密文P_i
:第i
块明文C_{i-1}
:前一块的密文IV
:第一块需要的初始化向量
示例(AES-CBC 加密 & 解密)
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_byteskey = get_random_bytes(16) # 16字节AES密钥
iv = get_random_bytes(16) # 16字节随机IV
cipher = AES.new(key, AES.MODE_CBC, iv)plaintext = b"Hello, CBC Mode!" # 明文
padded_text = pad(plaintext, AES.block_size) # 填充明文
ciphertext = cipher.encrypt(padded_text) # 加密
print("密文:", ciphertext.hex())# 解密
decipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(decipher.decrypt(ciphertext), AES.block_size)
print("解密后:", decrypted.decode())
适用场景
文件加密、数据库加密、磁盘加密(BitLocker、SSL/TLS)。
3. 计算反馈模式(CFB - Cipher Feedback)
特点
- 像流密码一样工作(不需要填充)。
- 加密时一个字节(或更小单位)输出一个字节。
- 适用于实时数据流(如 VoIP、视频流)。
加密过程
C i = P i ⊕ E k ( C i − 1 ) C_i = P_i \oplus E_k(C_{i-1}) Ci=Pi⊕Ek(Ci−1)
P_i
是明文,C_i
是密文。
适用场景
流式数据加密(如网络通信、VoIP)。
4. 输出反馈模式(OFB - Output Feedback)
特点
- 与 CFB 类似,但不使用前一个密文,而是不断加密 IV 生成密钥流。
- 错误不会扩散(如果某个密文块损坏,不影响其他块)。
- 适用于流式加密,避免误差传播。
加密过程
O i = E k ( O i − 1 ) O_i = E_k(O_{i-1}) Oi=Ek(Oi−1)
C i = P i ⊕ O i C_i = P_i \oplus O_i Ci=Pi⊕Oi
O_i
是加密 IV 的输出。
适用场景
无线通信、卫星通信。
5. 计数器模式(CTR - Counter)
特点
- 每个块的加密密钥由一个递增的计数器(Nonce + Counter)生成。
- 加密和解密可以并行执行(相比 CBC 更快)。
- 像流密码一样,无需填充。
加密过程
C i = P i ⊕ E k ( Nonce ∣ ∣ i ) C_i = P_i \oplus E_k(\text{Nonce} || i) Ci=Pi⊕Ek(Nonce∣∣i)
Nonce
是随机数,i
是计数器。
示例(AES-CTR 加密 & 解密)
from Crypto.Cipher import AES
from Crypto.Util import Counter
from Crypto.Random import get_random_byteskey = get_random_bytes(16)
nonce = get_random_bytes(8) # 8字节Nonce
ctr = Counter.new(64, prefix=nonce)
cipher = AES.new(key, AES.MODE_CTR, counter=ctr)plaintext = b"Hello, CTR Mode!"
ciphertext = cipher.encrypt(plaintext)
print("密文:", ciphertext.hex())# 解密
ctr = Counter.new(64, prefix=nonce)
decipher = AES.new(key, AES.MODE_CTR, counter=ctr)
decrypted = decipher.decrypt(ciphertext)
print("解密后:", decrypted.decode())
适用场景
多核并行加密(TLS 1.2、IPsec VPN)
云存储、区块链(比特币的 AES 加密)
6. Galois/Counter Mode(GCM - Galois/Counter Mode)
特点
- 基于 CTR,但增加了认证(AEAD)。
- 提供完整性保护,防止篡改(适用于 HTTPS、TLS 1.3)。
- 比 CBC 更快,支持并行计算。
适用场景
HTTPS(TLS 1.3)、IPsec、SSH。
7. 各模式对比
模式 | 特点 | 安全性 | 适用场景 |
---|---|---|---|
ECB | 每个块独立加密 | 不安全 | 不推荐 |
CBC | 依赖 IV,每块加密依赖前一块 | 安全 | 文件加密、数据库 |
CFB | 类似流密码,适用于实时加密 | 安全 | VoIP、流数据 |
OFB | 适用于流式加密 | 安全 | 无线通信 |
CTR | 可并行,计算快 | 安全 | 多核并行加密 |
GCM | 认证加密(AEAD),防篡改 | 高安全 | TLS 1.3, HTTPS |
国际数据加密算法(IDEA - International Data Encryption Algorithm)
IDEA 是一种对称密钥加密算法,它于 1990 年由 Xuejia Lai 和 James Massey 提出,成为 国际数据加密算法(IDEA),并在多种安全协议中得到应用。
IDEA 算法的基本概念
- 对称加密:使用相同的密钥进行加密和解密。
- 块加密算法:将数据分成固定大小的块进行加密(IDEA 每次处理 64 位的明文)。
- 密钥长度:128 位的密钥。
IDEA 的工作原理
IDEA 采用一种 基于替换与置换的结构,它对每个 64 位的输入数据进行 8 轮(round)加密,经过替换、移位等操作,最终输出密文。
1. 数据分块与密钥生成
- 64 位的输入块:数据块被分成 4 个 16 位的小块。
- 128 位密钥:128 位密钥被分成 8 个 16 位的子密钥。
2. 每一轮的操作
IDEA 采用 密钥扩展,从 128 位的密钥中派生出 52 个子密钥(每轮使用 6 个密钥)。每一轮通过如下步骤处理:
- 替代(Substitution):使用非线性代换,替换明文块中的各个部分。
- 置换(Permutation):对数据进行移位和置换,增加混淆性。
- 与密钥操作(Key Mixing):将密钥与数据块进行混合。
- 异或(XOR):将数据块与其他结果异或,提高安全性。
Blowfish 加密算法
Blowfish 是一个 对称密钥加密算法,由 Bruce Schneier 在 1993 年设计。Blowfish 设计的主要目标是提供一个快速、安全且灵活的加密算法,可以替代当时被认为不安全的 DES(数据加密标准)。它是一个 块加密算法,每次加密 64 位的数据块。
Blowfish 算法的特性
- 对称密钥:使用相同的密钥进行加密和解密。
- 64 位数据块:每次加密 64 位的数据块。
- 密钥长度可变:Blowfish 允许使用 32 位至 448 位(即 4 到 56 字节)长度的密钥,具有极大的灵活性。
- 迭代轮次:Blowfish 的加密操作共执行 16 轮(rounds)。
- 替换和置换:Blowfish 采用了 Feistel 网络 结构,结合替换与置换操作进行加密。
Blowfish 加密过程
Blowfish 使用 Feistel 网络(类似于 DES)来加密数据。整个过程包含如下几个重要部分:
-
密钥扩展:
- 密钥被扩展成多个子密钥(包括 P-array 和 S-boxes),用于加密每个数据块。
- 密钥的长度从 32 位到 448 位不等,支持灵活的密钥长度。
-
数据块加密:
- 明文数据被分成 64 位的数据块,每个数据块都经过 16 轮的加密过程。
- 每轮使用相应的子密钥进行操作,主要包括 异或(XOR)、替代(Substitution)和 移位(Shift)等操作。
-
Feistel 结构:
- 每一轮操作都是基于 Feistel 网络结构,其中的核心部分是通过 S-box 进行的代换和混淆操作。
- 加密过程使用一个 前向和反向 结构,确保数据的混淆和扩散。
Blowfish 加密算法的工作原理
-
初始化:
- 使用密钥生成 P-array(包含 18 个 32 位元素)和 S-boxes(包含 4 个 256 元素的数组),这些值用于在加密和解密过程中不断混淆数据。
-
Feistel 网络:
- 将 64 位明文分为两个 32 位部分。
- 使用多个 S-box 和 P-array,反复替代、加法和异或操作,产生最终的密文。
-
16 轮加密:
- 每一轮使用 P-array 中的不同子密钥,进行 Feistel 网络的迭代操作。最终,密文产生。
Feistel 网络的一轮加密过程:
L i = R i − 1 , R i = L i − 1 ⊕ F ( R i − 1 , P i ) L_i = R_{i-1},\quad R_i = L_{i-1} \oplus F(R_{i-1}, P_i) Li=Ri−1,Ri=Li−1⊕F(Ri−1,Pi)
- L 和 R:每轮的左侧和右侧数据
- F:使用当前的 S-box 和子密钥生成的函数
Blowfish 的安全性
Blowfish 设计时考虑了抗密码分析(例如差分分析和线性分析)的能力,使用了复杂的子密钥生成机制和多轮的迭代过程,使得它对大多数常见攻击具有较强的抵抗力。虽然在其设计时非常安全,但 Blowfish 目前已被认为在 现代加密标准 中略显过时,主要是因为:
- 64 位数据块:相比于 AES 等算法的 128 位数据块,Blowfish 的 64 位数据块容易受到 生日攻击(Birthday Attack)等一些特定攻击的威胁。
- 较小的密钥空间:Blowfish 支持的最大密钥长度为 448 位,相对较小的密钥空间在某些情况下可能会被突破。
因此,Blowfish 通常作为 过渡加密算法,不推荐用于高安全性要求的场景。
Blowfish 的应用
- VPN 和网络安全:Blowfish 曾被广泛应用于一些 VPN 协议(如 OpenVPN)和 加密通信,但随着更强的 AES 和 ChaCha20 的出现,Blowfish 使用频率逐渐减少。
- 文件加密:一些旧版的加密工具和软件(如 PGP)也使用过 Blowfish。
- 旧版加密协议:一些旧的加密协议和工具(例如 SSH 1)使用过 Blowfish。
Blowfish 与 AES 的对比
特性 | Blowfish | AES |
---|---|---|
密钥长度 | 32 位到 448 位 | 128 位、192 位、256 位 |
数据块大小 | 64 位 | 128 位 |
加密轮次 | 16 轮 | 10 轮(对于 128 位密钥) |
设计思想 | Feistel 网络 | 代替加密(Substitution-Permutation) |
安全性 | 对抗常见攻击,但较小的密钥空间和 64 位数据块可能较弱 | 高安全性,现代标准,抗大规模暴力攻击 |
速度 | 较快,适合低资源设备 | 高效,适用于现代硬件加速 |
Blowfish 示例代码(Python)
from Crypto.Cipher import Blowfish
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad# 生成密钥
key = get_random_bytes(16) # 128 位密钥# 初始化 Blowfish 加密对象
cipher = Blowfish.new(key, Blowfish.MODE_CBC)# 明文数据
plaintext = b"Hello, Blowfish encryption!"# 填充数据以使其适应块大小
padded_text = pad(plaintext, Blowfish.block_size)# 加密
ciphertext = cipher.encrypt(padded_text)
print("密文:", ciphertext.hex())# ------------------------ 解密 ------------------------# 解密
decipher = Blowfish.new(key, Blowfish.MODE_CBC, iv=cipher.iv)
decrypted = unpad(decipher.decrypt(ciphertext), Blowfish.block_size)
print("解密后:", decrypted.decode())
SKIPJACK 加密算法
SKIPJACK 是由 美国国家安全局(NSA) 设计的一种 对称密钥加密算法,它主要用于 加密通信。它是 Clinton Administration (克林顿政府) 在 1990 年代初期推出的 “Clipper 芯片计划” 的核心算法之一,目的是为了在电话和数据通信中提供安全性,同时允许政府通过一个专门的密钥(称为 “Law Enforcement Access Field”,LEAF)解密通信。尽管其在政府中的使用有所争议,但 SKIPJACK 本身是一种相对较少被采用的加密算法。
SKIPJACK 的基本特性
- 对称加密算法:SKIPJACK 是一种 对称密钥加密 算法,意味着加密和解密使用相同的密钥。
- 数据块大小:每次处理 64 位 数据块,类似于其他一些传统的对称加密算法(如 DES)。
- 密钥长度:SKIPJACK 使用 80 位密钥,这个密钥长度在设计时足够安全,但在现代加密标准中已显得不够长。
- Feistel 网络结构:SKIPJACK 使用 Feistel 网络 结构进行加密和解密操作。Feistel 网络通过多轮替换和置换操作来提供混淆和扩散。
- 不公开:SKIPJACK 算法并不像 AES 等其他算法那样公开标准,而是被认为是“专有”算法。
SKIPJACK 的工作原理
SKIPJACK 的加密操作遵循 Feistel 网络结构,这是许多传统对称加密算法(如 DES)采用的基本加密框架。SKIPJACK 中的数据处理过程包括以下几个主要步骤:
-
初始化:
- 数据被分成 64 位的块,然后在每一轮加密中,这些块会被操作。
- 使用 80 位密钥,密钥首先会被扩展成多个 子密钥,这些子密钥用于加密操作。
-
Feistel 轮次:
- SKIPJACK 使用 32 轮 加密过程,每一轮都会用到不同的子密钥,数据的左边和右边部分会交替进行替换和异或等操作。
-
每轮的操作:
- 在每一轮中,左半部分(L)会与一个函数 F(由 S-box 和子密钥构成)结合,得到一个新的值,然后与右半部分(R)进行异或,最后左半部分与右半部分交换。
- 该过程会持续 32 轮,直到加密过程结束。
-
密钥扩展:
- SKIPJACK 密钥扩展过程会将 80 位的密钥扩展成多个 子密钥,这些子密钥在每一轮加密时使用。
-
解密过程:
- 解密操作与加密过程相似,只是子密钥的顺序相反。
SKIPJACK 算法的结构
- 数据块大小:64 位
- 密钥大小:80 位
- 加密轮数:32 轮
- 结构:Feistel 网络
- 操作模式:与 DES 类似,使用 替换和置换 操作。
SKIPJACK 与 DES 的对比
特性 | SKIPJACK | DES |
---|---|---|
密钥长度 | 80 位 | 56 位 |
数据块大小 | 64 位 | 64 位 |
加密轮次 | 32 轮 | 16 轮 |
结构 | Feistel 网络 | Feistel 网络 |
安全性 | 适合当时的需求,但相对较弱 | 由于密钥长度较短,现代认为不安全 |
专利 | 由 NSA 设计,未公开标准 | 公共标准,广泛应用 |
SKIPJACK 的历史与背景
-
Clipper 芯片计划:
- SKIPJACK 最初作为 Clipper 芯片计划 的一部分推出,该计划旨在推广安全的电话通信,但同时允许政府通过专用密钥(LEAF)监听通信。Clipper 芯片使用 SKIPJACK 算法来加密电话通话和传真数据。
- 由于该计划的隐私问题和对政府访问通信内容的担忧,Clipper 芯片计划未能成功推出,SKIPJACK 的应用也因此受到了限制。
-
公众对 SKIPJACK 的反应:
- 尽管 SKIPJACK 曾在美国政府的一些项目中使用,但其算法的 专有性 和 政府访问密钥的要求 使其在民间和商业领域没有得到广泛使用。
- 公众信任问题:由于算法没有公开,许多加密专家和公众对该算法的信任度较低,认为它可能被设计为便于政府进行数据窃听。
-
SKIPJACK 的后续:
- 1997 年,NSA 将 SKIPJACK 作为 公开算法 发布,允许加密研究人员对其进行分析。
- 由于密钥长度较短和加密过程的已知特性,SKIPJACK 被认为在现代加密标准中已经不再适用。
SKIPJACK 的安全性
- 加密强度:虽然在设计时,SKIPJACK 提供了相对较强的加密安全性,但由于其 80 位密钥 长度和 64 位数据块,它在现代标准下已经被认为过时。
- 暴力破解:在现代计算能力下,80 位的密钥 已经不再足够安全,容易受到暴力破解攻击。
Rivest Cipher
-
RC4:
- 类型:流密码。
- 密钥长度:可变,通常为 40 到 128 位。
- 应用:曾广泛用于 SSL/TLS 和 WEP 等协议。
- 缺点:由于存在安全漏洞和偏差,现已不再推荐使用,容易受到攻击。
-
RC5:
- 类型:块密码。
- 数据块大小:64 位。
- 密钥长度:可变(32 位、64 位、128 位)。
- 轮数:可调,通常为 12 或 16 轮。
- 安全性:提供比 RC4 更强的加密,但由于现代加密算法(如 AES)的出现,已不再常用。
-
RC6:
- 类型:块密码。
- 数据块大小:128 位。
- 密钥长度:可变,通常为 128 位、192 位、256 位。
- 轮数:可调,通常为 20 轮。
- 安全性:作为 RC5 的扩展,RC6 提供更强的加密,但也已被 AES 替代。
CAST 算法
CAST(Carlisle Adams and Stafford Tavares)是一种对称加密算法,由 Carlisle Adams 和 Stafford Tavares 在 1996 年设计。CAST 算法有多个版本,包括 CAST-128 和 CAST-256,它们在加密过程中的主要区别在于密钥长度和安全性。
CAST-128
- 类型:对称块加密算法。
- 数据块大小:64 位。
- 密钥长度:支持 40 位到 128 位的密钥长度。
- 结构:基于 Feistel 网络 结构进行加密,每轮使用 S-box 进行替代操作。
- 加密轮数:16 轮。
- 用途:CAST-128 曾被用于一些安全协议中,尤其是在早期的 SSL/TLS 协议中,但随着时间的推移,它被更强的算法(如 AES)所替代。
CAST-256
- 类型:对称块加密算法。
- 数据块大小:128 位。
- 密钥长度:256 位。
- 结构:与 CAST-128 类似,但使用更长的密钥和更大的数据块。
- 安全性:提供更强的安全性,适用于需要更高加密强度的应用,但依然不如现代标准的 AES 算法强大。
对称密钥管理
对称密钥管理是确保加密操作安全的核心部分。由于对称加密算法使用相同的密钥进行加密和解密,因此密钥的安全管理至关重要。以下是对称密钥管理的几个关键步骤:
1. 创建和分发对称密钥
创建对称密钥
- 密钥生成是对称加密过程中的第一步。为确保安全,密钥必须是随机且具有足够的复杂性。
- 随机数生成器:使用加密安全的伪随机数生成器(CSPRNG)来生成密钥。CSPRNG 确保生成的密钥是不可预测的,并且具有高熵。
- 密钥长度:密钥的长度决定了加密强度。常见的密钥长度有 128 位、192 位和 256 位(例如,AES-128、AES-192、AES-256)。
分发对称密钥
-
分发密钥时,必须确保密钥不会被恶意第三方截获。由于对称加密使用相同的密钥进行加密和解密,因此,密钥的安全分发至关重要。常用的分发方法包括:
-
公钥加密(PKI):使用 非对称加密(如 RSA)加密对称密钥。密钥本身由接收者通过其公钥加密,这样只有接收者才能使用私钥解密密钥。
- 例如,客户端生成一个对称密钥,然后使用服务器的公钥加密该密钥,通过安全通道发送到服务器。服务器通过其私钥解密密钥。
-
密钥交换协议:如 Diffie-Hellman 密钥交换,允许两方在不直接传输密钥的情况下,通过公共信道安全地协商一个共享密钥。
-
安全通道:如 TLS/SSL 或 VPN 等安全协议,这些协议确保密钥在传输过程中不会被截获。
-
物理安全设备:如硬件安全模块(HSM)或智能卡,可以直接通过物理媒介安全地传输密钥。
-
2. 存储与销毁对称密钥
存储对称密钥
-
对称密钥在使用过程中必须被安全存储。存储时要确保密钥不容易被未授权人员访问。
-
加密存储:密钥可以加密存储在数据库、文件系统或云存储中。通过加密保护密钥文件本身,防止密钥在存储介质上被泄漏。
- 例如,可以使用非对称密钥对对称密钥进行加密,只有授权用户才能解密并访问密钥。
-
硬件安全模块(HSM):用于保护密钥的专用硬件设备,可以防止密钥泄漏。HSM 可以在加密操作时直接处理密钥,确保密钥不会暴露。
-
密钥管理系统(KMS):集中的密钥管理平台,用于生成、存储和管理密钥。大多数现代云平台提供了 KMS 服务(如 AWS KMS、Google Cloud KMS),可以在一个安全的位置存储和管理密钥。
-
安全存储位置:将密钥存储在物理安全的位置,例如安全服务器、加密存储设备或专用的安全硬件。
-
销毁对称密钥
-
对称密钥的销毁是密钥生命周期管理的关键步骤。正确的销毁可以确保密钥不被恢复使用,防止数据泄露。
-
物理销毁:对于存储在硬件设备中的密钥,可以通过物理销毁设备来彻底销毁密钥。例如,销毁硬件安全模块(HSM)或加密硬盘。
-
逻辑销毁:对于存储在数字存储介质中的密钥,可以通过 擦除 或 覆盖 技术来销毁密钥。简单删除文件并不能保证文件完全销毁,必须使用专门的工具进行数据擦除,确保密钥无法恢复。
-
密钥销毁命令:在某些加密硬件设备(如 HSM)中,密钥可以通过设备提供的销毁命令来删除。
-
密钥生命周期管理:密钥管理系统(KMS)通常会在密钥过期或不再需要时自动触发销毁操作。
-
相关文章:
[CISSP] [6] 密码学和对称密钥算法
密码学的目标 1. 机密性(Confidentiality) 目标:保护信息不被未授权访问。 通过 加密(Encryption)技术确保数据只能被授权方解密和读取。主要方法: 对称加密(AES、3DES)ÿ…...
thinkphp每条一级栏目中可自定义添加多条二级栏目,每条二级栏目包含多个字段信息
小程序客户端需要展示团购详情这种结构的内容,后台会新增多条套餐,每条套餐可以新增多条菜品信息,每条菜品信息包含菜品名称,价格,份数等字段信息,类似于购物网的商品多规格属性,数据表中以json类型存储,手写了一个后台添加和编辑的demo 添加页面 编辑页面(json数据…...
混杂模式(Promiscuous Mode)与 Trunk 端口的区别详解
一、混杂模式(Promiscuous Mode) 1. 定义与工作原理 定义:混杂模式是网络接口的一种工作模式,允许接口接收通过其物理链路的所有数据包,而不仅是目标地址为本机的数据包。工作层级:OSI 数据链路层&#x…...
Spring Boot项目信创国产化适配指南
将 Spring Boot 项目适配信创国产化环境,需要从底层基础设施到上层应用组件进行全面替换和调整。以下是主要替换点和适配步骤的总结: 一、基础软件替换 1. JDK 替换 国外JDK:Oracle JDK、OpenJDK国产JDK: 阿里龙井(D…...
MySQL:数据类型
数值类型 数值类型用于存储整数、小数、浮点数等,主要分为整数类型和浮点类型。 整数类型 数据类型存储大小取值范围(有符号)取值范围(无符号)说明TINYINT1字节-128 ~ 1270 ~ 255小整数,如布尔值&#x…...
maven引入项目内本地包方法
最近在写java实现excel转pdf功能; 网上有个包很好用,免费:spire.xls.free-5.3.0.jar。 但是maven打包项目时报错,找不到这个包。 jar包位置如下: 在项目/src/jar/spire.xls.free-5.3.0.jar。 解决方法:…...
ARP协议
ARP协议 ARP协议的作用 当网络设备有数据要发送给另一台网络设备时,必须要知道对方的网络层地址(即IP地址)。IP地址由网络层来提供,但是仅有IP地址是不够的,IP数据报文必须封装成帧才能通过数据链路进行发送。数据帧…...
科技赋能安居梦:中建海龙以模块化革新重塑城市更新范式
在北京市西城区桦皮厂胡同,一栋始建于上世纪70年代的住宅楼正经历着一场脱胎换骨的蜕变。这座曾被鉴定为D级危房的建筑,在中建海龙科技有限公司(以下简称“中建海龙”)的匠心打造下,仅用三个月便完成"原拆原建&qu…...
2025 AI智能数字农业研讨会在苏州启幕,科技助农与数据兴业成焦点
4月2日,以"科技助农数据兴业”为主题的2025AI智能数字农业研讨会在苏州国际博览中心盛大启幕。本次盛会吸引了来自全国各地相关部门领导、知名专家学者、行业协会组织,以及县级市农业企业代表、县级市农产品销售商等万名嘉宾齐聚姑苏城,…...
2000-2021年 全国各地区城镇登记失业率数据
全国各地区城镇登记失业率数据2000-2021年.ziphttps://download.csdn.net/download/2401_84585615/90259723 https://download.csdn.net/download/2401_84585615/90259723 城镇登记失业率是衡量地区就业状况的重要指标,反映了在一定时期内,符合就业条件的…...
Cursor的主要好处
以下是Cursor的主要好处: 代码生成与优化 • 快速生成代码:根据简短描述或部分代码片段,Cursor能快速生成完整代码模块,还能智能预测下一步操作,将光标放在合适位置,让开发者一路Tab键顺滑编写代码。 • …...
超便捷语音转文字工具CapsWriter-Offline本地部署与远程使用全流程
文章目录 前言1. 软件与模型下载2. 本地使用测试3. 异地远程使用3.1 内网穿透工具下载安装3.2 配置公网地址3.3 修改config文件3.4 异地远程访问服务端 4. 配置固定公网地址4.1 修改config文件 5. 固定tcp公网地址远程访问服务端 前言 今天给大家安利一个绝对能让你工作效率飙…...
什么是数据仓库
什么是数据仓库 Data warehouse 是面向主题的 主要根据各种数据来源,来进行历史分析 形成一个趋势分析 为数据挖掘、预测建模、机器学习提供基础数据 与传统数据库比如gaussdb的区别。数据仓库注重历史数据分析,guassdb注重实时事务处理 数据仓库时企业的…...
【动态规划】二分优化最长上升子序列
最长上升子序列 II 题解 题目传送门:AcWing 896. 最长上升子序列 II 一、题目描述 给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。 输入格式: 第一行包含整数 N第二行包含 N 个整数,表示完整序列 输…...
MySQL的安装与初始化流程
MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,MySQL AB公司被Sun公司收购,Sun公司又被Oracle公司收购,目前属于Oracle公司。 MySQL是目前最流行的关系型数据库管理系统,在WEB应用方面MySQL是最…...
flink standalone集群模式部署
一. 环境准备 1、下载并安装jdk11 2、下载flink 并解压 3、确保服务器之间的免密登录 二、集群搭建 搭建集群至少有三台机器,每台机器的分配角色如下 master: jobManager salve01:taskManager salve02:taskManager 1、在JobManager(…...
Linux线程概念与控制:【线程概念(页表)】【Linux线程控制】【线程ID及进程地址空间布局】【线程封装】
目录 一. 线程概念 1.1什么是线程 1.2分页式存储管理 1.2.1虚拟地址和页表的由来 1.2.2物理内存管理 1.2.3页表 1.2.4页目录结构 1.2.5二级页表地址转换 1.3线程的优点 二.进程VS线程 三.Linux线程控制 3.1POSIX线程库 3.2创建线程 编辑 pthread库是个什么东西 …...
7-6 混合类型数据格式化输入
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。 输入格式: 输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。 输出格式: 在一行中…...
最新全开源码支付系统,赠送3套模板
最新全开源码支付系统,赠送3套模板 码支付是专为个人站长打造的聚合免签系统,拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI 让您能更方便快捷地解决知识付费和运营赞助的难题,同时提供实时监控和管理功能,让您随时随地…...
Eclipse Leshan 常见问题解答 (FAQ) 笔记
本笔记基于 Eclipse Leshan Wiki - F.A.Q. 页面内容,旨在解答关于 Eclipse Leshan(一个开源的 LwM2M 服务器和客户端 Java 实现)的常见问题,帮助您更好地理解和使用该工具。 一、Leshan 是什么,我该如何使用它&#x…...
【6】数据结构的栈篇章
目录标题 栈的定义顺序栈的实现顺序栈的初始化入栈出栈获取栈顶元素顺序栈总代码与调试 双端栈的实现双端栈的初始化入栈出栈双端栈总代码与调试 链栈的实现链栈的初始化入栈出栈获取栈顶元素链栈总代码与调试 栈的定义 定义:栈(Stack)是一种…...
开源虚拟化管理平台Proxmox VE部署超融合
Proxmox VE 是一个功能强大、开源的虚拟化平台,结合了 KVM 和 LXC,同时支持高可用集群、存储管理(ZFS、Ceph)和备份恢复。相比 VMware ESXi 和 Hyper-V,PVE 具有开源、低成本、高灵活性的特点,适用于中小企…...
C语言基础要素(019):输出ASCII码表
计算机以二进制处理信息,但二进制对人类并不友好。比如说我们规定用二进制值 01000001 表示字母’A’,显然通过键盘输入或屏幕阅读此数据而理解它为字母A,是比较困难的。为了有效的使用信息,先驱者们创建了一种称为ASCII码的交换代…...
函数柯里化(Currying)介绍(一种将接受多个参数的函数转换为一系列接受单一参数的函数的技术)
文章目录 柯里化的特点示例普通函数柯里化实现使用Lodash进行柯里化 应用场景总结 函数柯里化(Currying)是一种将接受多个参数的函数转换为一系列接受单一参数的函数的技术。换句话说,柯里化将一个多参数函数转化为一系列嵌套的单参数函数。 …...
基于大模型的主动脉瓣病变预测及治疗方案研究报告
目录 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究意义 二、大模型预测主动脉瓣病变原理 2.1 大模型介绍 2.2 数据收集与处理 2.3 模型训练与优化 三、术前预测与评估 3.1 主动脉瓣病变类型及程度预测 3.2 患者整体状况评估 3.3 手术风险预测 四、术中应用与监测…...
VSCode开发者工具快捷键
自动生成浏览器文件.html的快捷方式 在文本里输入: ! enter VSCode常用快捷键列表 代码格式化:Shift Alt F向上或向下移动一行:Alt Up 或者 Alt Down快速复制一行代码:Shift Alt Up 或者 Shift Alt Down快速保…...
AI助力PPT制作,让演示变得轻松高效
AI助力PPT制作,让演示变得轻松高效!随着科技的进步,AI技术早已渗透到各行各业,特别是在办公领域,AI制作PPT已不再是未来的梦想,而是现实的工具。以前你可能需要花费数小时来制作一个完美的PPT,如…...
行业专家视角下的技术选型与任务适配深度解析
行业专家视角下的技术选型与任务适配深度解析 一、任务属性与技术栈的映射逻辑 (1)学术类项目需优先考虑技术严谨性、可复现性和理论深度: 机器学习模型开发:PyTorchJupyterMLflow形成完整实验闭环,TensorFlow Exte…...
从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.2.1模型偏见与安全对齐(Red Teaming实践)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 大语言模型全栈开发指南:伦理与未来趋势 - 第五部分:行业应用与前沿探索5.2.1 模型偏见与安全对齐(Red Teaming实践)一、模型偏见的来源与影响1. 偏见的定义与分类2. 偏见的实际影响案例二、安全对齐…...
JUC系列JMM学习之随笔
JUC: JUC 是 Java 并发编程的核心工具包,全称为 Java Util Concurrent,是 java.util.concurrent 包及其子包的简称。它提供了一套强大且高效的并发编程工具,用于简化多线程开发并提高性能。 CPU核心数和线程数的关系:1核处理1线程(同一时间单次) CPU内核结构: 工作内…...
OpenRouter开源的AI大模型路由工具,统一API调用
简介 OpenRouter是一个开源的路由工具,它可以绕过限制调用GPT、Claude等国外模型。以下是对它的详细介绍: 一、主要功能 OpenRouter专注于将用户请求智能路由到不同的AI模型,并提供统一的访问接口。它就像一个“路由器”,能…...
3.9/Q2,Charls最新文章解读
文章题目:Association between remnant cholesterol and depression in middle-aged and older Chinese adults: a population-based cohort study DOI:10.3389/fendo.2025.1456370 中文标题:中国中老年人残留胆固醇与抑郁症的关系࿱…...
水下图像增强与目标检测:标签缺失的“锅”?
水下图像增强与目标检测:标签缺失的“锅”? 在水下计算机视觉领域,图像增强和目标检测一直是研究热点。然而,一个有趣的现象引起了研究者的关注:在某些情况下,增强后的水下图像用于目标检测时,…...
从扩展黎曼泽塔函数构造物质和时空的结构-13
得到这些数据到底有什么用呢?无非都是振动,只有频率不同。电性振动和磁性振动的正交环绕关系,本质上只是某个虚数单位的平方倍数, 既然如此,我们就可以考虑,把电和磁当成同一种东西。比如通过改变真空介电常…...
Android学习总结之handler源码级
一、核心类关系与线程绑定(ThreadLocal 的核心作用) 1. Looper 与 ThreadLocal 的绑定 每个线程的 Looper 实例通过 ThreadLocal<Looper> sThreadLocal 存储,确保线程隔离: public final class Looper {// 线程本地存储&…...
多模态学习(八):2022 TPAMI——U2Fusion: A Unified Unsupervised Image Fusion Network
论文链接:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9151265 目录 一.摘要 1.1 摘要翻译 1.2 摘要解析 二.Introduction 2.1 Introduciton翻译 2.2 Introduction 解析 三. related work 3.1 related work翻译 3.2 relate work解析 四…...
adb检测不到原来的设备List of devices attached解决办法
进设备管理器-通用串行总线设备 卸载无法检测到的设备驱动 重新拔插数据线...
探索高通骁龙光线追踪技术
什么是光线追踪? 光线追踪(Raytracing)是通过模拟现实世界中光线的传播过程并生成更加真实的效果的一种图形渲染技术。 早期在电影,动画,设计等领域已经使用软件摸拟光线追踪来渲染更加真实的图像。一般的做法是从相…...
qRegisterMetaType函数使用
一、有两种形式: 1、int qRegisterMetaType(const char *typeName) template <typename T> int qRegisterMetaType(const char *typeName #ifndef Q_CLANG_QDOC, T * dummy nullptr, typename QtPrivate::MetaTypeDefinedHelper<T, QMetaTypeId2<T&g…...
【北京化工大学】 神经网络与深度学习 实验6 MATAR图像分类
本次实验使用老师发的雷达奇妙数据 实验要求 读取图像形式的MASTAR数据 1、划分数据集为test/train 2、归一化 题目1:定义并训练线性分类器的神经网络 注:本次老师的要求是不限方法,使用pytorch尽可能提升精度 1、准备函数 #本文用的…...
Flutter 的开发环境搭建教程
为了配置Flutter的运行环境,首先我们需要确保你的开发环境支持Flutter,且相关工具都已经安装好。以下是详细的配置步骤: 1. 安装Flutter SDK Flutter是Google推出的用于开发跨平台应用的框架,支持Android、iOS、Web、桌面等多平台…...
MCP:让 AI 应用更聪明,只需几分钟
用 Leonardo.AI 和 FLUX Dev 模型生成(作者制作) 现在 AI 世界最新的趋势是 MCP(模型上下文协议)。 如果听起来无聊或者很复杂,别担心 —— 这是个非常简单又有效的工具,可以帮你从零开始构建更好的 AI 智能…...
【编程之路】动态格式化字符串
动态格式化字符串 1.代码功能2.关键组件解析3.完整流程4.示例场景5.注意事项6.典型用途7.总结 🚀 本文讨论的代码段来自《Python Cookbook》的《2.15.字符串中插入变量》。 针对下面这段代码,我们一起来分析一下。 class safesub(dict):""&qu…...
接收灵敏度的基本概念与技术解析
接收灵敏度是指接收机在特定条件下能够正确提取有效信号的最小输入功率。其技术原理可概括如下:灵敏度主要受热噪声、系统噪声系数及解调所需信噪比共同影响。根据公式(S 10lg(kTB) NF SNR)计算,其中k为玻尔兹曼常数(1.3810⁻ J/K…...
KUKA机器人软件WorkVisual更改语言方法
KUKA机器人的常用的工作软件WorkVisual软件在使用时也可以更改软件操作界面的语言。如果安装时语言没有选择中文,安装完成后也可以进行更改。以下通过WorkVisual 5.0版本进行简单介绍。 一、打开WorkVisual软件5.0版本; 二、在菜单栏选择【Ext…...
图形渲染: tinyrenderer 实现笔记(Lesson 5 - 7)
目录 Lesson 5: Gouraud shadingLesson 6: Shaders for the software rendererphongShading法线贴图Specular mapping 高光贴图tangent space normal mapping 切线空间法线贴图 Lesson 7: Shadow mapping GitHub主页:https://github.com/sdpyy 项目仓库:https://g…...
AiCube 试用 - 创建流水灯工程
AiCube 试用 - 创建流水灯工程 本文介绍了 Aiapp-ISP 仿真调试平台软件的 AiCube 工具,实现流水灯工程的快速创建的主要流程。 下载运行 下载 最新版 AIapp-ISP 软件; 解压并打开该软件,右侧操作界面选择并进入 Keil 仿真设置 标签项&…...
DBAPI设置服务器开机自启动
在 /etc/systemd/system 目录下创建一个新的服务文件,例如 dbapi.service [Unit] Descriptiondbapi standalone Service Afternetwork.target[Service] ExecStart/your-path/dbapi-enterprise-4.2.2/bin/dbapi.sh start standalone Restartalways Userroot[Install…...
“Nural”传感科技带给高速吹风筒的技术革命---其利天下技术
风筒界的革命,戴森将高速风筒带到了我们生活里,高速风筒的产生,将无刷电机的运用再一次向推到了我们新的产品领域。 然而随着智能家居领域的运用越来越广泛,戴森又将智能温控概念引入高速吹风筒,HD16引入“Nural”传感…...
DeepSeek-R1模型现已登录亚马逊云科技
在今年的Amazon re:Invent大会上,亚马逊CEO安迪贾西分享了公司内部开发近 1,000 个生成式 AI应用程序的经验教训。基于如此大规模的AI部署实践,贾西提出了三个关键观察,这些观察塑造了亚马逊在企业AI实施方面的方法。 第一点是,当…...