如何修复Python中**运算的list与int操作数报错,加密s的十进制值并输出结果
问题根因
你遇到的报错由以下几处代码错误直接触发:
- 笔误导致核心类型错误:循环计算加密值时,误将幂运算的操作数写为整个列表
decimalList,也就是代码里的cipherElement = mod(decimalList**e, n)这一行,本来应该对当前遍历的单个数字i做运算,结果错写成对整个列表求幂。Python不支持列表与整数的幂运算,直接抛出unsupported operand type(s) for ** or pow: 'list' and 'int'错误 - 自定义
mod函数冗余:Python内置取模运算符%本身可自动处理被除数小于除数的场景,单独编写分支判断没有实际作用 - 类型不匹配隐患:
''.join()仅支持拼接字符串类型元素,直接传入整数类型的加密结果会触发二次报错 - 逻辑偏差:原加密逻辑中对整个十进制明文拆分为单个数字逐值运算,和块加密的常规运算目标存在偏差
修改方案
根据你的实际加密需求,对应调整逻辑即可正常运行,最终输出为十进制格式结果:
需求1:对整块十进制明文直接做加密运算(符合块加密的常规逻辑)
用Python内置的高效模幂函数pow(底数, 指数, 模数)替代手写的幂运算+取模逻辑,完整可运行代码如下:
#Hexadecimal to decimal def hex_to_decimal(hex_str): decimal_number = int(hex_str, 16) return decimal_number s = "66a9b2d0b1baf7932416c65a28af3c89" decimal = hex_to_decimal(s) print("s in decimal: ", decimal) #Encryption e = 79 n = 3220 def enk_blok(m): # 直接对整块明文做模幂运算,自动返回十进制加密结果 cipher = pow(m, e, n) return str(cipher) c = enk_blok(decimal) print("The result: ", c)
需求2:将十进制明文拆分为单个数字逐位加密
如果你的设计要求拆分逐位计算,需要修正循环内的运算对象,同时统一拼接的元素类型,代码调整为:
#Hexadecimal to decimal def hex_to_decimal(hex_str): decimal_number = int(hex_str, 16) return decimal_number s = "66a9b2d0b1baf7932416c65a28af3c89" decimal = hex_to_decimal(s) print("s in decimal: ", decimal) #Encryption e = 79 n = 3220 def enk_blok(m): decimalList = [int(i) for i in str(m)] cipher = [] for i in decimalList: # 修正运算对象为当前遍历的单个数字i,而非整个列表 cipherElement = pow(i, e, n) # 整数转字符串,适配join的参数要求 cipher.append(str(cipherElement)) return ''.join(cipher) c = enk_blok(decimal) print("The result: ", c)
内容的提问来源于stack exchange,提问作者brianK
相关产品推荐
相关产品推荐

