非对称加密算法(RSA):原理、应用与代码实现
一、引言
在当今数字化时代,信息安全成为了至关重要的议题。非对称加密算法作为保障信息安全的核心技术之一,在数据加密、数字签名、身份验证等领域发挥着不可或缺的作用。其中,RSA 算法以其可靠性、安全性和广泛的适用性,成为了非对称加密领域的经典代表。本文将深入探讨 RSA 算法的原理、应用场景,并通过 C# 和 Python 语言的实例代码展示其加解密功能的实现。
二、RSA 算法原理
(一)数学基础
- 质数与互质数
- 质数是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的数。例如,2、3、5、7、11 等都是质数。在 RSA 算法中,质数的选取是关键步骤之一。互质数是指两个或多个整数的最大公约数为 1 的数。例如,8 和 9 是互质数,因为它们的最大公约数是 1。在 RSA 算法中,需要选取两个大质数,并且这两个质数通常是互质的。
- 欧拉函数
- 对于正整数 n,欧拉函数 φ(n) 表示小于等于 n 且与 n 互质的正整数的个数。例如,对于质数 p,φ(p) = p - 1,因为质数 p 除了 1 和它本身外,与其他小于 p 的正整数都互质。如果 n = pq(p 和 q 为不同的质数),则 φ(n) = φ(p)φ(q) = (p - 1)(q - 1)。欧拉函数在 RSA 算法的密钥生成和加密解密过程中有着重要的应用。
- 模运算
- 模运算在 RSA 算法中频繁使用。给定一个正整数 n(称为模数),对于任意两个整数 a 和 b,a mod n 表示 a 除以 n 的余数。例如,7 mod 3 = 1,因为 7 除以 3 商 2 余 1。模运算具有一些重要的性质,如 (a + b) mod n = (a mod n + b mod n) mod n,(a * b) mod n = ((a mod n) * (b mod n)) mod n 等。这些性质在 RSA 算法的加密和解密计算中起到了关键作用。
(二)密钥生成
- 选取大质数 p 和 q
- 首先,随机选取两个大质数 p 和 q。为了保证算法的安全性,p 和 q 通常需要具有相当的长度,一般在数百位甚至上千位。选取大质数的方法有多种,常用的有质数生成算法,如 Miller-Rabin 素性测试算法等。这些算法可以高效地判断一个数是否为质数,并且在一定的概率范围内保证结果的正确性。例如,可以使用随机数生成器生成一个大的奇数,然后使用 Miller-Rabin 算法进行多次测试,以确定该数是否为质数。如果不是质数,则继续生成新的奇数并进行测试,直到找到两个满足要求的大质数 p 和 q。
- 计算 n 和 φ(n)
- 计算 n = pq,n 作为 RSA 算法的模数。然后计算 φ(n) = (p - 1)(q - 1)。n 的大小决定了 RSA 算法的安全性和加密强度,一般来说,n 越大,破解的难度就越高。而 φ(n) 在后续的密钥计算中起着重要作用。
- 选取公钥 e
- 从 1 到 φ(n) 中选取一个与 φ(n) 互质的整数 e,作为公钥。通常,e 会选取一些较小的整数,如 3、5、17、65537(2^16 + 1)等,这样可以提高加密和解密的计算效率。为了确保 e 与 φ(n) 互质,可以使用欧几里得算法(辗转相除法)来计算它们的最大公约数,如果最大公约数为 1,则说明 e 与 φ(n) 互质。例如,假设 φ(n) = 120,选取 e = 7,通过欧几里得算法计算 gcd (7, 120) = 1,说明 7 与 120 互质,可以作为公钥。
- 计算私钥 d
- 根据扩展欧几里得算法,计算私钥 d,使得 d * e ≡ 1 (mod φ(n))。也就是说,d 是 e 在模 φ(n) 下的乘法逆元。扩展欧几里得算法可以在已知两个整数 a 和 b 的情况下,找到满足 ax + by = gcd (a, b) 的整数 x 和 y,其中 gcd (a, b) 是 a 和 b 的最大公约数。在计算 d 时,首先通过欧几里得算法求出 e 和 φ(n) 的最大公约数 gcd (e, φ(n)),如果 gcd (e, φ(n)) = 1,则可以利用扩展欧几里得算法求出 d。例如,假设 e = 7,φ(n) = 120,通过扩展欧几里得算法可以计算出 d = 103,因为 103 * 7 ≡ 1 (mod 120)。
(三)加密过程
- 明文数字化
- 将明文信息转换为整数形式。对于简单的文本信息,可以将每个字符按照一定的编码方式(如 ASCII 码或 Unicode 码)转换为对应的整数。例如,对于字符 'A',其 ASCII 码值为 65,可以将其作为明文的一部分进行处理。如果明文是一个较长的字符串,可以将字符串中的每个字符依次转换为整数,然后将这些整数组合起来形成一个大整数作为明文数据。例如,对于字符串 "Hello",可以将 'H'(ASCII 码值 72)、'e'(ASCII 码值 101)、'l'(ASCII 码值 108)、'l'(ASCII 码值 108)、'o'(ASCII 码值 111)转换为整数后组合起来,得到明文整数 m。
- 加密计算
- 使用公钥 (e, n) 对明文整数 m 进行加密计算。加密公式为 c = m^e mod n,其中 c 是加密后的密文整数。计算 m^e mod n 可以通过反复平方和模运算来实现,以提高计算效率。例如,假设 m = 123,e = 5,n = 143,首先计算 123^5 = 123 * 123 * 123 * 123 * 123,然后对结果取模 143,即 (123 * 123) mod 143 = 122,(122 * 123) mod 143 = 23,(23 * 123) mod 143 = 101,(101 * 123) mod 143 = 61,所以密文 c = 61。
(四)解密过程
- 解密计算
- 使用私钥 (d, n) 对密文整数 c 进行解密计算。解密公式为 m = c^d mod n,其中 m 是解密后的明文整数。同样,计算 c^d mod n 也可以通过反复平方和模运算来实现。例如,假设密文 c = 61,d = 29,n = 143,首先计算 61^29 = 61 * 61 *... * 61(共 29 个 61 相乘),然后对结果取模 143,通过逐步计算可以得到明文 m = 123,与原始明文一致。
- 明文还原
- 将解密得到的明文整数转换回原始的信息形式。如果明文是文本信息,将整数按照编码方式(如 ASCII 码或 Unicode 码)转换回对应的字符。例如,对于整数 65,将其转换为字符 'A'。如果明文是一个组合的整数,将其拆分为对应的字符编码整数,然后依次转换为字符,得到原始的字符串明文。
三、RSA 算法的应用
(一)数据加密与安全传输
- 网络通信
- 在互联网通信中,RSA 算法被广泛用于保护数据的机密性。例如,在浏览器与服务器之间的 HTTPS 通信中,RSA 算法用于加密传输的敏感信息,如用户的登录密码、信用卡信息等。当用户在浏览器中输入这些信息并提交时,浏览器使用服务器提供的公钥对数据进行加密,然后将密文发送到服务器。服务器使用自己的私钥对密文进行解密,得到原始的明文数据。这样,即使数据在网络传输过程中被黑客截获,由于黑客没有服务器的私钥,也无法解密获取明文信息,从而保障了数据的安全传输。例如,在一个电子商务网站的交易过程中,用户的支付信息通过 RSA 加密后在网络上传输,确保了支付过程的安全。
- 文件加密
- 用户可以使用 RSA 算法对重要文件进行加密。在加密过程中,生成一对 RSA 密钥,使用公钥对文件进行加密,然后将加密后的文件存储或传输。只有拥有私钥的用户才能对文件进行解密。例如,企业可以使用 RSA 算法对内部的机密文件进行加密,防止文件泄露。员工在访问这些文件时,使用私钥进行解密。同时,RSA 算法还可以与其他加密算法结合使用,如对称加密算法。先使用对称加密算法对文件进行加密,然后使用 RSA 算法对对称加密算法的密钥进行加密传输,这样可以提高加密和解密的效率,同时保证数据的安全性。
- 电子邮件加密
- 在电子邮件通信中,RSA 算法可以用于对邮件内容进行加密和数字签名。发件人使用收件人的公钥对邮件内容进行加密,收件人使用自己的私钥进行解密阅读邮件。同时,发件人可以使用自己的私钥对邮件进行数字签名,收件人可以使用发件人的公钥验证签名的真实性,确保邮件没有被篡改且确实来自发件人。例如,在企业内部的邮件通信中,对于涉及敏感信息的邮件,可以使用 RSA 算法进行加密和签名,保障邮件的安全和真实性。
(二)数字签名
- 生成数字签名
- 发送方首先对要发送的信息进行哈希运算,得到一个固定长度的哈希值(如使用 SHA-256 等哈希算法)。然后使用自己的私钥对哈希值进行加密,得到的加密结果就是数字签名。例如,对于一份合同文件,发送方计算文件的 SHA-256 哈希值,然后用自己的 RSA 私钥对哈希值进行加密,生成数字签名。
- 验证数字签名
- 接收方收到信息和数字签名后,首先使用与发送方相同的哈希算法对收到的信息进行哈希运算,得到一个新的哈希值。然后使用发送方的公钥对数字签名进行解密,得到原始的哈希值(即发送方计算的哈希值)。最后比较这两个哈希值,如果一致,则说明信息在传输过程中没有被篡改,且确实是由声称的发送方发送的,因为只有发送方拥有对应的私钥能够生成正确的数字签名。例如,在电子合同签署场景中,接收方收到合同文件和数字签名后,验证数字签名的有效性,确保合同的完整性和真实性。
- 防止抵赖
- 由于数字签名是使用发送方的私钥生成的,只有发送方拥有该私钥,因此发送方无法否认自己发送了该信息。在商业交易、法律文件等场景中,数字签名可以作为一种有效的证据,防止发送方抵赖其行为。例如,在一个网上交易纠纷中,数字签名可以证明交易的发起方确实是某一用户,避免用户否认自己的交易行为。
(三)身份验证
- 基于 RSA 的身份验证协议
- 在一些网络应用和系统中,RSA 算法可以用于实现身份验证。例如,在客户端 - 服务器架构中,客户端向服务器发送身份验证请求时,可以使用自己的私钥对一个随机生成的挑战值进行加密,并将加密后的结果发送给服务器。服务器使用客户端的公钥对收到的加密结果进行解密,如果解密得到的结果与原始的挑战值一致,则证明客户端拥有对应的私钥,从而验证了客户端的身份。这种方式可以有效地防止身份伪造和冒充。
- 公钥基础设施(PKI)中的应用
- 公钥基础设施是一种基于非对称加密技术的安全体系,RSA 算法在其中起着重要作用。在 PKI 中,数字证书包含了用户的公钥和其他相关信息,并由权威的证书颁发机构(CA)进行数字签名。当用户进行身份验证时,服务器可以通过验证用户数字证书的有效性(即验证 CA 的数字签名)来确认用户的公钥真实性,进而使用用户的公钥进行加密通信或其他操作。例如,在网上银行登录过程中,银行服务器通过验证用户数字证书中的 RSA 公钥,确保与用户进行安全的通信和身份验证。
四、RSA 算法的实现
(一)C# 实现
- 使用 System.Security.Cryptography 命名空间
- C# 中可以通过
System.Security.Cryptography
命名空间来实现 RSA 算法的加解密和数字签名等操作。以下是一个简单的 RSA 加密和解密的示例代码:
- C# 中可以通过
using System;using System.Security.Cryptography;using System.Text;class RsaEncryptionExample{public static void GenerateKeys(out RSAParameters publicKey, out RSAParameters privateKey){using (RSA rsa = RSA.Create()){publicKey = rsa.ExportParameters(false);privateKey = rsa.ExportParameters(true);}}public static byte[] Encrypt(byte[] data, RSAParameters publicKey){using (RSA rsa = RSA.Create()){rsa.ImportParameters(publicKey);return rsa.Encrypt(data, RSAEncryptionPadding.Pkcs1);}}public static byte[] Decrypt(byte[] encryptedData, RSAParameters privateKey){using (RSA rsa = RSA.Create()){rsa.ImportParameters(privateKey);return rsa.Decrypt(encryptedData, RSAEncryptionPadding.Pkcs1);}}}
- 使用示例
class Program{static void Main(){RSAParameters publicKey, privateKey;RsaEncryptionExample.GenerateKeys(out publicKey, out privateKey);string plainText = "Hello, RSA encryption!";byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);byte[] encryptedBytes = RsaEncryptionExample.Encrypt(plainTextBytes, publicKey);byte[] decryptedBytes = RsaEncryptionExample.Decrypt(encryptedBytes, privateKey);string decryptedText = Encoding.UTF8.GetString(decryptedBytes);Console.WriteLine($"Plain Text: {plainText}");Console.WriteLine($"Encrypted Text: {Convert.ToBase64String(encryptedBytes)}");Console.WriteLine($"Decrypted Text: {decryptedText}");}}
- 解释
- 在
RsaEncryptionExample
类中,GenerateKeys
方法用于生成 RSA 密钥对。它创建一个RSA
对象,使用ExportParameters
方法分别获取公钥(false
参数表示只导出公钥部分)和私钥(true
参数表示导出完整的包括私钥的参数)。 Encrypt
方法接受要加密的数据和公钥参数。它创建一个新的RSA
对象,导入公钥,然后使用Encrypt
方法对数据进行加密,这里使用了PKCS#1
填充模式(RSAEncryptionPadding.Pkcs1
)。Decrypt
方法类似,接受加密数据和私钥参数,创建RSA
对象并导入私钥,然后使用Decrypt
方法对数据进行解密。- 在
Main
方法中,首先生成密钥对,然后将明文转换为字节数组,使用公钥进行加密,将加密后的字节数组转换为 Base64 字符串输出以便查看,最后使用私钥进行解密并输出解密后的文本,验证加密和解密的正确性。
- 在
(二)Python 实现
- 使用 pycryptodome 库
- Python 中可以使用
pycryptodome
库来实现 RSA 算法的加解密。首先需要安装pycryptodome
库,例如使用pip install pycryptodome
命令进行安装。以下是一个使用 RSA 进行加密和解密的示例代码:
- Python 中可以使用
from Crypto.PublicKey import RSAfrom Crypto.Cipher import PKCS1_OAEPimport base64def generate_rsa_keys():key = RSA.generate(2048)private_key = key.export_key()public_key = key.publickey().export_key()return public_key, private_keydef encrypt_rsa(plain_text, public_key):rsa_public_key = RSA.import_key(public_key)cipher = PKCS1_OAEP.new(rsa_public_key)encrypted_bytes = cipher.encrypt(plain_text.encode('utf-8'))return base64.b64encode(encrypted_bytes).decode('utf-8')def decrypt_rsa(encrypted_text, private_key):rsa_private_key = RSA.import_key(private_key)cipher = PKCS1_OAEP.new(rsa_private_key)encrypted_bytes = base64.b64decode(encrypted_text)decrypted_bytes = cipher.decrypt(encrypted_bytes)return decrypted_bytes.decode('utf-8')
- 使用示例
if __name__ == "__main__":public_key, private_key = generate_rsa_keys()plain_text = "Hello, RSA encryption!"encrypted_text = encrypt_rsa(plain_text, public_key)decrypted_text = decrypt_rsa(encrypted_text, private_key)print(f"Plain Text: {plain_text}")print(f"Encrypted Text: {encrypted_text}")print(f"Decrypted Text: {decrypted_text}")
- 解释
- 在
generate_rsa_keys
函数中,使用RSA.generate
方法生成一个 2048 位的 RSA 密钥对。然后分别导出公钥和私钥,公钥用于加密数据,私钥用于解密数据。 encrypt_rsa
函数接受明文和公钥,首先导入公钥,创建PKCS1_OAEP
加密对象,然后对明文进行加密,并将加密后的字节数组使用 Base64 编码转换为字符串返回。decrypt_rsa
函数接受加密后的文本和私钥,首先导入私钥,创建PKCS1_OAEP
解密对象,对 Base64 编码的加密字符串进行解码,然后进行解密,最后将解密后的字节数组转换为字符串返回。- 在
if __name__ == "__main__"
部分,生成密钥对,对明文进行加密和解密操作,并输出结果以验证 RSA 算法的加解密功能。
- 在
五、性能和安全性考虑
(一)性能方面
- 密钥生成时间
- RSA 算法的密钥生成过程相对复杂,特别是在选取大质数和计算相关参数时。密钥生成的时间主要取决于质数的大小和生成算法的效率。一般来说,生成较大位数的密钥(如 2048 位或更高)需要更多的计算资源和时间。例如,在一台普通的计算机上,生成一个 1024 位的 RSA 密钥可能需要几毫秒到几十毫秒不等,而生成一个 2048 位的密钥可能需要几百毫秒甚至更长时间。为了提高密钥生成的效率,可以采用优化的质数生成算法和并行计算技术。一些密码学库可能已经对密钥生成过程进行了优化,但在对性能要求较高的场景中,仍然需要考虑密钥生成时间对系统的影响。
- 加密和解密速度
- RSA 加密和解密的速度相对较慢,尤其是与对称加密算法(如 AES)相比。加密和解密速度受到密钥长度、数据块大小以及硬件性能等因素的影响。较长的密钥长度会增加计算量,从而降低加密和解密的速度。在实际应用中,需要根据安全需求和性能要求进行权衡。例如,对于实时性要求较高的通信场景,可能需要在一定程度上平衡安全性和加密速度。可以通过优化算法实现、使用硬件加速(如专用的加密芯片)等方式来提高 RSA 加密和解密的速度。此外,合理选择数据块大小也可以在一定程度上提高性能。一般来说,较小的数据块可能会导致更多的开销,但过大的数据块可能会增加内存使用和处理复杂性。
- 优化策略
- 硬件加速:如前文所述,使用专用的加密硬件设备可以显著提高 RSA 算法的性能。这些硬件设备通常针对加密算法进行了优化,能够快速进行大整数运算和模幂运算等 RSA 算法中的关键操作。例如,一些网络安全设备中集成了加密芯片,可以加速 RSA 加密和解密过程,减少对主机 CPU 资源的占用,提高系统的整体性能和响应速度。
- 优化算法实现:在软件实现方面,可以对 RSA 算法的底层实现进行优化。例如,采用更高效的模幂运算算法,如 Montgomery 算法等,可以减少计算量和提高运算速度。同时,合理组织数据结构和算法流程,避免不必要的计算和内存访问,也可以提高性能。一些密码学库已经对 RSA 算法进行了优化,使用这些成熟的库可以在一定程度上提高性能。
- 混合加密策略:由于 RSA 加密和解密速度相对较慢,在实际应用中常常采用混合加密策略。例如,先使用对称加密算法(如 AES)对大量数据进行快速加密,然后使用 RSA 算法对对称加密算法的密钥进行加密传输。这样可以在保证数据安全性的同时,提高整体的加密和解密效率。在通信过程中,发送方和接收方首先通过 RSA 算法交换对称加密的密钥,然后使用对称加密算法对实际的数据进行加密和解密操作。
(二)安全性方面
- 密钥长度选择
- 密钥长度是影响 RSA 算法安全性的重要因素之一。较短的密钥长度可能容易受到暴力破解攻击。随着计算能力的不断提高,过去被认为安全的较短密钥长度(如 512 位)现在已经不再安全。目前,一般建议使用至少 2048 位的密钥长度来保证足够的安全性。对于一些对安全性要求极高的场景,如金融、军事等领域,可能会使用 3072 位或更高位的密钥。然而,增加密钥长度也会带来性能上的开销,因此需要在安全性和性能之间进行权衡。同时,需要注意的是,密钥长度并不是唯一的安全因素,算法的正确实现和密钥的管理等方面也同样重要。
- 密钥管理
- 安全的密钥管理对于 RSA 算法的安全性至关重要。密钥的生成、存储、分发和更新都需要采取严格的安全措施。在生成密钥时,要确保使用可靠的随机数生成器,以生成具有足够随机性的密钥。密钥的存储应该安全可靠,避免将密钥以明文形式存储在不安全的地方,如普通文件或未加密的数据库中。可以采用加密存储、硬件安全模块(HSM)等方式来保护密钥。密钥的分发也需要通过安全的通道进行,防止密钥在传输过程中被窃取。例如,在使用 RSA 进行网络通信加密时,可以使用安全的密钥交换协议(如 Diffie-Hellman 密钥交换协议)来在不安全的网络环境中安全地分发密钥。此外,定期更新密钥可以降低密钥泄露的风险,提高系统的安全性。
- 防范攻击
- 针对 RSA 的攻击方法:
- 因数分解攻击:RSA 算法的安全性基于对大整数 n(p * q,其中 p 和 q 是大质数)进行因数分解的难度。如果攻击者能够成功分解 n,就可以得到 p 和 q,从而计算出私钥 d。目前,虽然对于足够大的 n,因数分解仍然是一个非常困难的问题,但随着数学和计算技术的发展,一些先进的因数分解算法(如量子算法中的 Shor 算法)可能对 RSA 算法构成潜在威胁。尽管量子计算机目前还处于发展阶段,但在未来可能会对 RSA 的安全性产生重大影响。
- 中间人攻击:在网络通信中,攻击者可能会拦截通信双方之间的消息,并用自己的公钥替换其中一方的公钥,从而进行中间人攻击。例如,在客户端与服务器的通信中,攻击者可以拦截客户端获取服务器公钥的请求,将自己的公钥发送给客户端,然后拦截客户端发送的加密消息,用自己的私钥解密后再用服务器的公钥重新加密发送给服务器,服务器和客户端都无法察觉通信被中间人劫持。
- 选择密文攻击:攻击者可以通过有选择地获取密文并请求解密,试图获取关于密钥的信息。这种攻击方式利用了 RSA 算法中解密操作的一些特性。例如,攻击者可以构造特定的密文,然后观察解密后的结果,通过分析不同密文的解密结果来推断密钥的相关信息。
- 防范措施:
- 使用安全的参数和算法:在生成 RSA 密钥时,要选择足够大的质数 p 和 q,并且确保它们的选取是随机和安全的。同时,使用可靠的密码学库和算法实现,这些库通常会采取一些防范措施来抵御常见的攻击,如对输入数据进行验证、防止缓冲区溢出等。在加密和解密过程中,要正确使用填充模式和加密协议,以防止一些针对特定格式的攻击。
- 加强网络安全防护:对于中间人攻击等网络攻击,需要采取网络安全防护措施,如使用 SSL/TLS 协议进行加密通信,对通信双方进行身份验证等。SSL/TLS 协议可以在建立通信连接时对双方的身份进行验证,确保通信双方是可信的,并且可以对传输的数据进行加密,防止中间人攻击。此外,还可以使用防火墙、入侵检测系统等网络安全设备来监测和防范网络攻击。
- 定期更新和监控:定期更新 RSA 密钥和相关的加密系统,以降低密钥被破解或攻击的风险。同时,对系统进行实时监控,及时发现异常的加密和解密行为,以及可能的攻击迹象。例如,可以通过监控网络流量、系统日志等方式来检测是否存在异常的加密请求或解密失败等情况,及时采取措施进行应对。
- 针对 RSA 的攻击方法:
六、总结
RSA 算法作为一种重要的非对称加密算法,在信息安全领域有着广泛的应用。它基于复杂的数学原理,通过密钥生成、加密和解密过程,为数据的安全传输、数字签名和身份验证等提供了可靠的解决方案。在实际应用中,RSA 算法在网络通信、文件加密、电子邮件安全等方面发挥着重要作用,保障了信息的机密性、完整性和真实性。通过 C# 和 Python 语言的实例代码实现,我们可以看到如何在实际编程中应用 RSA 算法进行加解密操作。
然而,在使用 RSA 算法时,我们也需要考虑性能和安全性方面的因素。在性能方面,密钥生成时间、加密和解密速度可能会影响系统的效率,因此可以通过硬件加速、优化算法实现和采用混合加密策略等方式来提高性能。在安全性方面,密钥长度的选择、密钥管理以及防范各种攻击是保障 RSA 算法安全性的关键。随着计算技术的不断发展和安全威胁的演变,我们需要持续关注 RSA 算法的研究和应用进展,不断优化和完善相关的安全措施,以适应不断变化的安全需求。无论是在企业级信息安全系统还是个人隐私保护中,RSA 算法都将继续发挥其重要作用,为我们的信息安全提供坚实的保障。
相关文章:
非对称加密算法(RSA):原理、应用与代码实现
一、引言 在当今数字化时代,信息安全成为了至关重要的议题。非对称加密算法作为保障信息安全的核心技术之一,在数据加密、数字签名、身份验证等领域发挥着不可或缺的作用。其中,RSA 算法以其可靠性、安全性和广泛的适用性,成为了…...
docker部署SQL审核平台Archery
1、概述 Archery 是一个开源的 SQL 审核平台,专为数据库的 SQL 运维和管理而设计,广泛应用于企业的数据库运维工作中。其主要功能是帮助数据库管理员和开发人员实现 SQL 审核、SQL 执行、在线执行、查询、工单管理、权限控制等数据库管理相关的操作。 Archery 的主要功能包括…...
ceph 删除rbd 锁的命令
文章目录 前言操作步骤 前言 记录一下ceph 删除rbd锁的命令 rbd lock rm poolname/uuid_disk "ID" Locker操作步骤 云主机实例的uuid是:fec52819-3b00-48e1-9f3b-c68c717bd619 # 获取rbd块的信息 rbd info nova/fec52819-3b00-48e1-9f3b-c68c717bd619…...

