从凯撒密码到维吉尼亚:经典密码体制原理与Python实现详解
1. 项目概述从“头歌”到密码学入门最近在“头歌”平台上接触到了“经典密码体制(上)”这个项目作为一名在信息安全领域摸爬滚打了十多年的老兵看到这个标题内心其实挺感慨的。它让我想起了自己当年入门密码学时对着那些看似神秘的字母替换和移位规则既感到好奇又有些无从下手的日子。“头歌”作为一个实践平台能推出这样的项目说明它抓住了密码学教学的一个核心痛点理论必须与实践结合而最好的实践就是从这些历经数百年甚至上千年考验的“经典”开始。这个项目标题“经典密码体制(上)”看似简单但它背后指向的是一个庞大而深邃的领域——密码学的基石。所谓“经典密码体制”通常指的是现代计算机出现之前主要依靠纸、笔和简单机械工具实现的加密方法。它们不像今天的AES、RSA那样复杂但其设计思想却异常精妙是现代密码学的灵感源泉。学习它们绝不是为了去破解什么古老的密文虽然那很有趣而是为了理解密码学最根本的三个问题机密性、完整性和认证是如何被最初定义的以及加密与解密这对“矛与盾”是如何在历史长河中不断博弈演进的。对于初学者来说直接从抽象的数论和复杂的算法开始学习密码学很容易陷入“只见树木不见森林”的困境。而“经典密码体制”就像一套精心设计的“乐高积木”结构简单组合方式直观能让你亲手搭建起“加密”和“解密”的过程从而直观地感受到替换、置换、密钥这些核心概念的力量。无论是学生、刚入行的开发人员还是对信息安全感兴趣的任何爱好者通过动手实现这些经典密码都能建立起对密码学最坚实、最直观的第一印象。接下来我就结合这个项目为你深入拆解这些经典密码的奥妙并分享一些在实现过程中真正有用的经验和容易踩的“坑”。2. 核心思路为什么从“经典”开始在动手写任何一行代码之前我们得先想明白为什么“头歌”这个项目要从“经典密码体制”开始而不是一上来就讲哈希函数或非对称加密。这背后的教学逻辑恰恰是学好密码学的关键。2.1 建立直观的加密模型所有密码系统无论多复杂都可以抽象为一个最基础的模型发送者Alice使用加密算法和密钥将明文转化为密文通过可能不安全的信道传输给接收者BobBob使用解密算法和密钥可能与加密密钥相同或不同将密文恢复为明文。而攻击者Eve则试图在不掌握密钥的情况下破译密文。经典密码如凯撒密码完美地具象化了这个模型明文 “HELLO”加密算法 将字母在字母表中向后移动固定位。密钥 移动的位数例如 3。密文 “KHOOR”解密算法 将字母在字母表中向前移动相同的固定位。这个过程一目了然。通过实现它你会立刻理解“算法”是公开的规则而“密钥”才是保密的精髓这一现代密码学的基本原则柯克霍夫原则。如果一开始就面对AES的S盒、列混淆这些操作这个基本原则反而容易被复杂的实现细节所淹没。2.2 理解核心的加密操作现代密码算法虽然复杂但其核心操作类型大多源于经典密码替换 将明文中的一个元素如字母替换为另一个元素。凯撒密码是简单的单表替换而更复杂的“仿射密码”或历史上的“恩尼格玛密码机”则是多表替换。这直接对应现代密码中的S盒Substitution Box是制造混淆的核心。置换 重新排列明文元素的顺序。例如栅栏密码。这对应现代分组密码中的P盒Permutation Box或移位行等操作是制造扩散的核心。通过手工演练替换和置换你能切身感受到“混淆”和“扩散”这两个密码学设计目标是如何被初步实现的。混淆让密钥和密文之间的关系变得复杂扩散让明文一位的变化影响到密文的许多位。2.3 体会密码分析的基本方法有加密就有破解。经典密码体制之所以“经典”也是因为它们的弱点已被充分研究。学习破解它们是入门密码分析的绝佳途径。唯密文攻击 仅凭密文进行破解。对付简单的单表替换密码如凯撒密码频率分析是最致命的武器。因为自然语言中字母的出现频率有稳定统计特征例如英文中E、T、A出现频率最高通过分析密文字母频率可以猜测替换规则。已知明文攻击 知道部分明文和对应的密文。这在很多场景下是可能的。选择明文攻击 攻击者可以选择任意明文并获取其密文。这用来分析加密算法的内部结构。在“头歌”的实践项目中你很可能需要先实现加密函数然后再实现一个能自动破解或辅助破解的程序。这个“攻防”一体的过程能让你深刻理解一个密码体制的安全性究竟取决于什么。注意很多初学者在实现时只关注加密解密功能是否正确而忽略了“破解”部分。实际上尝试破解自己的加密算法是检验你对算法理解深度和发现潜在弱点的最好方法。例如实现凯撒密码后务必写一个程序遍历所有25种可能的移位密钥并结合简单的字典检查来模拟唯密文攻击。这会让你立刻明白为什么密钥空间太小仅26种可能是致命的。3. 经典密码体制详解与实操实现基于“头歌”项目常见的递进结构“经典密码体制(上)”很可能涵盖以下几种最具代表性的密码。我们来逐一拆解其原理、实现细节和注意事项。3.1 凯撒密码一切的开端凯撒密码是一种移位密码也是最著名的单表替换密码。3.1.1 算法原理将明文中的所有字母在字母表上向后或向前按照一个固定数目进行偏移这个偏移量就是密钥。当偏移量是3时所有的字母A将被替换为DB变成E以此类推。到了字母表末尾则绕回开头。3.1.2 数学描述对于大写字母我们可以用0-25表示A-Z。设密钥为K0 K 26明文为P密文为C。加密C (P K) mod 26解密P (C - K) mod 263.1.3 代码实现要点以Python为例def caesar_encrypt(text, shift): result [] for char in text: if char.isupper(): # 将A-Z映射到0-25移位取模再映射回字符 result.append(chr((ord(char) - ord(A) shift) % 26 ord(A))) elif char.islower(): result.append(chr((ord(char) - ord(a) shift) % 26 ord(a))) else: # 非字母字符原样保留 result.append(char) return .join(result) def caesar_decrypt(ciphertext, shift): # 解密就是反向移位 return caesar_encrypt(ciphertext, -shift)3.1.4 实操心得与常见坑点字符编码范围 这是最容易出错的地方。务必严格判断字符是否在字母范围内并且区分大小写。上述代码中的char.isupper()和char.islower()判断至关重要。取模运算% 26确保了偏移后的索引始终落在0-25之间实现了“绕回”。这是算法的核心。处理非字母字符 空格、标点、数字通常应原样保留。一个健壮的加密函数必须考虑这些边界情况。密钥有效性 密钥shift为0或26的倍数时相当于没有加密。在实际项目中可以添加检查但更重要的是理解这种情况下密钥空间缩小了安全性降为零。3.2 仿射密码替换的第一次升级凯撒密码是移位可以看作一种线性变换。仿射密码则在此基础上增加了一个乘法因子是单表替换密码的更一般形式。3.2.1 算法原理加密函数定义为C (a * P b) mod 26解密函数定义为P a^(-1) * (C - b) mod 26其中P和C分别是明文和密文字母对应的数字0-25。a和b是密钥b是偏移量与凯撒密码的shift类似。a必须与26互质即gcd(a, 26) 1。否则加密函数就不是一一映射会导致多个明文字母映射到同一个密文字母无法解密。3.2.2 为什么a必须与26互质这涉及到模运算下的乘法逆元。只有当a与26互质时a在模26下才存在乘法逆元a^(-1)使得a * a^(-1) ≡ 1 (mod 26)。这个逆元是解密所必需的。例如a5与26互质其逆元5^(-1) mod 26 21因为5*21105, 105 mod 26 1。而a2与26不互质公约数为2就没有模26下的逆元。3.2.3 代码实现与逆元计算def extended_gcd(a, b): 扩展欧几里得算法返回(gcd, x, y)使得 a*x b*y gcd if a 0: return b, 0, 1 gcd, x1, y1 extended_gcd(b % a, a) x y1 - (b // a) * x1 y x1 return gcd, x, y def mod_inverse(a, m): 求a在模m下的乘法逆元不存在则返回None gcd, x, _ extended_gcd(a, m) if gcd ! 1: return None # 逆元不存在 return x % m def affine_encrypt(text, a, b): if mod_inverse(a, 26) is None: raise ValueError(f密钥a{a}与26不互质无法用于仿射密码。) result [] for char in text: if char.isupper(): P ord(char) - ord(A) C (a * P b) % 26 result.append(chr(C ord(A))) elif char.islower(): P ord(char) - ord(a) C (a * P b) % 26 result.append(chr(C ord(a))) else: result.append(char) return .join(result) def affine_decrypt(ciphertext, a, b): a_inv mod_inverse(a, 26) if a_inv is None: raise ValueError(f密钥a{a}无逆元无法解密。) result [] for char in ciphertext: if char.isupper(): C ord(char) - ord(A) P (a_inv * (C - b)) % 26 result.append(chr(P ord(A))) elif char.islower(): C ord(char) - ord(a) P (a_inv * (C - b)) % 26 result.append(chr(P ord(a))) else: result.append(char) return .join(result)3.2.4 注意事项密钥空间 与26互质的a有12个1,3,5,7,9,11,15,17,19,21,23,25b有26种可能所以密钥空间为12*26312。虽然比凯撒密码大但仍然非常小计算机可以瞬间暴力破解。安全性本质 它仍然是单表替换密码。每个明文字母总是被替换成同一个密文字母。因此它无法抵抗频率分析攻击。这是所有单表替换密码的命门。3.3 维吉尼亚密码多表替换的里程碑为了克服单表替换密码频率特征明显的弱点维吉尼亚密码引入了密钥词的概念实现了多表替换。3.3.1 算法原理它使用一个关键词如“KEY”将关键词重复至与明文等长。明文的每个字母根据关键词对应字母的偏移量A0, B1...进行凯撒移位。 例如明文 ATTACKATDAWN密钥 KEYKEYKEYKEYK加密 A(明文) K(密钥对应偏移10) K (密文) T(明文) E(密钥对应偏移4) X (密文) ...3.3.2 核心进步密钥词使得同一个明文字母在不同位置可能被加密成不同的密文字母例如第一个T被加密为X第二个T被加密为N。这极大地破坏了明文固有的频率统计特征安全性相比单表替换有质的提升。3.3.3 代码实现def vigenere_encrypt(text, key): result [] key key.upper() key_index 0 for char in text: if char.isalpha(): shift ord(key[key_index % len(key)]) - ord(A) if char.isupper(): base ord(A) else: base ord(a) encrypted_char chr((ord(char) - base shift) % 26 base) result.append(encrypted_char) key_index 1 else: result.append(char) return .join(result) def vigenere_decrypt(ciphertext, key): result [] key key.upper() key_index 0 for char in ciphertext: if char.isalpha(): shift ord(key[key_index % len(key)]) - ord(A) if char.isupper(): base ord(A) else: base ord(a) decrypted_char chr((ord(char) - base - shift) % 26 base) result.append(decrypted_char) key_index 1 else: result.append(char) return .join(result)3.3.4 实操心得密钥管理 维吉尼亚密码的安全性很大程度上依赖于密钥词的长度和随机性。短且简单的密钥词如“KEY”很容易被攻破。自动密钥变种 有一种变种叫“自动密钥密码”它使用明文本身或密文的一部分作为后续密钥以消除密钥的重复模式安全性更高。在“头歌”的进阶任务中可能会遇到。破解方法 虽然抗频率分析但维吉尼亚密码并非不可破。经典的破解方法是卡西斯基试验和重合指数法用于推测密钥词的长度然后对每个分组使用同一密钥字母加密的密文分别进行频率分析。3.4 栅栏密码与置换密码改变顺序的艺术与替换密码不同置换密码不改变明文符号本身只改变它们的顺序。3.4.1 栅栏密码原理将明文按“之”字形写在预定行数的栅栏上然后按行读取形成密文。 例如明文“HELLOWORLD”用3栏栅栏加密H O L - 第1行 E L W R D - 第2行 L O - 第3行按行读取第1行“HOL”第2行“ELWRD”第3行“LO”得到密文“HOLELWRDLO”。3.4.2 代码实现思路加密的关键是计算每个字符在“之”字形路径上的位置。一个更通用的方法是模拟“写栅栏”的过程。def rail_fence_encrypt(text, rails): # 创建rails个空字符串代表每一行 fence [] * rails rail 0 direction 1 # 1表示向下-1表示向上 for char in text: fence[rail] char rail direction # 到达顶部或底部时转向 if rail rails - 1 or rail 0: direction -direction return .join(fence) def rail_fence_decrypt(ciphertext, rails): # 解密稍复杂需要先重建栅栏的“形状”每个位置是否有字符 fence [[] * len(ciphertext) for _ in range(rails)] rail 0 direction 1 # 第一步在栅栏上标记出“之”字形路径 for i in range(len(ciphertext)): fence[rail][i] * rail direction if rail rails - 1 or rail 0: direction -direction # 第二步将密文字母依次填入标记的位置 index 0 for r in range(rails): for c in range(len(ciphertext)): if fence[r][c] *: fence[r][c] ciphertext[index] index 1 # 第三步按照“之”字形路径读取明文 result [] rail 0 direction 1 for i in range(len(ciphertext)): result.append(fence[rail][i]) rail direction if rail rails - 1 or rail 0: direction -direction return .join(result)3.4.3 注意事项栅栏数密钥 栅栏数就是密钥。如果栅栏数为1或大于等于明文长度则加密无效。安全性 单纯的栅栏密码安全性极低因为它不改变字母频率只是打乱了顺序。通常需要与其他密码结合使用或增加多轮置换来增强安全性。列置换密码 这是更一般的置换密码。将明文按行写入一个矩阵然后按照一个密钥一个数字序列来重排列的顺序最后按列读出。实现时要注意矩阵最后一行可能需要用填充字符补全。4. 项目实战综合实现与自动化破解在“头歌”这类平台上项目通常不会只让你实现加密还会设置一些挑战比如给定一段密文让你编写程序破解它。这才是最能锻炼能力的地方。4.1 凯撒密码的暴力破解与频率分析辅助破解4.1.1 暴力破解因为密钥空间只有25种可能排除0所以最简单的方法就是遍历所有可能的移位量输出所有结果然后人工识别有意义的明文。def brute_force_caesar(ciphertext): for shift in range(1, 26): decrypted caesar_decrypt(ciphertext, shift) print(fShift {shift:2d}: {decrypted})但如何让程序自动识别呢可以引入简单的频率分析或字典检查。4.1.2 频率分析辅助破解英文中字母的平均使用频率是已知的。我们可以计算解密文本的字母频率与标准频率进行比对相关性最高的那个移位就很可能是正确密钥。def frequency_analysis_crack(ciphertext): # 英文标准频率近似值 english_freq {E: 12.7, T: 9.1, A: 8.2, O: 7.5, I: 7.0, N: 6.7, S: 6.3, H: 6.1, R: 6.0, D: 4.3, L: 4.0, C: 2.8, U: 2.8, M: 2.4, W: 2.4, F: 2.2, G: 2.0, Y: 2.0, P: 1.9, B: 1.5, V: 1.0, K: 0.8, J: 0.2, X: 0.2, Q: 0.1, Z: 0.1} best_shift 0 best_correlation -float(inf) ciphertext_upper ciphertext.upper() total_letters sum(c.isalpha() for c in ciphertext_upper) for shift in range(26): decrypted caesar_decrypt(ciphertext_upper, shift) # 计算解密文本的频率 freq {} for char in decrypted: if char.isalpha(): freq[char] freq.get(char, 0) 1 # 计算相关性这里使用简单的点积 correlation 0 for letter, standard_prob in english_freq.items(): observed_prob freq.get(letter, 0) / total_letters * 100 if total_letters 0 else 0 correlation standard_prob * observed_prob if correlation best_correlation: best_correlation correlation best_shift shift return best_shift, caesar_decrypt(ciphertext, best_shift)提示 频率分析在文本较短时可能不准。在实际破解中常将暴力破解的所有结果与一个常用词字典进行匹配选择包含最多有效单词的那个结果作为最终答案。这比纯频率分析更可靠。4.2 维吉尼亚密码的破解思路卡西斯基试验简介完全自动化破解维吉尼亚密码比较复杂但“头歌”项目可能会引导你完成关键步骤推测密钥长度。4.2.1 卡西斯基试验原理在密文中寻找重复出现的片段如三个或以上字母的组合。这些重复可能源于明文中相同的单词或短语被密钥中相同的部分加密而成。计算这些重复片段起始位置之间的距离这些距离的最大公约数很可能就是密钥的长度。4.2.2 实现步骤简述寻找重复序列 遍历密文记录所有长度为3及以上的重复序列及其出现位置。计算间距 对每个重复序列计算其各次出现位置之间的差值。推测密钥长度 计算所有这些间距的最大公约数或公约数中出现频率最高的那个数它很可能就是密钥词的长度。一旦知道了密钥长度L就可以将密文分成L组每组都是由同一个密钥字母加密的相当于一个凯撒密码。然后对每一组分别使用频率分析或暴力破解得到L个密钥字母最终拼出密钥词。4.3 常见问题与调试技巧在实现这些密码时你肯定会遇到各种问题。下面是一些常见坑点和排查方法4.3.1 加解密结果不对或出现乱码检查一字符范围处理 这是最常见错误。确保你的加密/解密函数只对字母A-Z, a-z进行变换其他字符空格、标点、数字应原样输出。使用isupper()和islower()进行严格判断。检查二取模运算 确保在计算(ord(char) - base shift) % 26时ord(char) - base的结果在0-25之间并且对负数取模要符合预期在Python中-3 % 26 23这是正确的但某些语言处理方式不同。检查三密钥有效性验证 对于仿射密码在加密前务必检查密钥a是否与26互质并计算其逆元。可以编写一个单元测试用几个已知的明文-密文对验证函数。4.3.2 栅栏密码解密后顺序混乱模拟路径 解密算法的关键在于精确重建加密时的“之”字形路径。建议先用一个短字符串如“HELLOWORLD”和小的栅栏数如3进行手动推演将每一步的栅栏矩阵画在纸上再对照代码逻辑。确保你的“方向变换”逻辑和“位置标记”逻辑与加密时完全一致。4.3.3 破解程序无法找到正确密钥文本长度 频率分析需要足够长的文本才能体现统计规律。如果密文太短比如少于50个字母频率分析很可能失败。此时应依赖暴力破解字典匹配。语言模型 单纯的字母频率分析不够强健。可以引入双字母组如TH, HE, IN或三字母组THE, AND的频率或者使用更复杂的语言模型如基于n-gram的打分函数来评估解密文本的“像英语程度”这会大大提高自动破解的准确率。验证脚本 编写一个脚本用随机生成的明文和随机密钥进行加密然后用你的破解程序尝试解密统计成功率。这是检验破解算法鲁棒性的好方法。5. 从经典到现代的思考实现完这些经典密码你可能会觉得它们“太简单”、“太容易被破解”。没错以现代标准看它们确实不安全。但这个过程的价值是无价的。首先你亲手验证了柯克霍夫原则算法的安全性应依赖于密钥的保密而非算法的保密。这些算法完全公开但不知道密钥依然难以破解当然经典密码的密钥空间太小这是另一个问题。其次你直观理解了密码分析的思维方式寻找统计规律频率分析、利用已知结构重复模式、暴力搜索密钥空间。这些思想在现代密码分析中依然适用只是战场变成了更复杂的数学问题和巨大的计算空间。最后也是最重要的你认识到了经典密码的局限性密钥空间不足、无法抵抗统计攻击。这直接引出了现代密码学的发展方向如何设计算法使得即使拥有海量计算资源也无法在合理时间内从密文中推导出明文或密钥这便导向了对混淆和扩散更极致的追求以及公钥密码学等革命性思想的诞生。在“头歌”的后续项目或你自己的学习中当你遇到AES的轮函数、RSA的大数分解、椭圆曲线的离散对数问题时不妨回想一下凯撒密码的移位和维吉尼亚密码的多表替换。你会发现那些最复杂、最精妙的现代密码其设计哲学的源头往往就隐藏在这些简单而优雅的经典玩具之中。理解这些基础就像练武时扎马步枯燥但决定了你未来能走多高多远。

