锯齿数组 VB.NET



我正在尝试使用交错数组来构建AES加密工具。它纯粹是为了帮助我了解加密的数学,而不是任何实际的应用程序。我尝试使用 2D 数组,但无法弄清楚如何正确迭代它们;所以我研究了锯齿状的阵列。我可以声明和初始化数据恒定且不会更改的那些;但我也在尝试遍历一个以向其添加数据,但是在尝试添加到交错数组时出现错误"对象引用未设置为对象的实例"。这是我的代码

Imports System.Text
Public Class Form1
Dim sBox()() As String = {({"63", "7C", "77", "7B", "F2", "6B", "6F", "C5", "30", "01", "67", "2B", "FE", "D7", "AB", "76"}),
({"CA", "82", "C9", "7D", "FA", "59", "47", "F0", "AD", "D4", "A2", "AF", "9C", "A4", "72", "C0"}),
({"B7", "FD", "93", "26", "36", "3F", "F7", "CC", "34", "A5", "E5", "F1", "71", "D8", "31", "15"}),
({"04", "C7", "23", "C3", "18", "96", "05", "9A", "07", "12", "80", "E2", "EB", "27", "B2", "75"}),
({"09", "83", "2C", "1A", "1B", "6E", "5A", "A0", "52", "3B", "D6", "B3", "29", "E3", "2F", "84"}),
({"53", "D1", "00", "ED", "20", "FC", "B1", "5B", "6A", "CB", "BE", "39", "4A", "4C", "58", "CF"}),
({"D0", "EF", "AA", "FB", "43", "4D", "33", "85", "45", "F9", "02", "7F", "50", "3C", "9F", "A8"}),
({"51", "A3", "40", "8F", "92", "9D", "38", "F5", "BC", "B6", "DA", "21", "10", "FF", "F3", "D2"}),
({"CD", "0C", "13", "EC", "5F", "97", "44", "17", "C4", "A7", "7E", "3D", "64", "5D", "19", "73"}),
({"60", "81", "4F", "DC", "22", "2A", "90", "88", "46", "EE", "B8", "14", "DE", "5E", "0B", "DB"}),
({"E0", "32", "3A", "0A", "49", "06", "24", "5C", "C2", "D3", "AC", "62", "91", "95", "E4", "79"}),
({"E7", "C8", "37", "6D", "8D", "D5", "4E", "A9", "6C", "56", "F4", "EA", "65", "7A", "AE", "08"}),
({"BA", "78", "25", "2E", "1C", "A6", "B4", "C6", "E8", "DD", "74", "1F", "4B", "BD", "8B", "8A"}),
({"70", "3E", "B5", "66", "48", "03", "F6", "0E", "61", "35", "57", "B9", "86", "C1", "1D", "9E"}),
({"E1", "F8", "98", "11", "69", "D9", "8E", "94", "9B", "1E", "87", "E9", "CE", "55", "28", "DF"}),
({"8C", "A1", "89", "0D", "BF", "E6", "42", "68", "41", "99", "2D", "0F", "B0", "54", "BB", "16"})}
Dim invSBox()() As String = {({"52", "09", "6A", "D5", "30", "36", "A5", "38", "BF", "40", "A3", "9E", "81", "F3", "D7", "FB"}),
({"7C", "E3", "39", "82", "9B", "2F", "FF", "87", "34", "8E", "43", "44", "C4", "DE", "E9", "CB"}),
({"54", "7B", "94", "32", "A6", "C2", "23", "3D", "EE", "4C", "95", "0B", "42", "FA", "C3", "4E"}),
({"08", "2E", "A1", "66", "28", "D9", "24", "B2", "76", "5B", "A2", "49", "6D", "8B", "D1", "25"}),
({"72", "F8", "F6", "64", "86", "68", "98", "16", "D4", "A4", "5C", "CC", "5D", "65", "B6", "92"}),
({"6C", "70", "48", "50", "FD", "ED", "B9", "DA", "5E", "15", "46", "57", "A7", "8D", "9D", "84"}),
({"90", "D8", "AB", "00", "8C", "BC", "D3", "0A", "F7", "E4", "58", "05", "B8", "B3", "45", "06"}),
({"D0", "2C", "1E", "8F", "CA", "3F", "0F", "02", "C1", "AF", "BD", "03", "01", "13", "8A", "6B"}),
({"3A", "91", "11", "41", "4F", "67", "DC", "EA", "97", "F2", "CF", "CE", "F0", "B4", "E6", "73"}),
({"96", "AC", "74", "22", "E7", "AD", "35", "85", "E2", "F9", "37", "E8", "1C", "75", "DF", "6E"}),
({"47", "F1", "1A", "71", "1D", "29", "C5", "89", "6F", "B7", "62", "0E", "AA", "18", "BE", "1B"}),
({"FC", "56", "3E", "4B", "C6", "D2", "79", "20", "9A", "DB", "C0", "FE", "78", "CD", "5A", "F4"}),
({"1F", "DD", "A8", "33", "88", "07", "C7", "31", "B1", "12", "10", "59", "27", "80", "EC", "5F"}),
({"60", "51", "7F", "A9", "19", "B5", "4A", "0D", "2D", "E5", "7A", "9F", "93", "C9", "9C", "EF"}),
({"A0", "E0", "3B", "4D", "AE", "2A", "F5", "B0", "C8", "EB", "BB", "3C", "83", "53", "99", "61"}),
({"17", "2B", "04", "7E", "BA", "77", "D6", "26", "E1", "69", "14", "63", "55", "21", "0C", "7D"})}
Dim rci()() As String = {({"01", "02", "04", "08", "10", "20", "40", "80", "1B", "36"})}
Dim cipherKey As String
Dim newKey As New StringBuilder
Dim istate()() As String
Dim strVal As String
Dim rnd As New Random
Dim column As Integer
Dim row As Integer
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
cipherKey = TextBox1.Text
newKey.Clear()
For i = 0 To 3
For x = 0 To 3
For Each c As Char In cipherKey
strVal = Convert.ToString(Convert.ToInt32(c), 16)
istate(i)(x) = strVal
Next
Next
Next
End Sub
End Class

我在行istate(i)(x) = strVal上收到错误

我很欣赏我的代码可能效率不高,就像我说的那样,我只是试图构建它并对 AES 的每个元素进行编程,以便更好地了解它的工作原理和数学。

所有数组都是固定大小的,无论是一维的、多维的还是交错的。 如果这样做:

Dim istate As String()

那么你还没有创建一个数组。 您只是声明了一个可以引用数组的变量。 如果未指定数组的大小(隐式或显式(,则尚未创建数组。 这意味着任何通过该变量为数组编制索引的尝试都将失败,因为没有数组。 为了创建特定大小的数组,您必须指定上限,例如

Dim istate(3) As String

现在,该变量引用具有四个元素的数组对象,因此您可以按索引访问这些元素。 对于 2D 数组,您必须指定两个维度的上限,例如

Dim istate(3, 3) As String

现在你有一个包含四个元素的数组,你可以通过索引访问每个元素。 交错数组是一维数组的一维数组,因此您只能最初指定外部数组的大小,即该一维数组将包含多少个一维数组,例如

Dim istate(3)() As String

然后,您必须创建每个内部数组,例如

For i = 0 To istate.GetUpperBound(0)
istate(i) = New String(3) {}
Next

现在,您可以通过索引访问每个内部数组的每个元素。

数组是引用类型的对象,因此数组变量的作用就像任何其他引用类型变量一样,即对象不会凭空出现。你必须创建它们。

最新更新