Python调用自定义函数时出现'type' object is not subscriptable错误
排查Python AES列混淆代码中的'type' object is not subscriptable错误
问题重现
用户实现了处理4x4 numpy数组的AES列混淆相关函数,代码如下:
import numpy as np def getValues(row,column,resultMatrix): a=resultMatrix[row][column] prefix='0x' a=prefix+a an_integer = int(a, 16) return an_integer mixMatrix=np.array([['00','00','00','00'], ['00','00','00','00'], ['00','00','00','00'], ['00','00','00','00']]) def mixColumns(a, b, c, d,column): v1=(gmul(a, 2) ^ gmul(b, 3) ^ gmul(c, 1) ^ gmul(d, 1)) v2=(gmul(a, 1) ^ gmul(b, 2) ^ gmul(c, 3) ^ gmul(d, 1)) v3=(gmul(a, 1) ^ gmul(b, 1) ^ gmul(c, 2) ^ gmul(d, 3)) v4=(gmul(a, 3) ^ gmul(b, 1) ^ gmul(c, 1) ^ gmul(d, 2)) v1=hex(v1); char0=v1[2];char1=v1[3];v1=str(char0+char1) mixMatrix[0][column]=v1 v2=hex(v2); char0=v2[2];char1=v2[3];v2=str(char0+char1) mixMatrix[1][column]=v2 v3=hex(v3); char0=v3[2];char1=v3[3];v3=str(char0+char1) mixMatrix[2][column]=v3 v4=hex(v4); char0=v4[2];char1=v4[3];v4=str(char0+char1) mixMatrix[3][column]=v4 return mixMatrix def gmul(a, b): if b == 1: return a tmp = (a << 1) & 0xff if b == 2: return tmp if a < 128 else tmp ^ 0x1b if b == 3: return gmul(a, 2) ^ a
执行调用语句时出现错误:'type' object is not subscriptable
a=getValues(0,0,resultMatrix);b=getValues(1,0,resultMatrix);c=getValues(2,0,resultMatrix);d=getValues(3,0,resultMatrix);mixColumns(a, b, c, d,0)
错误原因分析
- gmul函数缩进错误:gmul被嵌套在mixColumns函数内部且位于return语句之后,导致mixColumns调用gmul时该函数尚未定义,会触发作用域相关错误,同时破坏代码结构。
- resultMatrix未正确初始化:如果
resultMatrix是numpy数组的类型(np.array)而非实例对象,调用resultMatrix[row][column]时会触发'type' object is not subscriptable错误——类型对象无法通过下标访问。 - numpy数组赋值方式不规范:使用
mixMatrix[row][column]操作numpy数组时,可能产生视图而非直接赋值,引发潜在的索引或类型问题。 - 十六进制转换边界处理缺失:当数值小于0x10时,
hex()返回的字符串长度不足4位(如0xf),手动截取v1[2]和v1[3]会导致索引错误。
修复方案
1. 调整gmul函数作用域
将gmul移出mixColumns,改为全局函数,确保mixColumns调用时能正常找到该函数:
def gmul(a, b): if b == 1: return a tmp = (a << 1) & 0xff if b == 2: return tmp if a < 128 else tmp ^ 0x1b if b == 3: return gmul(a, 2) ^ a
2. 正确初始化resultMatrix
确保resultMatrix是4x4的numpy字符串数组实例,示例如下:
resultMatrix = np.array([ ['11', '22', '33', '44'], ['55', '66', '77', '88'], ['99', 'aa', 'bb', 'cc'], ['dd', 'ee', 'ff', '00'] ], dtype=str)
3. 规范numpy数组索引赋值
使用numpy推荐的逗号分隔索引方式,避免视图问题:
mixMatrix[0, column] = v1 mixMatrix[1, column] = v2 mixMatrix[2, column] = v3 mixMatrix[3, column] = v4
4. 优化十六进制字符串转换
使用格式化字符串自动补零,避免手动截取的索引错误:
v1 = f"{v1:02x}" v2 = f"{v2:02x}" v3 = f"{v3:02x}" v4 = f"{v4:02x}"
完整修复后的代码
import numpy as np def getValues(row, column, resultMatrix): a = resultMatrix[row, column] an_integer = int(f"0x{a}", 16) return an_integer def gmul(a, b): if b == 1: return a tmp = (a << 1) & 0xff if b == 2: return tmp if a < 128 else tmp ^ 0x1b if b == 3: return gmul(a, 2) ^ a mixMatrix = np.array([ ['00','00','00','00'], ['00','00','00','00'], ['00','00','00','00'], ['00','00','00','00'] ], dtype=str) def mixColumns(a, b, c, d, column): v1 = gmul(a, 2) ^ gmul(b, 3) ^ gmul(c, 1) ^ gmul(d, 1) v2 = gmul(a, 1) ^ gmul(b, 2) ^ gmul(c, 3) ^ gmul(d, 1) v3 = gmul(a, 1) ^ gmul(b, 1) ^ gmul(c, 2) ^ gmul(d, 3) v4 = gmul(a, 3) ^ gmul(b, 1) ^ gmul(c, 1) ^ gmul(d, 2) v1 = f"{v1:02x}" v2 = f"{v2:02x}" v3 = f"{v3:02x}" v4 = f"{v4:02x}" mixMatrix[0, column] = v1 mixMatrix[1, column] = v2 mixMatrix[2, column] = v3 mixMatrix[3, column] = v4 return mixMatrix # 初始化resultMatrix resultMatrix = np.array([ ['11', '22', '33', '44'], ['55', '66', '77', '88'], ['99', 'aa', 'bb', 'cc'], ['dd', 'ee', 'ff', '00'] ], dtype=str) # 调用测试 a = getValues(0,0,resultMatrix) b = getValues(1,0,resultMatrix) c = getValues(2,0,resultMatrix) d = getValues(3,0,resultMatrix) print(mixColumns(a, b, c, d, 0))
内容的提问来源于stack exchange,提问作者Omar Hazem
相关产品推荐
相关产品推荐