相关新闻

MyBatis找不到Getter异常全解析:从反射机制到OGNL表达式的深度排查指南

MyBatis找不到Getter异常全解析:从反射机制到OGNL表达式的深度排查指南

1. 项目概述:一个“找不到Getter”引发的血案如果你在用MyBatis,尤其是和Spring Boot整合开发时,大概率见过这个让人血压飙升的异常:There is no getter for property named ‘xxxxx’ in ‘class com.xxx.xx.xx.xxxx‘”。表面上…

2026/10/2 3:45:06 阅读更多 →
MySQL安装配置全攻略:从下载到避坑,新手必看

MySQL安装配置全攻略:从下载到避坑,新手必看

1. 从零到一:为什么你的MySQL安装总是不顺?如果你在搜索引擎里敲下“MySQL安装教程”,大概率会看到一堆大同小异的文章,告诉你“下一步、下一步”就完事了。但真到自己动手时,服务启动失败、命令行连不上、密码忘了、环…

2026/10/13 13:13:53 阅读更多 →
NavTab:打造纯净高效浏览器新标签页,提升开发工作效率

NavTab:打造纯净高效浏览器新标签页,提升开发工作效率

上周帮一个刚入行的朋友配置开发环境,他盯着浏览器里密密麻麻的收藏夹和满屏的新闻推送,问了我一个问题:“有没有一个浏览器新标签页,能让我一眼看到最常用的几个网站,没有广告,没有新闻,最好还…

