RSA加密数字分块报错求助:TypeError及分块逻辑实现
RSA分块问题排查与实现指导
错误原因分析
- 类型不匹配错误:你遇到的
TypeError: '<' not supported between instances of 'str' and 'int',是因为循环中k = a[i] + a[i + 1]这行代码——a是字符串列表,+在这里是字符串拼接操作,导致k从初始的整数变成了字符串,后续和整数N比较时自然触发类型错误。 - 分块逻辑错误:你的代码只是简单拼接两个字符,完全没遵循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数字拼接成字符串,避免了大整数转换可能带来的性能或溢出问题。
- 分块逻辑:
- 每次从当前位置开始,尝试取最长的子串(长度不超过N的位数)。
- 检查子串是否符合要求:长度大于1时不能以0开头,且转成整数后必须小于
N。 - 如果不符合要求,就将子串长度缩短一位,直到找到符合条件的块,再处理下一段。
- 边界处理:当剩余字符不足最大长度时,自动取剩余所有字符,确保不会遗漏。
内容的提问来源于stack exchange,提问作者Akreeeal _
相关产品推荐
相关产品推荐

