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
相关产品推荐
相关产品推荐