MySQL【知识改变命运】01
库的基本操作语法 1:SQL的简介2:SQL的基本分类3:库的基本操作1:查看库2:创建数据库1:创建一个diayang库2: ⾃定义⼀个数据库名,如果数据库不存则创建,3:查看警告信息4:字符集编码和校验(排序)规…...
苍穹外卖 Maven依赖配置
苍穹外卖所用到的Maven坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…...

Lucas带你手撕机器学习——SVM支持向量机
#1024程序员节|征文# 支持向量机(SVM)的详细讲解 什么是SVM? 支持向量机(Support Vector Machine,SVM)是一种用于分类和回归的监督学习算法。它的主要任务是从给定的数据中找到一个最佳的决策…...

将后端返回的网络url转成blob对象,实现pdf预览
调用e签宝返回的数据是网络链接就很让人头疼,最后想到可以转换成blob对象,便在百度上找到方法,记录一下。 祝大家节日快乐!! 代码在最后!!!! 代码在最后!&a…...
民峰金融智能交易模型的应用与未来趋势
随着科技的进步,金融市场中的智能化交易模式逐渐成为主流。民峰金融在智能交易模型领域不断创新,凭借先进的技术优势,成为了业内的佼佼者。本文将探讨民峰金融如何通过智能交易模型提升市场交易效率,以及未来可能的发展趋势。 一…...
文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑负荷时空迁移的5G基站与配电网协同优化运行 》
本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...
数据结构中的堆(Heap)
堆(Heap)是计算机科学中一类特殊的数据结构,在计算机科学领域中扮演着至关重要的角色。以下是对堆的深入了解,包括其定义、特性、类型、底层实现原理以及广泛的应用场景。 一、堆的定义与特性 堆通常被看作是一棵完全二叉树的数…...

