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

协助排查int()转换ValueError错误并实现字母空格加密系统

解决ValueError: invalid literal for int() with base 10: '0-'并实现字母与空格加密系统

嘿,咱们先拆解这个烦人的错误,再一步步搭建你要的加密系统~

错误根源分析

这个ValueError其实很直白:你尝试把字符串'0-'转换成整数,但这个字符串里混了个多余的'-',根本不是合法的十进制数字。大概率是你在处理字符转数字的环节出了纰漏——比如编码时不小心拼接了无效符号,或者处理负数时格式搞错了。接下来我们基于你给出的步骤(这其实是RSA加密的核心流程)实现一套靠谱的加密系统,同时彻底避免这类错误。

完整加密系统实现(支持字母+空格)

按照你列出的步骤,我们把每一步落地成可运行的代码,同时适配字母和空格的加密需求:

1. 生成密钥基础参数

首先选两个素数p和q,计算模数n = p*q,以及欧拉函数值k = (p-1)*(q-1)。测试阶段建议选小素数,比如p=7、q=11,计算起来更方便。

2. 选择公钥指数e

e得满足两个条件:

  • 范围在1 < e < k之间
  • 和k互质(也就是两者的最大公约数是1)
    比如选e=13,验证一下:k=(7-1)*(11-1)=60,gcd(13,60)=1,完全符合要求。

3. 计算私钥指数d

d是e在模k下的乘法逆元,也就是要找到最小的正整数d,使得(e*d - 1) % k == 0。小数值情况下可以暴力枚举,复杂场景用扩展欧几里得算法更高效。

4. 字符映射与加解密逻辑

为了支持字母和空格,我们给每个字符分配唯一的整数:

  • 空格 → 0
  • 大写字母A-Z → 1-26
  • 小写字母a-z → 27-52(也可以统一转成大小写,减少映射数量)

然后用RSA的核心公式:

  • 加密:密文 = (明文数字^e) % n
  • 解密:明文数字 = (密文^d) % n

可运行代码实现

import math

# 步骤1:初始化素数与基础参数
p = 7
q = 11
n = p * q
k = (p - 1) * (q - 1)

# 步骤2:筛选符合要求的公钥e
def is_coprime(a, b):
    return math.gcd(a, b) == 1

e = 13
while not is_coprime(e, k):
    e += 1

# 步骤3:计算私钥d
def find_private_key(e, k):
    d = 1
    while (e * d - 1) % k != 0:
        d += 1
    return d

d = find_private_key(e, k)

# 字符-数字映射表:支持空格、大小写字母
char_to_num = {' ': 0}
# 大写字母A-Z → 1-26
for idx, char in enumerate('ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
    char_to_num[char] = idx + 1
# 小写字母a-z →27-52
for idx, char in enumerate('abcdefghijklmnopqrstuvwxyz'):
    char_to_num[char] = idx + 27

# 数字-字符反向映射,用于解密
num_to_char = {v: k for k, v in char_to_num.items()}

# 加密函数
def encrypt(text, pub_key_e, mod_n):
    cipher_parts = []
    for char in text:
        if char not in char_to_num:
            raise ValueError(f"不支持加密该字符:{char}")
        plain_num = char_to_num[char]
        # 用pow的三参数形式高效计算模幂
        cipher_num = pow(plain_num, pub_key_e, mod_n)
        cipher_parts.append(str(cipher_num))
    # 用'-'分隔密文片段,确保每个片段都是合法数字
    return '-'.join(cipher_parts)

# 解密函数
def decrypt(cipher_text, priv_key_d, mod_n):
    plain_chars = []
    # 分割密文,逐个处理
    cipher_nums_str = cipher_text.split('-')
    for num_str in cipher_nums_str:
        try:
            cipher_num = int(num_str)
        except ValueError as err:
            raise ValueError(f"无效的密文片段:{num_str},错误详情:{err}")
        plain_num = pow(cipher_num, priv_key_d, mod_n)
        if plain_num not in num_to_char:
            raise ValueError(f"无法解析的密文数字:{plain_num}")
        plain_chars.append(num_to_char[plain_num])
    return ''.join(plain_chars)

# 测试示例
if __name__ == "__main__":
    test_input = "Hello World!"
    # 先过滤掉不支持的字符(比如这里的'!')
    filtered_input = ''.join([c for c in test_input if c in char_to_num])
    print(f"原始文本:{filtered_input}")
    
    encrypted = encrypt(filtered_input, e, n)
    print(f"加密结果:{encrypted}")
    
    decrypted = decrypt(encrypted, d, n)
    print(f"解密结果:{decrypted}")

避免你遇到的ValueError的关键细节

  1. 加密时生成的每个密文片段都是正整数,用'-'分隔后不会出现'0-'这种畸形字符串
  2. 解密时先分割密文,再逐个转换为整数,同时加入异常捕获,能快速定位无效的密文片段
  3. 所有字符映射的数字都是非负整数,从根源上避免负数导致的格式问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:11:46