协助排查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的关键细节
- 加密时生成的每个密文片段都是正整数,用
'-'分隔后不会出现'0-'这种畸形字符串 - 解密时先分割密文,再逐个转换为整数,同时加入异常捕获,能快速定位无效的密文片段
- 所有字符映射的数字都是非负整数,从根源上避免负数导致的格式问题
内容的提问来源于stack exchange,提问作者ulama
相关产品推荐
相关产品推荐