2026/10/14 1:45:24 阅读更多 →

最新新闻

MiniMind:两小时3元成本从零训练64M参数中文大模型

MiniMind:两小时3元成本从零训练64M参数中文大模型

我第一次看到 MiniMind 这个项目时,第一反应是:3块钱、2小时、64M参数、从零训练大语言模型?这四个词摆在一起,怎么看都像标题党。但真正把项目思路拆开跑完一遍之后,我得说,这个项目的价值不在于那 64M 参…

2026/10/14 23:30:13 阅读更多 →
边反转题别再套分层图!拆边法+Dijkstra一举拿下

边反转题别再套分层图!拆边法+Dijkstra一举拿下

在刷图论题的时候,“边反转”三个字一出现,我第一反应是上分层图、加状态、搞一个二维 dist。结果做完这道编号 3650 的中等题才发现,它真正考的东西其实是建模直觉:把“反转”这件事预计算进边权里,一次普通 Dijkstra…

2026/10/14 23:30:13 阅读更多 →
WeKnora知识库部署实战:从源码包到可用系统的完整指南

WeKnora知识库部署实战:从源码包到可用系统的完整指南

简介:这套源码包专为希望本地部署知识库系统的开发者和 RAG 技术学习者打造,定位为 WeKnora 部署的轻量参考工程。内容覆盖腾讯开源 WeKnora 的部署配置源码,集中呈现环境变量、大语言模型、Embedding、Rerank 等模型接入方式,同时…