Linux误删文件找回
前言 公司要迁移文件服务器,100G文件夹执行了mv操作,由于网络都懂Shell卡死导致命令执行中途停止了。一看目标文件夹才10G的内容,赶紧去源文件夹查看~~~不料空空如也 完蛋,咋整,出事了,有备份吗?…...

深入计算机语言之C++:类与对象(中)
🔑🔑博客主页:阿客不是客 🍓🍓系列专栏:从C语言到C语言的渐深学习 欢迎来到泊舟小课堂 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 一、默认成员函数 如果一个类中什么成员都没有&…...

51单片机快速入门之 IIC I2C通信
51单片机快速入门之 IIC 总线通信 协议: 空闲时 SCL/SDA 为高电平SCL高时 SDA下降沿 为开始信号开始信号之后: SCL高电平时 SDA不能变化 , SCL低电平时 SDA才可变 SDA 传数据时 从高到低按位传输 SCL一个脉冲高电平对应一位数据 4.SCL高电平时 SDA上升沿 为停止信号 数…...

腾讯推出ima.copilot智能工作台产品 由混元大模型提供技术支持
腾讯公司近期推出了一款名为ima.copilot(简称ima)的智能工作台产品,它由腾讯混元大模型提供技术支持。这款产品旨在通过其会思考的知识库,为用户开启搜读写的新体验。ima.copilot的核心功能包括知识获取、打造专属知识库以及智能写…...
1024是什么日子
【1024程序员日数字编织梦想的赞歌】 在这个由二进制构建的宇宙里,每一行代码都是通往未来的桥梁,每一位程序员都是这浩瀚数字海洋中的航海家。今天,10月24日,不仅是一个简单的日期,它是属于我们的节日——程序员日&a…...
驱动开发系列20 - Linux Graphics Xorg-server 介绍
一: 概述 X.Org Server 是由 X.Org 基金会管理的 X Window System (X11) 显示服务器的自由开源实现。客户端 X Window System 协议的实现以 X11 库的形式存在,这些库作为与 X 服务器通信的有用 API。有两个主要的 X11 库。第一个库是 Xlib,它是最初的 C 语言 X11 API;…...

