从零理解RSA加密:原理、Python实现与实战避坑指南
1. 项目缘起为什么从RSA开始学加密如果你刚开始接触密码学或者需要在项目中快速实现一个安全、可靠的加密功能那么RSA算法几乎是一个绕不开的名字。它不像AES那样需要处理复杂的密钥分发也不像ECC那样涉及晦涩的椭圆曲线数学。RSA的核心思想用大白话讲就是“公开一把锁自己保管开锁的钥匙”。任何人都可以用这把公开的“锁”公钥把信息锁进一个保险箱但只有拥有私密“钥匙”私钥的你才能打开它。这个比喻虽然简化但精准地概括了RSA在非对称加密领域的核心价值解决密钥分发难题。在对称加密如AES中加密和解密用的是同一把密钥你必须通过一个安全的渠道把密钥交给对方这本身就成了一个“先有鸡还是先有蛋”的安全困境。RSA的出现完美地解决了这个问题。公钥可以随意公开不怕被窃听私钥则严格保密确保只有你能解密。网上关于RSA的教程和代码片段浩如烟海但很多要么充斥着复杂的数学公式让人望而却步要么代码封装过度只给个“黑盒”函数调用让人知其然不知其所以然。这导致不少开发者在遇到诸如“RSA Public Key Not Find”、“填充模式错误”或“密钥格式不匹配”等问题时完全无从下手。本篇的目标就是抛开那些令人畏惧的数学证明我们只关注最核心的数学事实用最直白的语言和可运行的代码带你从零实现一个完整、健壮、可用于实际场景的RSA加密解密流程。你会发现它的核心代码可能比你想象的要少但理解其背后的“为什么”才是避免踩坑的关键。2. 核心原理三要素大数、质数与模逆在动手写代码之前我们必须先理解RSA赖以生存的三个数学基石。不用担心这里不会有复杂的推导我们只关注结论和它们如何影响我们的代码实现。2.1 关键一大素数的选取与安全性RSA的安全核心基于一个公认的数学难题将一个大整数分解为两个大质数的乘积是极其困难的。这里的“大”是关键。在早期512比特约155位十进制数的RSA密钥曾被使用但现代计算机已能破解。目前2048比特是公认的安全起点而高安全场景推荐使用4096比特。为什么是质数因为质数只有1和自身两个因数这确保了由两个大质数p和q相乘得到的大数n其因数分解的可能性几乎只存在于知道p和q的情况下。在代码中我们需要一个生成大素数的函数。虽然自己实现高效的素数检测算法如Miller-Rabin算法是个不错的练习但在实际项目中我们通常使用密码学库如Python的cryptography来可靠地生成它们。注意切勿使用小质数或固定质数。例如用p61, q53做教学演示可以但绝对不可用于任何真实环境。攻击者可以轻易建立质数表进行爆破。2.2 关键二密钥对的生成逻辑有了两个大质数p和q我们就可以生成密钥对了。整个过程可以分解为以下几个清晰步骤计算模数nn p * q。这个n就是那个“难以分解的大整数”它既是公钥的一部分也是私钥的一部分决定了密钥的长度。计算欧拉函数φ(n)φ(n) (p-1) * (q-1)。这个值在后续计算中至关重要但它必须被严格保密绝不能和公钥一起泄露。选择公钥指数e公钥是(e, n)。e是一个整数需要满足两个条件1 e φ(n)且e与φ(n)互质即最大公约数为1。为了高效和标准化通常直接选用65537(0x10001)。这是一个广泛采用的数值因为它二进制表示中只有两个1计算速度快且安全性经过充分验证。计算私钥指数d私钥是(d, n)。d是e对于φ(n)的模逆元。也就是说d需要满足(e * d) % φ(n) 1。计算d需要使用扩展欧几里得算法。这是整个过程中的核心计算。2.3 关键三加密与解密的数学操作加密和解密过程本质上都是模幂运算非常简单加密用公钥给定明文转换为数字m计算密文c m^e mod n。解密用私钥拿到密文c计算明文m c^d mod n。这里的mod n就是取模运算确保了结果始终在0到n-1之间也是运算可逆性的保障。你需要理解的是由于d是e的模逆元所以(m^e)^d mod n m^(e*d) mod n m mod n根据欧拉定理。当m与n互质时该等式成立而通过合理的填充方案见下文可以保证这一点。原理部分到此为止。你已经掌握了RSA工作的所有必要数学知识。接下来我们进入实战环节看看如何用代码把这些步骤串起来并处理那些原理中没提、但实践中一定会遇到的“魔鬼细节”。3. 从零实现一个健壮的Python RSA示例我们将使用Python内置的random、math和pow函数来实现核心逻辑并借助cryptography库来生成更安全的大素数。请注意此示例适用于学习和理解流程在生产环境中应使用cryptography或PyCryptodome这类成熟库的完整RSA实现。3.1 环境准备与依赖首先确保你安装了必要的库。我们将用cryptography来生成素数因为它背后的OpenSSL引擎非常可靠。pip install cryptography3.2 核心函数实现密钥生成让我们一步步实现密钥生成函数。这里我会先给出一个“教学版”使用小质数演示流程然后再展示如何集成cryptography库生成安全的大素数。import random import math from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.primitives import serialization def generate_rsa_keys_teaching(bits1024): 教学演示版生成RSA密钥对使用小参数以便理解 警告此函数生成的密钥不安全仅用于教学 # 1. 选择两个质数 (这里为了演示取很小的值) p 61 q 53 print(f[教学] 选择的质数 p{p}, q{q}) # 2. 计算 n 和 φ(n) n p * q phi_n (p - 1) * (q - 1) print(f[教学] 模数 n {n}, φ(n) {phi_n}) # 3. 选择公钥指数 e e 65537 # 行业标准 # 简单检查 e 是否与 φ(n) 互质 if math.gcd(e, phi_n) ! 1: # 理论上65537与一个大的φ(n)几乎总是互质这里为演示完整性 e 17 # 备选值 print(f[教学] 公钥指数 e {e}) # 4. 计算私钥指数 d (e 关于 φ(n) 的模逆) # 使用扩展欧几里得算法 def extended_gcd(a, b): if b 0: return (1, 0, a) x1, y1, gcd extended_gcd(b, a % b) x y1 y x1 - (a // b) * y1 return (x, y, gcd) d, _, gcd extended_gcd(e, phi_n) # 确保 d 是正数 d d % phi_n if gcd ! 1: raise ValueError(e 和 φ(n) 不互质无法计算模逆) print(f[教学] 私钥指数 d {d}) print(f[教学] 验证 (e*d) % φ(n) {(e*d) % phi_n}) # 返回密钥对 (n, e, d) return (n, e, d) def generate_rsa_keys_secure(key_size2048): 安全实践版使用 cryptography 库生成安全的RSA密钥对 # 生成私钥对象 private_key rsa.generate_private_key( public_exponent65537, key_sizekey_size, ) # 提取公钥 public_key private_key.public_key() # 序列化密钥为PEM格式一种常见的文本格式 private_pem private_key.private_bytes( encodingserialization.Encoding.PEM, formatserialization.PrivateFormat.PKCS8, encryption_algorithmserialization.NoEncryption() # 生产环境应考虑加密存储私钥 ) public_pem public_key.public_bytes( encodingserialization.Encoding.PEM, formatserialization.PublicFormat.SubjectPublicKeyInfo ) print(f[安全] 已生成 {key_size} 位 RSA 密钥对) print(f[安全] 私钥PEM格式前100字符:\n{private_pem[:100].decode()}...) print(f[安全] 公钥PEM格式前100字符:\n{public_pem[:100].decode()}...) return private_key, public_key, private_pem, public_pem运行一下教学版你会立刻看到清晰的中间结果n, e, d generate_rsa_keys_teaching()输出会展示n3233,e65537,d2753等值。记住这个n3233它是我们后续演示加解密的模数。3.3 核心函数实现加密与解密有了密钥加解密就是模幂运算。Python的pow函数内置了高效的大数模幂运算pow(base, exp, mod)我们直接使用它。def rsa_encrypt_teaching(m, e, n): 教学演示版使用公钥 (e, n) 加密整数 m # 确保明文 m 小于模数 n if m n: raise ValueError(f明文 m ({m}) 必须小于模数 n ({n})) c pow(m, e, n) print(f[教学加密] 明文 m{m} - 密文 c{c}) return c def rsa_decrypt_teaching(c, d, n): 教学演示版使用私钥 (d, n) 解密密文 c m pow(c, d, n) print(f[教学解密] 密文 c{c} - 明文 m{m}) return m # 使用教学版密钥进行演示 n, e, d generate_rsa_keys_teaching() plaintext_int 65 # 假设我们要加密数字65对应字符 A ciphertext rsa_encrypt_teaching(plaintext_int, e, n) decrypted_int rsa_decrypt_teaching(ciphertext, d, n) print(f解密结果与原始明文是否一致 {decrypted_int plaintext_int})这段代码会成功加密数字65并解密还原。但现实中的信息是文本或字节不是单个小整数。这就引出了RSA实践中最关键的概念之一填充Padding。4. 跨越理论与实践的鸿沟填充、编码与密钥格式直接使用裸RSA即“教科书RSA”或“无填充RSA”加密原始数据是极其危险的。它存在多种致命攻击漏洞如确定性加密、明文猜解等。因此所有标准的RSA实现都必须与一个填充方案一起使用。4.1 为什么必须使用填充安全性填充方案如OAEP会在加密前向明文添加随机数据使得每次加密相同明文产生的密文都不同防止攻击者猜解或进行其他数学攻击。数据长度RSA算法本身一次只能加密比模数n小的数据。对于2048位密钥最多加密245字节约。填充会占用一部分空间实际能加密的明文更短。对于长数据需要采用“混合加密”见下文。格式定义填充方案明确定义了明文的编码格式使得解密方能够正确识别和去除填充恢复原始数据。最常用的填充方案是OAEP (Optimal Asymmetric Encryption Padding)它与RSA的组合被称为RSA-OAEP是目前推荐的非对称加密标准。4.2 使用标准库进行安全的加解密让我们使用cryptography库来实现一个包含OAEP填充的、完整的文本加密解密流程。这才是你应该在实际项目中采用的方式。from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.serialization import load_pem_private_key, load_pem_public_key import base64 def encrypt_message(message: str, public_key_pem: bytes) - str: 使用RSA-OAEP和公钥加密字符串。 返回Base64编码的密文字符串便于传输或存储。 # 1. 加载公钥 public_key load_pem_public_key(public_key_pem) # 2. 将字符串编码为字节 message_bytes message.encode(utf-8) # 3. 使用OAEP填充进行加密 # SHA-256 用作哈希函数和MGF1的哈希函数 ciphertext_bytes public_key.encrypt( message_bytes, padding.OAEP( mgfpadding.MGF1(algorithmhashes.SHA256()), algorithmhashes.SHA256(), labelNone # 通常为None ) ) # 4. 将字节密文转换为Base64字符串 ciphertext_b64 base64.b64encode(ciphertext_bytes).decode(utf-8) return ciphertext_b64 def decrypt_message(ciphertext_b64: str, private_key_pem: bytes) - str: 使用RSA-OAEP和私钥解密密文Base64格式。 返回解密后的原始字符串。 # 1. 加载私钥 private_key load_pem_private_key(private_key_pem, passwordNone) # 2. 将Base64字符串解码为字节 ciphertext_bytes base64.b64decode(ciphertext_b64) # 3. 使用OAEP填充进行解密 plaintext_bytes private_key.decrypt( ciphertext_bytes, padding.OAEP( mgfpadding.MGF1(algorithmhashes.SHA256()), algorithmhashes.SHA256(), labelNone ) ) # 4. 将字节解码为字符串 plaintext plaintext_bytes.decode(utf-8) return plaintext # 示例完整的加密解密流程 print(\n--- 安全实践使用RSA-OAEP加密解密 ---) # 生成安全密钥对 private_key_obj, public_key_obj, private_pem, public_pem generate_rsa_keys_secure(2048) original_message 这是一条需要加密的敏感信息比如密码或令牌。 print(f原始信息: {original_message}) # 加密 encrypted_b64 encrypt_message(original_message, public_pem) print(f加密后 (Base64): {encrypted_b64[:100]}...) # 解密 decrypted_message decrypt_message(encrypted_b64, private_pem) print(f解密后信息: {decrypted_message}) print(f解密是否成功 {decrypted_message original_message})运行这段代码你会看到一个完整的、生产可用的RSA加密解密流程。Base64编码使得二进制密文可以安全地作为文本传输如在JSON、URL或数据库中。4.3 处理长数据混合加密模式RSA不适合直接加密大量数据如文件。标准做法是采用混合加密Hybrid Encryption随机生成一个对称密钥如AES-256密钥。使用这个对称密钥加密你的大文件或长数据。使用接收方的RSA公钥加密这个对称密钥。将加密后的对称密钥和加密后的数据一起发送给对方。对方用自己的RSA私钥解密出对称密钥再用对称密钥解密数据。这样既利用了对称加密的高效又利用了非对称加密解决密钥分发问题。cryptography库也提供了封装此模式的更高层接口。5. 实战避坑指南那些文档里不会写的细节理解了原理和标准用法只能算入门。真正把RSA用起来你会遇到一堆“坑”。下面是我在实际项目中总结的几个关键点。5.1 密钥格式与加载错误“RSA Public Key Not Find”这是最常见的错误之一尤其在跨系统、跨语言交互时。密钥不是简单的(n, e)数字对而是需要按照特定格式如PEM、DER编码的。PEM格式最常见以-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----包裹的Base64文本。cryptography库的public_bytes()和private_bytes()默认生成的就是PEM。DER格式二进制格式。PKCS#1 与 PKCS#8这是两种标准。PKCS#1传统PKCS#8更通用。cryptography默认使用PKCS#8。如果你从其他系统如某些Java或OpenSSL命令行生成的密钥拿到密钥格式不匹配就会导致加载失败。解决方案明确约定双方使用的密钥格式和标准。使用openssl命令进行格式转换。例如将PKCS#1私钥转为PKCS#8openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in private_pkcs1.pem -out private_pkcs8.pem。在代码中加载密钥时使用库提供的灵活加载函数如load_pem_private_key它通常能自动处理不同格式。5.2 填充方案不匹配这是导致“解密失败”或“解密出乱码”的第二大元凶。加密方使用PKCS#1 v1.5填充解密方却用OAEP去解当然会失败。解决方案在系统设计文档和代码注释中明确写明使用的填充方案。强烈推荐统一使用 OAEP。如果对接老旧系统必须使用PKCS#1 v1.5在cryptography中对应padding.PKCS1v15()。但请注意此填充方案已知存在潜在风险应尽量避免在新系统中使用。5.3 数据长度超限即使使用了填充RSA能加密的数据长度也是有限的。对于SHA-256的OAEP填充和2048位密钥最大明文长度约为256 - 2*32 - 2字节具体计算与哈希函数和MGF有关大约在190字节左右。尝试加密更长的数据会直接抛出ValueError。解决方案对于短数据如会话密钥、令牌、对称密钥直接使用RSA-OAEP加密。对于长数据务必采用上文提到的混合加密模式。在加密前先检查数据长度。可以写一个辅助函数来计算当前密钥和填充方案下的最大明文长度。5.4 性能考量与密钥管理RSA的加解密尤其是解密私钥运算是非常耗时的CPU操作。频繁用RSA解密大量数据会成为性能瓶颈。解决方案缓存解密结果如果相同密文需要多次解密可以缓存解密后的明文。使用更高效的算法对于需要高性能非对称加密的场景可以考虑椭圆曲线加密ECC如ECDH或Ed25519它们能在更短的密钥长度下提供同等或更高的安全性且运算更快。妥善管理私钥私钥是命根子。绝对不要硬编码在代码中或提交到版本库。应使用环境变量、密钥管理服务如AWS KMS, HashiCorp Vault或硬件安全模块HSM来存储和访问私钥。cryptography库在序列化私钥时支持使用密码加密serialization.BestAvailableEncryption至少为存储的私钥文件增加一层保护。6. 扩展应用场景与代码片段掌握了核心RSA的应用场景就打开了。这里提供两个常见场景的代码思路。6.1 场景一前后端密码传输加密前端如JavaScript使用RSA公钥加密用户密码后端用私钥解密。这样密码在传输过程中就是密文即使被抓包HTTPS之外也无法直接获取。后端Python Flask示例from flask import Flask, request, jsonify app Flask(__name__) # ... 加载或生成公钥/私钥 ... app.route(/get_public_key) def get_pub_key(): # 将PEM格式的公钥字符串发送给前端 return jsonify({public_key: public_pem.decode(utf-8)}) app.route(/login, methods[POST]) def login(): encrypted_password_b64 request.json.get(password) # 解密密码 try: password decrypt_message(encrypted_password_b64, private_pem) # ... 验证密码逻辑 ... return jsonify({status: success}) except Exception as e: return jsonify({status: error, message: 解密失败}), 400前端JavaScript使用jsencrypt库// 假设从后端获取了公钥字符串 publicKeyPem var encryptor new JSEncrypt(); encryptor.setPublicKey(publicKeyPem); var encryptedPassword encryptor.encrypt(userPassword); // 将 encryptedPassword 发送到后端 /login 接口6.2 场景二数据签名与验签RSA除了加密另一个核心用途是数字签名。用于验证数据的完整性和来源真实性。过程与加密相反发送方用私钥“签名”接收方用公钥“验签”。from cryptography.hazmat.primitives.asymmetric import padding as asym_padding from cryptography.exceptions import InvalidSignature def sign_data(data: bytes, private_key_pem: bytes) - str: 使用私钥对数据生成签名 private_key load_pem_private_key(private_key_pem, passwordNone) # 通常使用 PSS 填充进行签名 signature private_key.sign( data, asym_padding.PSS( mgfasym_padding.MGF1(hashes.SHA256()), salt_lengthasym_padding.PSS.MAX_LENGTH ), hashes.SHA256() ) return base64.b64encode(signature).decode() def verify_signature(data: bytes, signature_b64: str, public_key_pem: bytes) - bool: 使用公钥验证签名 public_key load_pem_public_key(public_key_pem) signature base64.b64decode(signature_b64) try: public_key.verify( signature, data, asym_padding.PSS( mgfasym_padding.MGF1(hashes.SHA256()), salt_lengthasym_padding.PSS.MAX_LENGTH ), hashes.SHA256() ) return True # 签名有效 except InvalidSignature: return False # 签名无效 # 使用示例 message b这是一条重要指令需要确保未被篡改。 signature sign_data(message, private_pem) print(f生成签名: {signature[:50]}...) is_valid verify_signature(message, signature, public_pem) print(f签名验证结果: {is_valid}) # 尝试篡改后验证 tampered_message b这是一条重要指令需要确保未被篡改已修改 is_valid_tampered verify_signature(tampered_message, signature, public_pem) print(f篡改后签名验证结果: {is_valid_tampered})通过这个完整的从原理到实践从基础到避坑的旅程你应该对RSA不再感到陌生和恐惧。记住在真实项目中优先使用像cryptography这样的高级库它们帮你处理了底层的复杂性和安全性细节。而理解本文阐述的原理和常见问题能让你在遇到那些库也解决不了的集成、调试问题时拥有清晰的问题定位和解决思路。