2026/10/14 23:30:13 阅读更多 →
回溯算法入门:从全排列到N皇后的完整思维框架

回溯算法入门:从全排列到N皇后的完整思维框架

第一次见到回溯题的时候,我整整一个下午没缓过来。题目是全排列,第一反应是三层循环套上去,结果输入一变长的就崩了;后来知道标准做法只用递归,满打满算十几行代码。奇怪的是,代码我可以默写出来&#xff0…

2026/10/14 23:30:13 阅读更多 →
12B小模型Agent Skill框架:技能选择准确率逼近90%,算力成本降低50%

12B小模型Agent Skill框架:技能选择准确率逼近90%,算力成本降低50%

1. 小模型的大野心:为什么要在12B参数上死磕Agent Skill框架大模型动辄千亿参数,推理一次的电费够买一杯咖啡,这已经成了很多团队落地智能体时最头疼的事。但真实业务场景里,不是每个任务都需要一个“全能学霸”来回答。大量场景—…

2026/10/14 23:30:13 阅读更多 →
聊天机器人如何实现新闻传播全链条再造:从选题到分发的对话式智能体实践

聊天机器人如何实现新闻传播全链条再造:从选题到分发的对话式智能体实践

1. 从标题拆解这个项目的核心命题1.1 这个标题到底在说什么“聊天机器人与新闻传播的全链条再造”,这个标题我第一次看到的时候,脑子里蹦出来的第一个念头是:终于有人把这件事从“工具层”往“流程层”去想了。市面上大多数讨论还停留在“用A…

2026/10/14 23:29:06 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →