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

VB.NET使用Jagged Array构建AES工具时遇空引用错误求助

解决AES学习工具中的交错数组空引用错误

嘿,我看到你在动手实现AES学习工具时碰到了交错数组的空引用问题,这是个很典型的新手坑,咱们一步步把它捋清楚!

错误原因分析

你声明了Dim istate()() As String,这只是告诉VB“这是一个交错数组类型的变量”,但并没有实际创建数组实例,也没有初始化里面的每一个子数组。当你尝试执行istate(i)(x) = strVal时,istate(i)还只是一个空引用(Nothing),自然就抛出了"Object reference not set to an instance of an object"错误。

另外,你的循环逻辑还有个小问题:嵌套在最内层的For Each c As Char In cipherKey会把密钥的每个字符都重复赋值到同一个istate(i)(x)位置,最后数组里全是密钥最后一个字符的十六进制值,这肯定不是你想要的填充效果。

修复方案及代码修改

第一步:初始化交错数组

在使用istate之前,需要先创建外层数组,再逐个初始化每个子数组(因为AES状态是4x4矩阵,所以外层和子数组长度都是4)。

第二步:修正密钥填充逻辑

按顺序取密钥的字符填充状态矩阵,而不是重复覆盖同一个位置。如果密钥长度不够AES要求(比如AES-128需要16个字符),可以补充默认值或者做长度校验。

修改后的Button1_Click代码如下:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    cipherKey = TextBox1.Text
    newKey.Clear()
    
    ' 初始化4x4的状态交错数组:先创建外层数组,再初始化每个子数组
    ReDim istate(3)
    For i = 0 To 3
        ReDim istate(i)(3)
    Next
    
    ' 按顺序填充状态矩阵(这里假设密钥用于AES-128,需要16个字符)
    Dim charIndex As Integer = 0
    For i = 0 To 3
        For x = 0 To 3
            If charIndex < cipherKey.Length Then
                ' 转成十六进制并大写,保持和sBox一致的格式
                strVal = Convert.ToString(Convert.ToInt32(cipherKey(charIndex)), 16).ToUpper()
                istate(i)(x) = strVal
                charIndex += 1
            Else
                ' 密钥长度不足时填充默认值,也可以这里加个提示框告知用户
                istate(i)(x) = "00"
            End If
        Next
    Next
    
    ' 可选:调试输出,验证状态数组是否正确填充
    For i = 0 To 3
        Debug.WriteLine($"行{i}: {String.Join(", ", istate(i))}")
    Next
End Sub

学习AES的小提示

  • AES的状态矩阵是列优先存储的,也就是密钥扩展时是按列填充的,如果你后续要实现密钥扩展逻辑,记得调整循环顺序。
  • 你的sBox和invSBox用字符串数组其实没必要,换成Byte()类型会更高效,因为AES的所有操作都是基于字节的,字符串转来转去容易出错。
  • 密钥长度要符合AES标准:AES-128对应16字节(16个ASCII字符),AES-192对应24字节,AES-256对应32字节,后续实现密钥扩展时要注意校验。

内容的提问来源于stack exchange,提问作者Wilko84

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:06:02