相关新闻

电力市场优化:CPLEX实现可再生能源消纳模型

电力市场优化:CPLEX实现可再生能源消纳模型

1. 项目背景与核心问题在能源互联网快速发展的背景下,两级电力市场优化运行已成为电力系统领域的重要研究方向。这个模型的核心在于解决一个关键矛盾:如何在保证电网安全稳定运行的同时,最大化可再生能源的消纳比例?我去年参与的一…

2026/7/30 13:14:40阅读更多 →
ArcGIS授权管理器断网解决方案与优化配置

ArcGIS授权管理器断网解决方案与优化配置

1. ArcGIS授权管理器的断网困境解析作为GIS从业者,我们都经历过这样的场景:正在紧急处理空间分析任务时,网络突然中断,ArcGIS License Manager随即停止服务,导致所有依赖许可的ArcGIS软件集体罢工。这种突如其来的中断…

2026/7/30 13:14:40阅读更多 →
Python集合删除操作详解:remove、discard、pop方法与循环删除陷阱

Python集合删除操作详解:remove、discard、pop方法与循环删除陷阱

1. 从“删除失败”说起:为什么集合的删除操作值得深究? 最近在帮一个刚入门Python的朋友排查一个“诡异”的bug。他的代码逻辑很简单:从一个集合里循环删除满足特定条件的元素。代码看起来没问题,但运行时却抛出了一个 KeyError …