晶台推出SOP5封装的高速光耦KLM45X,提供1MBit/s超快速率
KLM452 和 KLM453 器件均由一个红外发射二极管与一个高速光电检测晶体管组成,两者之间光学耦合。光电二极管偏置和输出晶体管集电极的独立连接可以通过减少输入晶体管的基极-集电极电容来使速度比传统的光电晶体管耦合器提高几个数量级。它们采用行业内标准的 5 引脚…...

软物质流变探究:从宏观微观差异,到水凝胶界面特性
大家好!今天我们要探讨的是一篇关于纳米级界面水凝胶粘弹性的研究论文——《Nanoscopic Interfacial Hydrogel Viscoelasticity Revealed from Comparison of Macroscopic and Microscopic Rheology》发表于《Nano Letters》,该研究通过比较宏观和微观流…...

Axure中继器单选、多选和重置
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:Axure中继器单选、多选和重置 主要内容:根据查询条件,通过单选、多选和重置,从中继器中得到数据 应用场景&…...
微软公司用没有使用证据的商标申请驰名商标,该怎么维权?
收集证据:首先需要收集微软公司商标使用的证据,包括但不限于销售记录、广告宣传材料、市场调查报告等,以证明商标的实际使用情况和知名度。如果微软公司的商标确实没有在市场上使用,或者使用证据不足以证明其商标的知名度…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...