AES Decrypt
The Advanced Encryption Standard (AES) also known as Rijndael is a specification for the encryption of electronic data.
For AES Encrypt algorithm click here.
Private Shared aes_sbox As 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}}
Private Shared aes_invsbox As Byte(,) = {{&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}}
Private Shared gf_mul As Byte(,) = {{&H0, &H0, &H0, &H0, &H0, &H0}, {&H2, &H3, &H9, &HB, &HD, &HE}, {&H4, &H6, &H12, &H16, &H1A, &H1C}, {&H6, &H5, &H1B, &H1D, &H17, &H12}, {&H8, &HC, &H24, &H2C, &H34, &H38}, {&HA, &HF, &H2D, &H27, &H39, &H36},
{&HC, &HA, &H36, &H3A, &H2E, &H24}, {&HE, &H9, &H3F, &H31, &H23, &H2A}, {&H10, &H18, &H48, &H58, &H68, &H70}, {&H12, &H1B, &H41, &H53, &H65, &H7E}, {&H14, &H1E, &H5A, &H4E, &H72, &H6C}, {&H16, &H1D, &H53, &H45, &H7F, &H62},
{&H18, &H14, &H6C, &H74, &H5C, &H48}, {&H1A, &H17, &H65, &H7F, &H51, &H46}, {&H1C, &H12, &H7E, &H62, &H46, &H54}, {&H1E, &H11, &H77, &H69, &H4B, &H5A}, {&H20, &H30, &H90, &HB0, &HD0, &HE0}, {&H22, &H33, &H99, &HBB, &HDD, &HEE},
{&H24, &H36, &H82, &HA6, &HCA, &HFC}, {&H26, &H35, &H8B, &HAD, &HC7, &HF2}, {&H28, &H3C, &HB4, &H9C, &HE4, &HD8}, {&H2A, &H3F, &HBD, &H97, &HE9, &HD6}, {&H2C, &H3A, &HA6, &H8A, &HFE, &HC4}, {&H2E, &H39, &HAF, &H81, &HF3, &HCA},
{&H30, &H28, &HD8, &HE8, &HB8, &H90}, {&H32, &H2B, &HD1, &HE3, &HB5, &H9E}, {&H34, &H2E, &HCA, &HFE, &HA2, &H8C}, {&H36, &H2D, &HC3, &HF5, &HAF, &H82}, {&H38, &H24, &HFC, &HC4, &H8C, &HA8}, {&H3A, &H27, &HF5, &HCF, &H81, &HA6},
{&H3C, &H22, &HEE, &HD2, &H96, &HB4}, {&H3E, &H21, &HE7, &HD9, &H9B, &HBA}, {&H40, &H60, &H3B, &H7B, &HBB, &HDB}, {&H42, &H63, &H32, &H70, &HB6, &HD5}, {&H44, &H66, &H29, &H6D, &HA1, &HC7}, {&H46, &H65, &H20, &H66, &HAC, &HC9},
{&H48, &H6C, &H1F, &H57, &H8F, &HE3}, {&H4A, &H6F, &H16, &H5C, &H82, &HED}, {&H4C, &H6A, &HD, &H41, &H95, &HFF}, {&H4E, &H69, &H4, &H4A, &H98, &HF1}, {&H50, &H78, &H73, &H23, &HD3, &HAB}, {&H52, &H7B, &H7A, &H28, &HDE, &HA5},
{&H54, &H7E, &H61, &H35, &HC9, &HB7}, {&H56, &H7D, &H68, &H3E, &HC4, &HB9}, {&H58, &H74, &H57, &HF, &HE7, &H93}, {&H5A, &H77, &H5E, &H4, &HEA, &H9D}, {&H5C, &H72, &H45, &H19, &HFD, &H8F}, {&H5E, &H71, &H4C, &H12, &HF0, &H81},
{&H60, &H50, &HAB, &HCB, &H6B, &H3B}, {&H62, &H53, &HA2, &HC0, &H66, &H35}, {&H64, &H56, &HB9, &HDD, &H71, &H27}, {&H66, &H55, &HB0, &HD6, &H7C, &H29}, {&H68, &H5C, &H8F, &HE7, &H5F, &H3}, {&H6A, &H5F, &H86, &HEC, &H52, &HD},
{&H6C, &H5A, &H9D, &HF1, &H45, &H1F}, {&H6E, &H59, &H94, &HFA, &H48, &H11}, {&H70, &H48, &HE3, &H93, &H3, &H4B}, {&H72, &H4B, &HEA, &H98, &HE, &H45}, {&H74, &H4E, &HF1, &H85, &H19, &H57}, {&H76, &H4D, &HF8, &H8E, &H14, &H59},
{&H78, &H44, &HC7, &HBF, &H37, &H73}, {&H7A, &H47, &HCE, &HB4, &H3A, &H7D}, {&H7C, &H42, &HD5, &HA9, &H2D, &H6F}, {&H7E, &H41, &HDC, &HA2, &H20, &H61}, {&H80, &HC0, &H76, &HF6, &H6D, &HAD}, {&H82, &HC3, &H7F, &HFD, &H60, &HA3},
{&H84, &HC6, &H64, &HE0, &H77, &HB1}, {&H86, &HC5, &H6D, &HEB, &H7A, &HBF}, {&H88, &HCC, &H52, &HDA, &H59, &H95}, {&H8A, &HCF, &H5B, &HD1, &H54, &H9B}, {&H8C, &HCA, &H40, &HCC, &H43, &H89}, {&H8E, &HC9, &H49, &HC7, &H4E, &H87},
{&H90, &HD8, &H3E, &HAE, &H5, &HDD}, {&H92, &HDB, &H37, &HA5, &H8, &HD3}, {&H94, &HDE, &H2C, &HB8, &H1F, &HC1}, {&H96, &HDD, &H25, &HB3, &H12, &HCF}, {&H98, &HD4, &H1A, &H82, &H31, &HE5}, {&H9A, &HD7, &H13, &H89, &H3C, &HEB},
{&H9C, &HD2, &H8, &H94, &H2B, &HF9}, {&H9E, &HD1, &H1, &H9F, &H26, &HF7}, {&HA0, &HF0, &HE6, &H46, &HBD, &H4D}, {&HA2, &HF3, &HEF, &H4D, &HB0, &H43}, {&HA4, &HF6, &HF4, &H50, &HA7, &H51}, {&HA6, &HF5, &HFD, &H5B, &HAA, &H5F},
{&HA8, &HFC, &HC2, &H6A, &H89, &H75}, {&HAA, &HFF, &HCB, &H61, &H84, &H7B}, {&HAC, &HFA, &HD0, &H7C, &H93, &H69}, {&HAE, &HF9, &HD9, &H77, &H9E, &H67}, {&HB0, &HE8, &HAE, &H1E, &HD5, &H3D}, {&HB2, &HEB, &HA7, &H15, &HD8, &H33},
{&HB4, &HEE, &HBC, &H8, &HCF, &H21}, {&HB6, &HED, &HB5, &H3, &HC2, &H2F}, {&HB8, &HE4, &H8A, &H32, &HE1, &H5}, {&HBA, &HE7, &H83, &H39, &HEC, &HB}, {&HBC, &HE2, &H98, &H24, &HFB, &H19}, {&HBE, &HE1, &H91, &H2F, &HF6, &H17},
{&HC0, &HA0, &H4D, &H8D, &HD6, &H76}, {&HC2, &HA3, &H44, &H86, &HDB, &H78}, {&HC4, &HA6, &H5F, &H9B, &HCC, &H6A}, {&HC6, &HA5, &H56, &H90, &HC1, &H64}, {&HC8, &HAC, &H69, &HA1, &HE2, &H4E}, {&HCA, &HAF, &H60, &HAA, &HEF, &H40},
{&HCC, &HAA, &H7B, &HB7, &HF8, &H52}, {&HCE, &HA9, &H72, &HBC, &HF5, &H5C}, {&HD0, &HB8, &H5, &HD5, &HBE, &H6}, {&HD2, &HBB, &HC, &HDE, &HB3, &H8}, {&HD4, &HBE, &H17, &HC3, &HA4, &H1A}, {&HD6, &HBD, &H1E, &HC8, &HA9, &H14},
{&HD8, &HB4, &H21, &HF9, &H8A, &H3E}, {&HDA, &HB7, &H28, &HF2, &H87, &H30}, {&HDC, &HB2, &H33, &HEF, &H90, &H22}, {&HDE, &HB1, &H3A, &HE4, &H9D, &H2C}, {&HE0, &H90, &HDD, &H3D, &H6, &H96}, {&HE2, &H93, &HD4, &H36, &HB, &H98},
{&HE4, &H96, &HCF, &H2B, &H1C, &H8A}, {&HE6, &H95, &HC6, &H20, &H11, &H84}, {&HE8, &H9C, &HF9, &H11, &H32, &HAE}, {&HEA, &H9F, &HF0, &H1A, &H3F, &HA0}, {&HEC, &H9A, &HEB, &H7, &H28, &HB2}, {&HEE, &H99, &HE2, &HC, &H25, &HBC},
{&HF0, &H88, &H95, &H65, &H6E, &HE6}, {&HF2, &H8B, &H9C, &H6E, &H63, &HE8}, {&HF4, &H8E, &H87, &H73, &H74, &HFA}, {&HF6, &H8D, &H8E, &H78, &H79, &HF4}, {&HF8, &H84, &HB1, &H49, &H5A, &HDE}, {&HFA, &H87, &HB8, &H42, &H57, &HD0},
{&HFC, &H82, &HA3, &H5F, &H40, &HC2}, {&HFE, &H81, &HAA, &H54, &H4D, &HCC}, {&H1B, &H9B, &HEC, &HF7, &HDA, &H41}, {&H19, &H98, &HE5, &HFC, &HD7, &H4F}, {&H1F, &H9D, &HFE, &HE1, &HC0, &H5D}, {&H1D, &H9E, &HF7, &HEA, &HCD, &H53},
{&H13, &H97, &HC8, &HDB, &HEE, &H79}, {&H11, &H94, &HC1, &HD0, &HE3, &H77}, {&H17, &H91, &HDA, &HCD, &HF4, &H65}, {&H15, &H92, &HD3, &HC6, &HF9, &H6B}, {&HB, &H83, &HA4, &HAF, &HB2, &H31}, {&H9, &H80, &HAD, &HA4, &HBF, &H3F},
{&HF, &H85, &HB6, &HB9, &HA8, &H2D}, {&HD, &H86, &HBF, &HB2, &HA5, &H23}, {&H3, &H8F, &H80, &H83, &H86, &H9}, {&H1, &H8C, &H89, &H88, &H8B, &H7}, {&H7, &H89, &H92, &H95, &H9C, &H15}, {&H5, &H8A, &H9B, &H9E, &H91, &H1B},
{&H3B, &HAB, &H7C, &H47, &HA, &HA1}, {&H39, &HA8, &H75, &H4C, &H7, &HAF}, {&H3F, &HAD, &H6E, &H51, &H10, &HBD}, {&H3D, &HAE, &H67, &H5A, &H1D, &HB3}, {&H33, &HA7, &H58, &H6B, &H3E, &H99}, {&H31, &HA4, &H51, &H60, &H33, &H97},
{&H37, &HA1, &H4A, &H7D, &H24, &H85}, {&H35, &HA2, &H43, &H76, &H29, &H8B}, {&H2B, &HB3, &H34, &H1F, &H62, &HD1}, {&H29, &HB0, &H3D, &H14, &H6F, &HDF}, {&H2F, &HB5, &H26, &H9, &H78, &HCD}, {&H2D, &HB6, &H2F, &H2, &H75, &HC3},
{&H23, &HBF, &H10, &H33, &H56, &HE9}, {&H21, &HBC, &H19, &H38, &H5B, &HE7}, {&H27, &HB9, &H2, &H25, &H4C, &HF5}, {&H25, &HBA, &HB, &H2E, &H41, &HFB}, {&H5B, &HFB, &HD7, &H8C, &H61, &H9A}, {&H59, &HF8, &HDE, &H87, &H6C, &H94},
{&H5F, &HFD, &HC5, &H9A, &H7B, &H86}, {&H5D, &HFE, &HCC, &H91, &H76, &H88}, {&H53, &HF7, &HF3, &HA0, &H55, &HA2}, {&H51, &HF4, &HFA, &HAB, &H58, &HAC}, {&H57, &HF1, &HE1, &HB6, &H4F, &HBE}, {&H55, &HF2, &HE8, &HBD, &H42, &HB0},
{&H4B, &HE3, &H9F, &HD4, &H9, &HEA}, {&H49, &HE0, &H96, &HDF, &H4, &HE4}, {&H4F, &HE5, &H8D, &HC2, &H13, &HF6}, {&H4D, &HE6, &H84, &HC9, &H1E, &HF8}, {&H43, &HEF, &HBB, &HF8, &H3D, &HD2}, {&H41, &HEC, &HB2, &HF3, &H30, &HDC},
{&H47, &HE9, &HA9, &HEE, &H27, &HCE}, {&H45, &HEA, &HA0, &HE5, &H2A, &HC0}, {&H7B, &HCB, &H47, &H3C, &HB1, &H7A}, {&H79, &HC8, &H4E, &H37, &HBC, &H74}, {&H7F, &HCD, &H55, &H2A, &HAB, &H66}, {&H7D, &HCE, &H5C, &H21, &HA6, &H68},
{&H73, &HC7, &H63, &H10, &H85, &H42}, {&H71, &HC4, &H6A, &H1B, &H88, &H4C}, {&H77, &HC1, &H71, &H6, &H9F, &H5E}, {&H75, &HC2, &H78, &HD, &H92, &H50}, {&H6B, &HD3, &HF, &H64, &HD9, &HA}, {&H69, &HD0, &H6, &H6F, &HD4, &H4},
{&H6F, &HD5, &H1D, &H72, &HC3, &H16}, {&H6D, &HD6, &H14, &H79, &HCE, &H18}, {&H63, &HDF, &H2B, &H48, &HED, &H32}, {&H61, &HDC, &H22, &H43, &HE0, &H3C}, {&H67, &HD9, &H39, &H5E, &HF7, &H2E}, {&H65, &HDA, &H30, &H55, &HFA, &H20},
{&H9B, &H5B, &H9A, &H1, &HB7, &HEC}, {&H99, &H58, &H93, &HA, &HBA, &HE2}, {&H9F, &H5D, &H88, &H17, &HAD, &HF0}, {&H9D, &H5E, &H81, &H1C, &HA0, &HFE}, {&H93, &H57, &HBE, &H2D, &H83, &HD4}, {&H91, &H54, &HB7, &H26, &H8E, &HDA},
{&H97, &H51, &HAC, &H3B, &H99, &HC8}, {&H95, &H52, &HA5, &H30, &H94, &HC6}, {&H8B, &H43, &HD2, &H59, &HDF, &H9C}, {&H89, &H40, &HDB, &H52, &HD2, &H92}, {&H8F, &H45, &HC0, &H4F, &HC5, &H80}, {&H8D, &H46, &HC9, &H44, &HC8, &H8E},
{&H83, &H4F, &HF6, &H75, &HEB, &HA4}, {&H81, &H4C, &HFF, &H7E, &HE6, &HAA}, {&H87, &H49, &HE4, &H63, &HF1, &HB8}, {&H85, &H4A, &HED, &H68, &HFC, &HB6}, {&HBB, &H6B, &HA, &HB1, &H67, &HC}, {&HB9, &H68, &H3, &HBA, &H6A, &H2},
{&HBF, &H6D, &H18, &HA7, &H7D, &H10}, {&HBD, &H6E, &H11, &HAC, &H70, &H1E}, {&HB3, &H67, &H2E, &H9D, &H53, &H34}, {&HB1, &H64, &H27, &H96, &H5E, &H3A}, {&HB7, &H61, &H3C, &H8B, &H49, &H28}, {&HB5, &H62, &H35, &H80, &H44, &H26},
{&HAB, &H73, &H42, &HE9, &HF, &H7C}, {&HA9, &H70, &H4B, &HE2, &H2, &H72}, {&HAF, &H75, &H50, &HFF, &H15, &H60}, {&HAD, &H76, &H59, &HF4, &H18, &H6E}, {&HA3, &H7F, &H66, &HC5, &H3B, &H44}, {&HA1, &H7C, &H6F, &HCE, &H36, &H4A},
{&HA7, &H79, &H74, &HD3, &H21, &H58}, {&HA5, &H7A, &H7D, &HD8, &H2C, &H56}, {&HDB, &H3B, &HA1, &H7A, &HC, &H37}, {&HD9, &H38, &HA8, &H71, &H1, &H39}, {&HDF, &H3D, &HB3, &H6C, &H16, &H2B}, {&HDD, &H3E, &HBA, &H67, &H1B, &H25},
{&HD3, &H37, &H85, &H56, &H38, &HF}, {&HD1, &H34, &H8C, &H5D, &H35, &H1}, {&HD7, &H31, &H97, &H40, &H22, &H13}, {&HD5, &H32, &H9E, &H4B, &H2F, &H1D}, {&HCB, &H23, &HE9, &H22, &H64, &H47}, {&HC9, &H20, &HE0, &H29, &H69, &H49},
{&HCF, &H25, &HFB, &H34, &H7E, &H5B}, {&HCD, &H26, &HF2, &H3F, &H73, &H55}, {&HC3, &H2F, &HCD, &HE, &H50, &H7F}, {&HC1, &H2C, &HC4, &H5, &H5D, &H71}, {&HC7, &H29, &HDF, &H18, &H4A, &H63}, {&HC5, &H2A, &HD6, &H13, &H47, &H6D},
{&HFB, &HB, &H31, &HCA, &HDC, &HD7}, {&HF9, &H8, &H38, &HC1, &HD1, &HD9}, {&HFF, &HD, &H23, &HDC, &HC6, &HCB}, {&HFD, &HE, &H2A, &HD7, &HCB, &HC5}, {&HF3, &H7, &H15, &HE6, &HE8, &HEF}, {&HF1, &H4, &H1C, &HED, &HE5, &HE1},
{&HF7, &H1, &H7, &HF0, &HF2, &HF3}, {&HF5, &H2, &HE, &HFB, &HFF, &HFD}, {&HEB, &H13, &H79, &H92, &HB4, &HA7}, {&HE9, &H10, &H70, &H99, &HB9, &HA9}, {&HEF, &H15, &H6B, &H84, &HAE, &HBB}, {&HED, &H16, &H62, &H8F, &HA3, &HB5},
{&HE3, &H1F, &H5D, &HBE, &H80, &H9F}, {&HE1, &H1C, &H54, &HB5, &H8D, &H91}, {&HE7, &H19, &H4F, &HA8, &H9A, &H83}, {&HE5, &H1A, &H46, &HA3, &H97, &H8D}}
Private Shared Function SubArray(Of T)(data As T(), index As Integer, Optional length As Integer = -1) As T()
If length = -1 Then
length = data.Length - index
End If
Dim result As T() = New T(length - 1) {}
Array.Copy(data, index, result, 0, length)
Return result
End Function
Private Shared Sub AddRoundKey(state As Byte(,), w As UInteger())
Dim subkey As Byte() = New Byte(3) {}
subkey(0) = CLng(w(0) >> 24) And Byte.MaxValue
subkey(1) = CLng(w(0) >> 16) And Byte.MaxValue
subkey(2) = CLng(w(0) >> 8) And Byte.MaxValue
subkey(3) = CLng(w(0)) And Byte.MaxValue
state(0, 0) = state(0, 0) Xor subkey(0)
state(1, 0) = state(1, 0) Xor subkey(1)
state(2, 0) = state(2, 0) Xor subkey(2)
state(3, 0) = state(3, 0) Xor subkey(3)
subkey(0) = CLng(w(1) >> 24) And Byte.MaxValue
subkey(1) = CLng(w(1) >> 16) And Byte.MaxValue
subkey(2) = CLng(w(1) >> 8) And Byte.MaxValue
subkey(3) = CLng(w(1)) And Byte.MaxValue
state(0, 1) = state(0, 1) Xor subkey(0)
state(1, 1) = state(1, 1) Xor subkey(1)
state(2, 1) = state(2, 1) Xor subkey(2)
state(3, 1) = state(3, 1) Xor subkey(3)
subkey(0) = CLng(w(2) >> 24) And Byte.MaxValue
subkey(1) = CLng(w(2) >> 16) And Byte.MaxValue
subkey(2) = CLng(w(2) >> 8) And Byte.MaxValue
subkey(3) = CLng(w(2)) And Byte.MaxValue
state(0, 2) = state(0, 2) Xor subkey(0)
state(1, 2) = state(1, 2) Xor subkey(1)
state(2, 2) = state(2, 2) Xor subkey(2)
state(3, 2) = state(3, 2) Xor subkey(3)
subkey(0) = CLng(w(3) >> 24) And Byte.MaxValue
subkey(1) = CLng(w(3) >> 16) And Byte.MaxValue
subkey(2) = CLng(w(3) >> 8) And Byte.MaxValue
subkey(3) = CLng(w(3)) And Byte.MaxValue
state(0, 3) = state(0, 3) Xor subkey(0)
state(1, 3) = state(1, 3) Xor subkey(1)
state(2, 3) = state(2, 3) Xor subkey(2)
state(3, 3) = state(3, 3) Xor subkey(3)
End Sub
Private Shared Sub InvShiftRows(state As Byte(,))
Dim t As Byte
t = state(1, 3)
state(1, 3) = state(1, 2)
state(1, 2) = state(1, 1)
state(1, 1) = state(1, 0)
state(1, 0) = t
t = state(2, 3)
state(2, 3) = state(2, 1)
state(2, 1) = t
t = state(2, 2)
state(2, 2) = state(2, 0)
state(2, 0) = t
t = state(3, 3)
state(3, 3) = state(3, 0)
state(3, 0) = state(3, 1)
state(3, 1) = state(3, 2)
state(3, 2) = t
End Sub
Private Shared Sub InvMixColumns(state As Byte(,))
Dim col As Byte() = New Byte(3) {}
col(0) = state(0, 0)
col(1) = state(1, 0)
col(2) = state(2, 0)
col(3) = state(3, 0)
state(0, 0) = gf_mul(col(0), 5)
state(0, 0) = state(0, 0) Xor gf_mul(col(1), 3)
state(0, 0) = state(0, 0) Xor gf_mul(col(2), 4)
state(0, 0) = state(0, 0) Xor gf_mul(col(3), 2)
state(1, 0) = gf_mul(col(0), 2)
state(1, 0) = state(1, 0) Xor gf_mul(col(1), 5)
state(1, 0) = state(1, 0) Xor gf_mul(col(2), 3)
state(1, 0) = state(1, 0) Xor gf_mul(col(3), 4)
state(2, 0) = gf_mul(col(0), 4)
state(2, 0) = state(2, 0) Xor gf_mul(col(1), 2)
state(2, 0) = state(2, 0) Xor gf_mul(col(2), 5)
state(2, 0) = state(2, 0) Xor gf_mul(col(3), 3)
state(3, 0) = gf_mul(col(0), 3)
state(3, 0) = state(3, 0) Xor gf_mul(col(1), 4)
state(3, 0) = state(3, 0) Xor gf_mul(col(2), 2)
state(3, 0) = state(3, 0) Xor gf_mul(col(3), 5)
col(0) = state(0, 1)
col(1) = state(1, 1)
col(2) = state(2, 1)
col(3) = state(3, 1)
state(0, 1) = gf_mul(col(0), 5)
state(0, 1) = state(0, 1) Xor gf_mul(col(1), 3)
state(0, 1) = state(0, 1) Xor gf_mul(col(2), 4)
state(0, 1) = state(0, 1) Xor gf_mul(col(3), 2)
state(1, 1) = gf_mul(col(0), 2)
state(1, 1) = state(1, 1) Xor gf_mul(col(1), 5)
state(1, 1) = state(1, 1) Xor gf_mul(col(2), 3)
state(1, 1) = state(1, 1) Xor gf_mul(col(3), 4)
state(2, 1) = gf_mul(col(0), 4)
state(2, 1) = state(2, 1) Xor gf_mul(col(1), 2)
state(2, 1) = state(2, 1) Xor gf_mul(col(2), 5)
state(2, 1) = state(2, 1) Xor gf_mul(col(3), 3)
state(3, 1) = gf_mul(col(0), 3)
state(3, 1) = state(3, 1) Xor gf_mul(col(1), 4)
state(3, 1) = state(3, 1) Xor gf_mul(col(2), 2)
state(3, 1) = state(3, 1) Xor gf_mul(col(3), 5)
col(0) = state(0, 2)
col(1) = state(1, 2)
col(2) = state(2, 2)
col(3) = state(3, 2)
state(0, 2) = gf_mul(col(0), 5)
state(0, 2) = state(0, 2) Xor gf_mul(col(1), 3)
state(0, 2) = state(0, 2) Xor gf_mul(col(2), 4)
state(0, 2) = state(0, 2) Xor gf_mul(col(3), 2)
state(1, 2) = gf_mul(col(0), 2)
state(1, 2) = state(1, 2) Xor gf_mul(col(1), 5)
state(1, 2) = state(1, 2) Xor gf_mul(col(2), 3)
state(1, 2) = state(1, 2) Xor gf_mul(col(3), 4)
state(2, 2) = gf_mul(col(0), 4)
state(2, 2) = state(2, 2) Xor gf_mul(col(1), 2)
state(2, 2) = state(2, 2) Xor gf_mul(col(2), 5)
state(2, 2) = state(2, 2) Xor gf_mul(col(3), 3)
state(3, 2) = gf_mul(col(0), 3)
state(3, 2) = state(3, 2) Xor gf_mul(col(1), 4)
state(3, 2) = state(3, 2) Xor gf_mul(col(2), 2)
state(3, 2) = state(3, 2) Xor gf_mul(col(3), 5)
col(0) = state(0, 3)
col(1) = state(1, 3)
col(2) = state(2, 3)
col(3) = state(3, 3)
state(0, 3) = gf_mul(col(0), 5)
state(0, 3) = state(0, 3) Xor gf_mul(col(1), 3)
state(0, 3) = state(0, 3) Xor gf_mul(col(2), 4)
state(0, 3) = state(0, 3) Xor gf_mul(col(3), 2)
state(1, 3) = gf_mul(col(0), 2)
state(1, 3) = state(1, 3) Xor gf_mul(col(1), 5)
state(1, 3) = state(1, 3) Xor gf_mul(col(2), 3)
state(1, 3) = state(1, 3) Xor gf_mul(col(3), 4)
state(2, 3) = gf_mul(col(0), 4)
state(2, 3) = state(2, 3) Xor gf_mul(col(1), 2)
state(2, 3) = state(2, 3) Xor gf_mul(col(2), 5)
state(2, 3) = state(2, 3) Xor gf_mul(col(3), 3)
state(3, 3) = gf_mul(col(0), 3)
state(3, 3) = state(3, 3) Xor gf_mul(col(1), 4)
state(3, 3) = state(3, 3) Xor gf_mul(col(2), 2)
state(3, 3) = state(3, 3) Xor gf_mul(col(3), 5)
End Sub
Private Shared Sub InvSubBytes(state As Byte(,))
state(0, 0) = aes_invsbox(state(0, 0) >> 4, state(0, 0) And &HF)
state(0, 1) = aes_invsbox(state(0, 1) >> 4, state(0, 1) And &HF)
state(0, 2) = aes_invsbox(state(0, 2) >> 4, state(0, 2) And &HF)
state(0, 3) = aes_invsbox(state(0, 3) >> 4, state(0, 3) And &HF)
state(1, 0) = aes_invsbox(state(1, 0) >> 4, state(1, 0) And &HF)
state(1, 1) = aes_invsbox(state(1, 1) >> 4, state(1, 1) And &HF)
state(1, 2) = aes_invsbox(state(1, 2) >> 4, state(1, 2) And &HF)
state(1, 3) = aes_invsbox(state(1, 3) >> 4, state(1, 3) And &HF)
state(2, 0) = aes_invsbox(state(2, 0) >> 4, state(2, 0) And &HF)
state(2, 1) = aes_invsbox(state(2, 1) >> 4, state(2, 1) And &HF)
state(2, 2) = aes_invsbox(state(2, 2) >> 4, state(2, 2) And &HF)
state(2, 3) = aes_invsbox(state(2, 3) >> 4, state(2, 3) And &HF)
state(3, 0) = aes_invsbox(state(3, 0) >> 4, state(3, 0) And &HF)
state(3, 1) = aes_invsbox(state(3, 1) >> 4, state(3, 1) And &HF)
state(3, 2) = aes_invsbox(state(3, 2) >> 4, state(3, 2) And &HF)
state(3, 3) = aes_invsbox(state(3, 3) >> 4, state(3, 3) And &HF)
End Sub
Private Shared Function SubWord(word As UInteger) As UInteger
Dim result As UInteger
result = aes_sbox((word >> 4) And &HF, word And &HF)
result += CUInt(aes_sbox((word >> 12) And &HF, (word >> 8) And &HF)) << 8
result += CUInt(aes_sbox((word >> 20) And &HF, (word >> 16) And &HF)) << 16
result += CUInt(aes_sbox((word >> 28) And &HF, (word >> 24) And &HF)) << 24
Return (result)
End Function
Private Shared Function KE_ROTWORD(x As UInteger) As UInteger
Return (((x) << 8) Or ((x) >> 24))
End Function
Public Shared Sub KeyExpansion(key As Byte(), w As UInteger(), keysize As Integer)
Dim Nb As Integer = 4, Nr As Integer, Nk As Integer, idx As Integer
Dim temp As UInteger
Dim Rcon As UInteger() = {&H1000000, &H2000000, &H4000000, &H8000000, &H10000000, &H20000000,
&H40000000, &H80000000UI, &H1B000000, &H36000000, &H6C000000, &HD8000000UI,
&HAB000000UI, &H4D000000, &H9A000000UI}
Select Case keysize
Case 128
Nr = 10
Nk = 4
Exit Select
Case 192
Nr = 12
Nk = 6
Exit Select
Case 256
Nr = 14
Nk = 8
Exit Select
Case Else
Return
End Select
For idx = 0 To Nk - 1
w(idx) = (CInt(key(4 * idx)) << 24) Or (CInt(key(4 * idx + 1)) << 16) Or
(CInt(key(4 * idx + 2)) << 8) Or (key(4 * idx + 3))
Next
For idx = Nk To Nb * (Nr + 1) - 1
temp = w(idx - 1)
If (idx Mod Nk) = 0 Then
temp = SubWord(KE_ROTWORD(temp)) Xor Rcon((idx - 1) \ Nk)
ElseIf Nk > 6 AndAlso (idx Mod Nk) = 4 Then
temp = SubWord(temp)
End If
w(idx) = w(idx - Nk) Xor temp
Next
End Sub
Public Shared Sub Decrypt(input As Byte(), output As Byte(), key As UInteger(), keysize As Integer)
Dim state As Byte(,) = New Byte(3, 3) {}
state(0, 0) = input(0)
state(1, 0) = input(1)
state(2, 0) = input(2)
state(3, 0) = input(3)
state(0, 1) = input(4)
state(1, 1) = input(5)
state(2, 1) = input(6)
state(3, 1) = input(7)
state(0, 2) = input(8)
state(1, 2) = input(9)
state(2, 2) = input(10)
state(3, 2) = input(11)
state(0, 3) = input(12)
state(1, 3) = input(13)
state(2, 3) = input(14)
state(3, 3) = input(15)
If keysize > 128 Then
If keysize > 192 Then
AddRoundKey(state, SubArray(key, 56))
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 52))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 48))
InvMixColumns(state)
Else
AddRoundKey(state, SubArray(key, 48))
End If
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 44))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 40))
InvMixColumns(state)
Else
AddRoundKey(state, SubArray(key, 40))
End If
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 36))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 32))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 28))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 24))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 20))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 16))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 12))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 8))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 4))
InvMixColumns(state)
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, SubArray(key, 0))
output(0) = state(0, 0)
output(1) = state(1, 0)
output(2) = state(2, 0)
output(3) = state(3, 0)
output(4) = state(0, 1)
output(5) = state(1, 1)
output(6) = state(2, 1)
output(7) = state(3, 1)
output(8) = state(0, 2)
output(9) = state(1, 2)
output(10) = state(2, 2)
output(11) = state(3, 2)
output(12) = state(0, 3)
output(13) = state(1, 3)
output(14) = state(2, 3)
output(15) = state(3, 3)
End Sub
Example
Dim plaintext As Byte() = {&H0, &H11, &H22, &H33, &H44, &H55,
&H66, &H77, &H88, &H99, &HAA, &HBB,
&HCC, &HDD, &HEE, &HFF}
Dim ciphertext As Byte() = {&H8E, &HA2, &HB7, &HCA, &H51, &H67,
&H45, &HBF, &HEA, &HFC, &H49, &H90,
&H4B, &H49, &H60, &H89}
Dim key As Byte() = {&H0, &H1, &H2, &H3, &H4, &H5,
&H6, &H7, &H8, &H9, &HA, &HB,
&HC, &HD, &HE, &HF, &H10, &H11,
&H12, &H13, &H14, &H15, &H16, &H17,
&H18, &H19, &H1A, &H1B, &H1C, &H1D,
&H1E, &H1F}
Dim key_schedule As UInteger() = New UInteger(59) {}
KeyExpansion(key, key_schedule, 256)
Decrypt(ciphertext, plaintext, key_schedule, 256)
For idx = 0 To 15
Console.Write("{0:x2}", plaintext(idx))
Next
Output
00112233445566778899aabbccddeeff