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

RSA加密数字分块报错求助:TypeError及分块逻辑实现

RSA分块问题排查与实现指导

错误原因分析

  1. 类型不匹配错误:你遇到的TypeError: '<' not supported between instances of 'str' and 'int',是因为循环中k = a[i] + a[i + 1]这行代码——a是字符串列表,+在这里是字符串拼接操作,导致k从初始的整数变成了字符串,后续和整数N比较时自然触发类型错误。
  2. 分块逻辑错误:你的代码只是简单拼接两个字符,完全没遵循RSA分块的核心要求:每个块转成整数后必须小于N,且块不能以0开头(长度大于1时)。

正确分块实现代码

p = 1039
q = 2027
# 导入素数判断函数,若自己实现isprime可替换此处
from sympy import isprime

if isprime(p) and isprime(q):
    N = p * q
    fiN = (p - 1) * (q - 1)
else:
    print('not prime')
    exit()
print(N, fiN)
e = 17
d = pow(e, -1, fiN)
d1 = [N, e]
print('open - ', d1)
d2 = [N, d]
print('secret - ', d2)

text = input("enter a string to convert into ascii values: ")
# 将字符转成ASCII数字后直接拼接成字符串,避免大整数转换问题
ascii_str = ''.join(map(str, [ord(c) for c in text]))
print("拼接后的ASCII字符串:", ascii_str)

blocks = []
current_pos = 0
# 获取N的位数,用于确定最大可能的块长度
max_block_digits = len(str(N))

while current_pos < len(ascii_str):
    # 先尝试取最长的子串(最多和N位数相同)
    end_pos = current_pos + max_block_digits
    if end_pos > len(ascii_str):
        end_pos = len(ascii_str)
    
    # 调整子串长度,直到满足两个条件:不以0开头、数值小于N
    while True:
        block_candidate = ascii_str[current_pos:end_pos]
        # 排除长度>1且以0开头的情况
        if len(block_candidate) > 1 and block_candidate[0] == '0':
            end_pos -= 1
            continue
        # 检查数值是否小于N
        if int(block_candidate) < N:
            blocks.append(block_candidate)
            current_pos = end_pos
            break
        # 若当前子串数值过大,缩短一位
        end_pos -= 1

print("最终分块结果:", blocks)

代码说明

  • ASCII字符串拼接:直接将每个字符的ASCII数字拼接成字符串,避免了大整数转换可能带来的性能或溢出问题。
  • 分块逻辑:
    1. 每次从当前位置开始,尝试取最长的子串(长度不超过N的位数)。
    2. 检查子串是否符合要求:长度大于1时不能以0开头,且转成整数后必须小于N。
    3. 如果不符合要求,就将子串长度缩短一位,直到找到符合条件的块,再处理下一段。
  • 边界处理:当剩余字符不足最大长度时,自动取剩余所有字符,确保不会遗漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:10:32