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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:31:07