2026/7/30 13:14:40阅读更多 →
LangSmith vs Phoenix vs Weave:Taotoken 实测 500 次调用后,可观测性工具选型的三条生死线

LangSmith vs Phoenix vs Weave:Taotoken 实测 500 次调用后,可观测性工具选型的三条生死线

LLM应用可观测性工具深度评测:从Taotoken实战看LangSmith、Phoenix与Weave的选择 当你的LLM应用开始处理生产流量时,可观测性工具的选择会直接影响排障效率与成本控制。我们在Taotoken平台上用500次真实API调用实测了LangSmith、Phoenix和Weave三款工具…

2026/7/30 14:27:03阅读更多 →
CsGrafeq:用C#实现一个几何画板

CsGrafeq:用C#实现一个几何画板

CsGrafeq:用C#实现一个几何画板 一、引言:什么是几何画板?几何画板是一种交互式绘图工具,允许用户通过数学公式或几何约束来创建和操作图形对象。传统几何画板如GeoGebra、几何画板(The Geometer’s Sketchpad)等&…

2026/7/30 14:27:03阅读更多 →
热敏电阻工作原理、应用电路与硬件面试全解析

热敏电阻工作原理、应用电路与硬件面试全解析

热敏电阻是硬件工程师笔面试中的高频考点,这次我们直接切入核心:它是什么、怎么工作、用在哪儿、怎么测。如果你准备硬件岗位面试,或者在实际项目中需要选型测温、过流保护元件,这篇文章可以帮你快速掌握关键参数和测试方法。 热…

