Python中使用列表元素作为SBOX坐标时出现TypeError: 'int' object is not subscriptable错误的问题咨询
问题排查与修复方案
首先,咱们直接定位你遇到的TypeError: 'int' object is not subscriptable错误:
在你第一个嵌套循环里,这段代码:
for a in range(0,4): for b in range(0,4): Text[a][b] = ( int( ord(Text[a][b])) ^int(Cle[a][b]))
把Text里原本的字符串元素(比如"B")转换成了整数(比如64)。后面你尝试执行x = (Text[i][m][0])时,相当于对一个整数做下标访问——整数没有下标属性,自然就报错了。
接下来我们一步步修复代码,实现你通过坐标遍历SBOX的需求:
1. 修复数据类型问题:将整数转为两位十进制字符串
因为你需要用每个值的十位和个位作为SBOX的行、列索引,所以得把异或后的整数转成固定两位的字符串(不足两位补0,比如37变成"37",4变成"04")。修改第一个循环:
for a in range(0,4): for b in range(0,4): # 计算异或结果,转为两位字符串(补前导0) xor_result = int(ord(Text[a][b])) ^ int(Cle[a][b]) Text[a][b] = f"{xor_result:02d}"
2. 修复Texte的初始化与赋值语法错误
你当前的Texte是空列表,而且Texte(i)[m]是错误的调用语法(列表不能用括号调用)。我们需要先初始化一个和Text结构一致的二维列表,再逐个赋值:
# 初始化Texte为4x4的空列表 Texte = [[None for _ in range(4)] for _ in range(4)] for i in range(0,4): for m in range(0,4): # 现在Text[i][m]是两位字符串,可以正常取下标 x = Text[i][m][0] y = Text[i][m][1] # 用x和y作为SBOX的索引,赋值给Texte Texte[i][m] = SBOX[int(x)][int(y)]
3. 调整Affichage函数的输出(可选优化)
因为现在Texte里的元素是短字符串(比如"77"),你可以调整Affichage里的格式化方式,让输出更整洁:
def Affichage(TextAffichage): print('[[', '],\n['.join([','.join(["'{:2}'".format(item) for item in row]) for row in TextAffichage])) print("]],\n]")
完整修复后的代码
Text = [ ["B","o","n","j"], ["o","u","r"," "], ["ç","a","v","a"], ["b","i","e","n"], ] Cle = [ ['2','5','6','7'], ['9','3','1','5'], ['7','1','7','8'], ['8','4','3','0'], ] # 修复:异或后转为两位字符串 for a in range(0,4): for b in range(0,4): xor_result = int(ord(Text[a][b])) ^ int(Cle[a][b]) Text[a][b] = f"{xor_result:02d}" def Affichage(TextAffichage): print('[[', '],\n['.join([','.join(["'{:2}'".format(item) for item in row]) for row in TextAffichage])) print("]],\n]") Affichage(Text) print("*"*30) # Substitution of the text with a data box de in decimal base SBOX = [ ['77', '23', '4', '34', '26', '34', '81', '70', '26', '86'], ['64', '96', '66', '28', '4', '2', '21', '90', '79', '83'], ['25', '13', '60', '63', '82', '36', '86', '69', '43', '17'], ['13', '80', '21', '62', '80', '92', '62', '9', '69', '40'], ['21', '76', '90', '10', '28', '32', '21', '33', '18', '56'], ['73', '50', '56', '53', '1', '7', '96', '52', '59', '98'], ['13', '80', '98', '90', '19', '30', '35', '52', '10', '55'], ['23', '85', '57', '42', '64', '50', '30', '92', '74', '86'], ['79', '4', '60', '50', '26', '76', '78', '55', '14', '32'], ['76', '43', '89', '12', '36', '49', '23', '28', '64', '37'] ] # 修复:初始化Texte并正确赋值 Texte = [[None for _ in range(4)] for _ in range(4)] for i in range(0,4): for m in range(0,4): x = Text[i][m][0] y = Text[i][m][1] Texte[i][m] = SBOX[int(x)][int(y)] # 输出替换后的结果 Affichage(Texte)
这样运行后,就不会再出现类型错误,而且能正确通过每个值的十位和个位索引SBOX完成替换。
内容的提问来源于stack exchange,提问作者Waise
相关产品推荐
相关产品推荐

