You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义消息加密后输出符号而非字母问题求助(附代码)

问题分析与解决

你遇到的加密输出符号而非字母的问题,结合给出的代码来看,主要有两个核心问题:

1. 代码逻辑阻断问题

你提供的代码里,第一段求最大公约数的return a会直接终止函数执行,后面的扩展欧几里得算法代码永远不会被运行——如果你的加密逻辑依赖模逆元计算(比如仿射加密),这会导致核心计算完全失效。

2. 数值未映射回字母范围

加密后输出乱码符号,本质是你没把计算出的数值映射回字母对应的ASCII区间。比如英文字母需要把数值限制在0-25(对应A-Z/a-z),再转换为字符,超出范围就会变成非字母符号。


修复后的核心代码

正确的扩展欧几里得算法(用于求模逆元)

def extended_gcd(a, b):
    old_r, r = a, b
    old_s, s = 1, 0
    old_t, t = 0, 1

    while r != 0:
        quotient = old_r // r
        # 更新余数与贝祖系数
        old_r, r = r, old_r - quotient * r
        old_s, s = s, old_s - quotient * s
        old_t, t = t, old_t - quotient * t

    return old_r, old_s, old_t  # 返回gcd和对应的系数

带字母映射的加密示例(以仿射加密为例)

def affine_encrypt(text, a, b):
    # 先验证a和26互质,否则无法解密
    gcd, _, _ = extended_gcd(a, 26)
    if gcd != 1:
        raise ValueError("参数a必须与26互质")
    
    result = []
    for char in text:
        if char.isupper():
            num = ord(char) - ord('A')
            encrypted_num = (a * num + b) % 26
            result.append(chr(encrypted_num + ord('A')))
        elif char.islower():
            num = ord(char) - ord('a')
            encrypted_num = (a * num + b) % 26
            result.append(chr(encrypted_num + ord('a')))
        else:
            # 非字母字符直接保留
            result.append(char)
    return ''.join(result)

关键注意事项

  • 加密计算后的数值必须对26取模,确保结果落在0-25区间内,再转换为对应ASCII字母,避免出现乱码。
  • 原代码的分段return逻辑完全错误,必须将最大公约数计算整合到扩展欧几里得算法的完整流程中,才能正确支撑需要模逆元的加密/解密逻辑。

内容的提问来源于stack exchange,提问作者Lonkin_p

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:24:55