' AriaCore.vb (WelsonJS.Cryptography) ' SPDX-License-Identifier: MIT ' SPDX-FileCopyrightText: 2025 Namhyeon Go , Catswords OSS And WelsonJS Contributors ' https://github.com/gnh1201/welsonjs ' Public Class AriaCore Private S(3, 255) As Byte Private KRK(2, 15) As Byte Private roundKeyEnc(271) As Byte Private roundKeyDec(271) As Byte Private R As Integer Private ReadOnly KeyBits As Integer Public Sub New(key As Byte()) If key.Length Mod 8 <> 0 Or key.Length < 16 Or key.Length > 32 Then Throw New ArgumentException($"ARIA key must be 16, 24, or 32 bytes. Your key length is {key.Length} bytes") End If InitConstants() KeyBits = key.Length * 8 roundKeyEnc = New Byte(271) {} roundKeyDec = New Byte(271) {} R = EncKeySetup(key, roundKeyEnc) DecKeySetup(key, roundKeyDec) End Sub Public Sub EncryptBlock(input() As Byte, inOffset As Integer, output() As Byte, outOffset As Integer) Dim block(15) As Byte Array.Copy(input, inOffset, block, 0, 16) Dim encrypted(15) As Byte Crypt(block, R, roundKeyEnc, encrypted) Array.Copy(encrypted, 0, output, outOffset, 16) End Sub Public Sub DecryptBlock(input() As Byte, inOffset As Integer, output() As Byte, outOffset As Integer) Dim block(15) As Byte Array.Copy(input, inOffset, block, 0, 16) Dim decrypted(15) As Byte Crypt(block, R, roundKeyDec, decrypted) Array.Copy(decrypted, 0, output, outOffset, 16) End Sub Public Sub InitConstants() KRK = New Byte(,) { { &H51, &H7C, &HC1, &HB7, &H27, &H22, &HA, &H94, &HFE, &H13, &HAB, &HE8, &HFA, &H9A, &H6E, &HE0 }, { &H6D, &HB1, &H4A, &HCC, &H9E, &H21, &HC8, &H20, &HFF, &H28, &HB1, &HD5, &HEF, &H5D, &HE2, &HB0 }, { &HDB, &H92, &H37, &H1D, &H21, &H26, &HE9, &H70, &H3, &H24, &H97, &H75, &H4, &HE8, &HC9, &HE } } S = New Byte(,) { { &H63, &H7C, &H77, &H7B, &HF2, &H6B, &H6F, &HC5, &H30, &H1, &H67, &H2B, &HFE, &HD7, &HAB, &H76, &HCA, &H82, &HC9, &H7D, &HFA, &H59, &H47, &HF0, &HAD, &HD4, &HA2, &HAF, &H9C, &HA4, &H72, &HC0, &HB7, &HFD, &H93, &H26, &H36, &H3F, &HF7, &HCC, &H34, &HA5, &HE5, &HF1, &H71, &HD8, &H31, &H15, &H4, &HC7, &H23, &HC3, &H18, &H96, &H5, &H9A, &H7, &H12, &H80, &HE2, &HEB, &H27, &HB2, &H75, &H9, &H83, &H2C, &H1A, &H1B, &H6E, &H5A, &HA0, &H52, &H3B, &HD6, &HB3, &H29, &HE3, &H2F, &H84, &H53, &HD1, &H0, &HED, &H20, &HFC, &HB1, &H5B, &H6A, &HCB, &HBE, &H39, &H4A, &H4C, &H58, &HCF, &HD0, &HEF, &HAA, &HFB, &H43, &H4D, &H33, &H85, &H45, &HF9, &H2, &H7F, &H50, &H3C, &H9F, &HA8, &H51, &HA3, &H40, &H8F, &H92, &H9D, &H38, &HF5, &HBC, &HB6, &HDA, &H21, &H10, &HFF, &HF3, &HD2, &HCD, &HC, &H13, &HEC, &H5F, &H97, &H44, &H17, &HC4, &HA7, &H7E, &H3D, &H64, &H5D, &H19, &H73, &H60, &H81, &H4F, &HDC, &H22, &H2A, &H90, &H88, &H46, &HEE, &HB8, &H14, &HDE, &H5E, &HB, &HDB, &HE0, &H32, &H3A, &HA, &H49, &H6, &H24, &H5C, &HC2, &HD3, &HAC, &H62, &H91, &H95, &HE4, &H79, &HE7, &HC8, &H37, &H6D, &H8D, &HD5, &H4E, &HA9, &H6C, &H56, &HF4, &HEA, &H65, &H7A, &HAE, &H8, &HBA, &H78, &H25, &H2E, &H1C, &HA6, &HB4, &HC6, &HE8, &HDD, &H74, &H1F, &H4B, &HBD, &H8B, &H8A, &H70, &H3E, &HB5, &H66, &H48, &H3, &HF6, &HE, &H61, &H35, &H57, &HB9, &H86, &HC1, &H1D, &H9E, &HE1, &HF8, &H98, &H11, &H69, &HD9, &H8E, &H94, &H9B, &H1E, &H87, &HE9, &HCE, &H55, &H28, &HDF, &H8C, &HA1, &H89, &HD, &HBF, &HE6, &H42, &H68, &H41, &H99, &H2D, &HF, &HB0, &H54, &HBB, &H16 }, { &HE2, &H4E, &H54, &HFC, &H94, &HC2, &H4A, &HCC, &H62, &HD, &H6A, &H46, &H3C, &H4D, &H8B, &HD1, &H5E, &HFA, &H64, &HCB, &HB4, &H97, &HBE, &H2B, &HBC, &H77, &H2E, &H3, &HD3, &H19, &H59, &HC1, &H1D, &H6, &H41, &H6B, &H55, &HF0, &H99, &H69, &HEA, &H9C, &H18, &HAE, &H63, &HDF, &HE7, &HBB, &H0, &H73, &H66, &HFB, &H96, &H4C, &H85, &HE4, &H3A, &H9, &H45, &HAA, &HF, &HEE, &H10, &HEB, &H2D, &H7F, &HF4, &H29, &HAC, &HCF, &HAD, &H91, &H8D, &H78, &HC8, &H95, &HF9, &H2F, &HCE, &HCD, &H8, &H7A, &H88, &H38, &H5C, &H83, &H2A, &H28, &H47, &HDB, &HB8, &HC7, &H93, &HA4, &H12, &H53, &HFF, &H87, &HE, &H31, &H36, &H21, &H58, &H48, &H1, &H8E, &H37, &H74, &H32, &HCA, &HE9, &HB1, &HB7, &HAB, &HC, &HD7, &HC4, &H56, &H42, &H26, &H7, &H98, &H60, &HD9, &HB6, &HB9, &H11, &H40, &HEC, &H20, &H8C, &HBD, &HA0, &HC9, &H84, &H4, &H49, &H23, &HF1, &H4F, &H50, &H1F, &H13, &HDC, &HD8, &HC0, &H9E, &H57, &HE3, &HC3, &H7B, &H65, &H3B, &H2, &H8F, &H3E, &HE8, &H25, &H92, &HE5, &H15, &HDD, &HFD, &H17, &HA9, &HBF, &HD4, &H9A, &H7E, &HC5, &H39, &H67, &HFE, &H76, &H9D, &H43, &HA7, &HE1, &HD0, &HF5, &H68, &HF2, &H1B, &H34, &H70, &H5, &HA3, &H8A, &HD5, &H79, &H86, &HA8, &H30, &HC6, &H51, &H4B, &H1E, &HA6, &H27, &HF6, &H35, &HD2, &H6E, &H24, &H16, &H82, &H5F, &HDA, &HE6, &H75, &HA2, &HEF, &H2C, &HB2, &H1C, &H9F, &H5D, &H6F, &H80, &HA, &H72, &H44, &H9B, &H6C, &H90, &HB, &H5B, &H33, &H7D, &H5A, &H52, &HF3, &H61, &HA1, &HF7, &HB0, &HD6, &H3F, &H7C, &H6D, &HED, &H14, &HE0, &HA5, &H3D, &H22, &HB3, &HF8, &H89, &HDE, &H71, &H1A, &HAF, &HBA, &HB5, &H81 }, { &H52, &H9, &H6A, &HD5, &H30, &H36, &HA5, &H38, &HBF, &H40, &HA3, &H9E, &H81, &HF3, &HD7, &HFB, &H7C, &HE3, &H39, &H82, &H9B, &H2F, &HFF, &H87, &H34, &H8E, &H43, &H44, &HC4, &HDE, &HE9, &HCB, &H54, &H7B, &H94, &H32, &HA6, &HC2, &H23, &H3D, &HEE, &H4C, &H95, &HB, &H42, &HFA, &HC3, &H4E, &H8, &H2E, &HA1, &H66, &H28, &HD9, &H24, &HB2, &H76, &H5B, &HA2, &H49, &H6D, &H8B, &HD1, &H25, &H72, &HF8, &HF6, &H64, &H86, &H68, &H98, &H16, &HD4, &HA4, &H5C, &HCC, &H5D, &H65, &HB6, &H92, &H6C, &H70, &H48, &H50, &HFD, &HED, &HB9, &HDA, &H5E, &H15, &H46, &H57, &HA7, &H8D, &H9D, &H84, &H90, &HD8, &HAB, &H0, &H8C, &HBC, &HD3, &HA, &HF7, &HE4, &H58, &H5, &HB8, &HB3, &H45, &H6, &HD0, &H2C, &H1E, &H8F, &HCA, &H3F, &HF, &H2, &HC1, &HAF, &HBD, &H3, &H1, &H13, &H8A, &H6B, &H3A, &H91, &H11, &H41, &H4F, &H67, &HDC, &HEA, &H97, &HF2, &HCF, &HCE, &HF0, &HB4, &HE6, &H73, &H96, &HAC, &H74, &H22, &HE7, &HAD, &H35, &H85, &HE2, &HF9, &H37, &HE8, &H1C, &H75, &HDF, &H6E, &H47, &HF1, &H1A, &H71, &H1D, &H29, &HC5, &H89, &H6F, &HB7, &H62, &HE, &HAA, &H18, &HBE, &H1B, &HFC, &H56, &H3E, &H4B, &HC6, &HD2, &H79, &H20, &H9A, &HDB, &HC0, &HFE, &H78, &HCD, &H5A, &HF4, &H1F, &HDD, &HA8, &H33, &H88, &H7, &HC7, &H31, &HB1, &H12, &H10, &H59, &H27, &H80, &HEC, &H5F, &H60, &H51, &H7F, &HA9, &H19, &HB5, &H4A, &HD, &H2D, &HE5, &H7A, &H9F, &H93, &HC9, &H9C, &HEF, &HA0, &HE0, &H3B, &H4D, &HAE, &H2A, &HF5, &HB0, &HC8, &HEB, &HBB, &H3C, &H83, &H53, &H99, &H61, &H17, &H2B, &H4, &H7E, &HBA, &H77, &HD6, &H26, &HE1, &H69, &H14, &H63, &H55, &H21, &HC, &H7D }, { &H30, &H68, &H99, &H1B, &H87, &HB9, &H21, &H78, &H50, &H39, &HDB, &HE1, &H72, &H9, &H62, &H3C, &H3E, &H7E, &H5E, &H8E, &HF1, &HA0, &HCC, &HA3, &H2A, &H1D, &HFB, &HB6, &HD6, &H20, &HC4, &H8D, &H81, &H65, &HF5, &H89, &HCB, &H9D, &H77, &HC6, &H57, &H43, &H56, &H17, &HD4, &H40, &H1A, &H4D, &HC0, &H63, &H6C, &HE3, &HB7, &HC8, &H64, &H6A, &H53, &HAA, &H38, &H98, &HC, &HF4, &H9B, &HED, &H7F, &H22, &H76, &HAF, &HDD, &H3A, &HB, &H58, &H67, &H88, &H6, &HC3, &H35, &HD, &H1, &H8B, &H8C, &HC2, &HE6, &H5F, &H2, &H24, &H75, &H93, &H66, &H1E, &HE5, &HE2, &H54, &HD8, &H10, &HCE, &H7A, &HE8, &H8, &H2C, &H12, &H97, &H32, &HAB, &HB4, &H27, &HA, &H23, &HDF, &HEF, &HCA, &HD9, &HB8, &HFA, &HDC, &H31, &H6B, &HD1, &HAD, &H19, &H49, &HBD, &H51, &H96, &HEE, &HE4, &HA8, &H41, &HDA, &HFF, &HCD, &H55, &H86, &H36, &HBE, &H61, &H52, &HF8, &HBB, &HE, &H82, &H48, &H69, &H9A, &HE0, &H47, &H9E, &H5C, &H4, &H4B, &H34, &H15, &H79, &H26, &HA7, &HDE, &H29, &HAE, &H92, &HD7, &H84, &HE9, &HD2, &HBA, &H5D, &HF3, &HC5, &HB0, &HBF, &HA4, &H3B, &H71, &H44, &H46, &H2B, &HFC, &HEB, &H6F, &HD5, &HF6, &H14, &HFE, &H7C, &H70, &H5A, &H7D, &HFD, &H2F, &H18, &H83, &H16, &HA5, &H91, &H1F, &H5, &H95, &H74, &HA9, &HC1, &H5B, &H4A, &H85, &H6D, &H13, &H7, &H4F, &H4E, &H45, &HB2, &HF, &HC9, &H1C, &HA6, &HBC, &HEC, &H73, &H90, &H7B, &HCF, &H59, &H8F, &HA1, &HF9, &H2D, &HF2, &HB1, &H0, &H94, &H37, &H9F, &HD0, &H2E, &H9C, &H6E, &H28, &H3F, &H80, &HF0, &H3D, &HD3, &H25, &H8A, &HB5, &HE7, &H42, &HB3, &HC7, &HEA, &HF7, &H4C, &H11, &H33, &H3, &HA2, &HAC, &H60 } } End Sub Public Sub DL(ByRef input() As Byte, ByRef output() As Byte) Dim T As Byte T = input(3) Xor input(4) Xor input(9) Xor input(14) output(0) = input(6) Xor input(8) Xor input(13) Xor T output(5) = input(1) Xor input(10) Xor input(15) Xor T output(11) = input(2) Xor input(7) Xor input(12) Xor T output(14) = input(0) Xor input(5) Xor input(11) Xor T T = input(2) Xor input(5) Xor input(8) Xor input(15) output(1) = input(7) Xor input(9) Xor input(12) Xor T output(4) = input(0) Xor input(11) Xor input(14) Xor T output(10) = input(3) Xor input(6) Xor input(13) Xor T output(15) = input(1) Xor input(4) Xor input(10) Xor T T = input(1) Xor input(6) Xor input(11) Xor input(12) output(2) = input(4) Xor input(10) Xor input(15) Xor T output(7) = input(3) Xor input(8) Xor input(13) Xor T output(9) = input(0) Xor input(5) Xor input(14) Xor T output(12) = input(2) Xor input(7) Xor input(9) Xor T T = input(0) Xor input(7) Xor input(10) Xor input(13) output(3) = input(5) Xor input(11) Xor input(14) Xor T output(6) = input(2) Xor input(9) Xor input(12) Xor T output(8) = input(1) Xor input(4) Xor input(15) Xor T output(13) = input(3) Xor input(6) Xor input(8) Xor T End Sub Public Sub RotXOR(ByRef s() As Byte, n As Integer, ByRef t() As Byte, Optional offset As Integer = 0) Dim i As Integer, q As Integer = n \ 8 : n = n Mod 8 For i = 0 To 15 t((q + i) Mod 16 + offset) = t((q + i) Mod 16 + offset) Xor (s(i) >> n) If n <> 0 Then t((q + i + 1) Mod 16 + offset) = t((q + i + 1) Mod 16 + offset) Xor (s(i) << (8 - n)) End If Next End Sub Public Function EncKeySetup(ByRef w0() As Byte, ByRef e() As Byte) As Integer Dim i As Integer Dim R As Integer = (KeyBits + 256) \ 32, q As Integer Dim t(15), w1(15), w2(15), w3(15) As Byte q = (KeyBits - 128) \ 64 For i = 0 To 15 : t(i) = S(i Mod 4, KRK(q, i) Xor w0(i)) : Next DL(t, w1) If R = 14 Then For i = 0 To 7 : w1(i) = w1(i) Xor w0(16 + i) : Next If R = 16 Then For i = 0 To 15 : w1(i) = w1(i) Xor w0(16 + i) : Next q = If(q = 2, 0, q + 1) For i = 0 To 15 : t(i) = S((2 + i) Mod 4, KRK(q, i) Xor w1(i)) : Next DL(t, w2) For i = 0 To 15 : w2(i) = w2(i) Xor w0(i) : Next q = If(q = 2, 0, q + 1) For i = 0 To 15 : t(i) = S(i Mod 4, KRK(q, i) Xor w2(i)) : Next DL(t, w3) For i = 0 To 15 : w3(i) = w3(i) Xor w1(i) : Next For i = 0 To 16 * (R + 1) - 1 : e(i) = 0 : Next RotXOR(w0, 0, e) : RotXOR(w1, 19, e) RotXOR(w1, 0, e, 16) : RotXOR(w2, 19, e, 16) RotXOR(w2, 0, e, 32) : RotXOR(w3, 19, e, 32) RotXOR(w3, 0, e, 48) : RotXOR(w0, 19, e, 48) RotXOR(w0, 0, e, 64) : RotXOR(w1, 31, e, 64) RotXOR(w1, 0, e, 80) : RotXOR(w2, 31, e, 80) RotXOR(w2, 0, e, 96) : RotXOR(w3, 31, e, 96) RotXOR(w3, 0, e, 112) : RotXOR(w0, 31, e, 112) RotXOR(w0, 0, e, 128) : RotXOR(w1, 67, e, 128) RotXOR(w1, 0, e, 144) : RotXOR(w2, 67, e, 144) RotXOR(w2, 0, e, 160) : RotXOR(w3, 67, e, 160) RotXOR(w3, 0, e, 176) : RotXOR(w0, 67, e, 176) RotXOR(w0, 0, e, 192) : RotXOR(w1, 97, e, 192) If R > 12 Then RotXOR(w1, 0, e, 208) : RotXOR(w2, 97, e, 208) RotXOR(w2, 0, e, 224) : RotXOR(w3, 97, e, 224) End If If R > 14 Then RotXOR(w3, 0, e, 240) : RotXOR(w0, 97, e, 240) RotXOR(w0, 0, e, 256) : RotXOR(w1, 109, e, 256) End If Return R End Function Public Sub DecKeySetup(ByRef w0() As Byte, ByRef d() As Byte) Dim r As Integer = EncKeySetup(w0, d) Dim t(15) As Byte, i, j As Integer For j = 0 To 15 t(j) = d(j) d(j) = d(16 * r + j) d(16 * r + j) = t(j) Next For i = 1 To r \ 2 Dim input1(15), input2(15), output1(15), output2(15) As Byte Array.Copy(d, i * 16, input1, 0, 16) DL(input1, output1) Array.Copy(d, (r - i) * 16, input2, 0, 16) DL(input2, output2) Array.Copy(output2, 0, d, i * 16, 16) Array.Copy(output1, 0, d, (r - i) * 16, 16) Next End Sub Public Sub Crypt(ByRef p() As Byte, R As Integer, ByRef e() As Byte, ByRef c() As Byte) Dim i, j As Integer Dim t(15) As Byte Dim eOffset As Integer = 0 For j = 0 To 15 : c(j) = p(j) : Next For i = 0 To (R \ 2) - 1 For j = 0 To 15 : t(j) = S(j Mod 4, e(eOffset + j) Xor c(j)) : Next DL(t, c) eOffset += 16 For j = 0 To 15 : t(j) = S((2 + j) Mod 4, e(eOffset + j) Xor c(j)) : Next DL(t, c) eOffset += 16 Next DL(c, t) For j = 0 To 15 : c(j) = e(eOffset + j) Xor t(j) : Next End Sub End Class