2026/7/30 14:27:03阅读更多 →
Simulink直流电机仿真:从模型搭建到控制环路设计的工程实践

Simulink直流电机仿真:从模型搭建到控制环路设计的工程实践

1. 从零开始:为什么电力电子仿真绕不开Simulink与直流电机 如果你刚接触电力电子,或者正在做电机控制相关的课程设计、毕业项目,大概率会听到一个建议:“用Matlab/Simulink搭个模型先仿真看看”。这几乎成了行业里的一个标准动作。…

2026/7/30 14:27:03阅读更多 →
Python Pillow图像批处理实战:尺寸调整、格式转换与水印添加

Python Pillow图像批处理实战:尺寸调整、格式转换与水印添加

在实际图像处理项目中,经常需要批量处理图片,例如调整尺寸、转换格式、添加水印或批量重命名。这类任务如果手动操作,不仅效率低下,还容易出错。本文将基于常见的Python图像处理库Pillow,演示如何构建一个实用的批量图…

2026/7/30 14:27:03阅读更多 →
Agent 读了 30 个文件之后,为什么会突然停住?

Agent 读了 30 个文件之后,为什么会突然停住?

本文是「从零理解 Claude Code:20 个 Agent Harness 机制」系列的第 8 篇。 源码仓库:shareAI-lab/learn-claude-code 本文基于开源仓库学习整理,具体实现以仓库代码为准。 我第一次碰到上下文超限时,任务正在排查一组认证测试。 …

2026/7/30 14:25:03阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →