Public paste
[VB6] Rijndael class
By: Solarizer | Date: Feb 13 2008 22:41 | Format: None | Expires: never | Size: 64 KB | Hits: 875

  1. Option Explicit
  2. #Const SUPPORT_LEVEL = 0     'Default=0
  3. #Const COMPILE_CONSTANTS = 0 'Default=0
  4. Private Te0(255)      As Long
  5. Private Te1(255)      As Long
  6. Private Te2(255)      As Long
  7. Private Te3(255)      As Long
  8. Private Te4(255)      As Long
  9.  
  10. Private Td0(255)      As Long
  11. Private Td1(255)      As Long
  12. Private Td2(255)      As Long
  13. Private Td3(255)      As Long
  14. Private Td4(255)      As Long
  15. #If SUPPORT_LEVEL Then
  16. Private rco(28)       As Long
  17. #Else
  18. Private rco(9)        As Long
  19. #End If
  20. Private Nr            As Long 'Number of rounds [For 128 bit block, Nr = {10, 12, 14} for 128, 192, 256 bit cipher key]
  21. #If SUPPORT_LEVEL Then
  22. Private fkey(119)     As Long 'Nb*(Nr + 1)
  23. Private rkey(119)     As Long 'Nb*(Nr + 1)
  24. #Else
  25. Private fkey(59)      As Long 'Nb*(Nr + 1)
  26. Private rkey(59)      As Long 'Nb*(Nr + 1)
  27. #End If
  28. Private Const MaxFileChunkSize As Long = 4000000
  29. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  30. Private Sub CreateDecryptionKeys(Nb As Long)
  31.     Dim i    As Long
  32.     Dim j    As Long
  33.     Dim k    As Long
  34.     Dim s(3) As Byte
  35.  
  36.     'Invert the order of the round keys
  37.     i = 0
  38.     j = Nb * Nr
  39.     For k = 0 To Nr
  40.         CopyMemory rkey(i), fkey(j), Nb * 4&
  41.         i = i + Nb
  42.         j = j - Nb
  43.     Next k
  44.  
  45.     'Apply the inverse MixColumn transform to all round keys except the first and the last
  46.     For i = Nb To Nb * Nr - 1
  47.         CopyMemory s(0), rkey(i), 4&
  48.         rkey(i) = Td0(Te4(s(0)) And &HFF&) Xor _
  49.                   Td1(Te4(s(1)) And &HFF&) Xor _
  50.                   Td2(Te4(s(2)) And &HFF&) Xor _
  51.                   Td3(Te4(s(3)) And &HFF&)
  52.     Next i
  53. End Sub
  54. #If SUPPORT_LEVEL Then
  55. Public Function SetCipherKey(pass() As Byte, KeyBits As Long, BlockBits As Long) As Long
  56. #Else
  57. Public Function SetCipherKey(pass() As Byte, KeyBits As Long) As Long
  58. #End If
  59.     Dim i    As Long
  60.     Dim j    As Long
  61.     Dim s(3) As Byte
  62.  
  63. #If SUPPORT_LEVEL Then
  64.     Select Case BlockBits
  65.     Case 128
  66. #End If
  67.  
  68.     '128 bit block size
  69.     Select Case KeyBits
  70.     Case 128
  71.         i = 4
  72.         CopyMemory fkey(0), pass(0), 4& * i
  73.         For j = 0 To 9
  74.             CopyMemory s(0), fkey(i - 1), 4&
  75.             fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
  76.                                   Xor (Te4(s(3)) And &HFF0000) _
  77.                                   Xor (Te4(s(2)) And &HFF00&) _
  78.                                   Xor (Te4(s(1)) And &HFF&) _
  79.                                   Xor rco(j)
  80.             fkey(i + 1) = fkey(i - 3) Xor fkey(i)
  81.             fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
  82.             fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
  83.             i = i + 4
  84.         Next j
  85.         Nr = 10
  86. 'Debug.Assert i = (Nr + 1) * 4
  87. #If SUPPORT_LEVEL = 2 Then
  88.     Case 160
  89.         i = 5
  90.         j = 0
  91.         CopyMemory fkey(0), pass(0), 4& * i
  92.         Do
  93.             CopyMemory s(0), fkey(i - 1), 4&
  94.             fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
  95.                                   Xor (Te4(s(3)) And &HFF0000) _
  96.                                   Xor (Te4(s(2)) And &HFF00&) _
  97.                                   Xor (Te4(s(1)) And &HFF&) _
  98.                                   Xor rco(j)
  99.             fkey(i + 1) = fkey(i - 4) Xor fkey(i)
  100.             fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
  101.             If j = 8 Then Exit Do
  102.             fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
  103.             fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
  104.             i = i + 5
  105.             j = j + 1
  106.         Loop
  107.         Nr = 11
  108. 'Debug.Assert i + 3 = (Nr + 1) * 4
  109. #End If
  110.     Case 192
  111.         i = 6
  112.         j = 0
  113.         CopyMemory fkey(0), pass(0), 4& * i
  114.         Do
  115.             CopyMemory s(0), fkey(i - 1), 4&
  116.             fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
  117.                                   Xor (Te4(s(3)) And &HFF0000) _
  118.                                   Xor (Te4(s(2)) And &HFF00&) _
  119.                                   Xor (Te4(s(1)) And &HFF&) _
  120.                                   Xor rco(j)
  121.             fkey(i + 1) = fkey(i - 5) Xor fkey(i)
  122.             fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
  123.             fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
  124.             If j = 7 Then Exit Do
  125.             fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
  126.             fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
  127.             i = i + 6
  128.             j = j + 1
  129.         Loop
  130.         Nr = 12
  131. 'Debug.Assert i + 4 = (Nr + 1) * 4
  132. #If SUPPORT_LEVEL = 2 Then
  133.     Case 224
  134.         i = 7
  135.         CopyMemory fkey(0), pass(0), 4& * i
  136.         For j = 0 To 6
  137.             CopyMemory s(0), fkey(i - 1), 4&
  138.             fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
  139.                                   Xor (Te4(s(3)) And &HFF0000) _
  140.                                   Xor (Te4(s(2)) And &HFF00&) _
  141.                                   Xor (Te4(s(1)) And &HFF&) _
  142.                                   Xor rco(j)
  143.             fkey(i + 1) = fkey(i - 6) Xor fkey(i)
  144.             fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
  145.             fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
  146.             CopyMemory s(0), fkey(i + 3), 4&
  147.             fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
  148.                                       Xor (Te4(s(2)) And &HFF0000) _
  149.                                       Xor (Te4(s(1)) And &HFF00&) _
  150.                                       Xor (Te4(s(0)) And &HFF&)
  151.             fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
  152.             fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
  153.             i = i + 7
  154.         Next j
  155.         Nr = 13
  156. 'Debug.Assert i = (Nr + 1) * 4
  157. #End If
  158.     Case 256
  159.         i = 8
  160.         j = 0
  161.         CopyMemory fkey(0), pass(0), 4& * i
  162.         Do
  163.             CopyMemory s(0), fkey(i - 1), 4&
  164.             fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
  165.                                   Xor (Te4(s(3)) And &HFF0000) _
  166.                                   Xor (Te4(s(2)) And &HFF00&) _
  167.                                   Xor (Te4(s(1)) And &HFF&) _
  168.                                   Xor rco(j)
  169.             fkey(i + 1) = fkey(i - 7) Xor fkey(i)
  170.             fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
  171.             fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
  172.             If j = 6 Then Exit Do
  173.             CopyMemory s(0), fkey(i + 3), 4&
  174.             fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
  175.                                       Xor (Te4(s(2)) And &HFF0000) _
  176.                                       Xor (Te4(s(1)) And &HFF00&) _
  177.                                       Xor (Te4(s(0)) And &HFF&)
  178.             fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
  179.             fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
  180.             fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
  181.             i = i + 8
  182.             j = j + 1
  183.         Loop
  184.         Nr = 14
  185. 'Debug.Assert i + 4 = (Nr + 1) * 4
  186.     Case Else
  187.         err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
  188.         SetCipherKey = 1
  189.         Exit Function
  190.     End Select
  191.     CreateDecryptionKeys 4
  192.  
  193. #If SUPPORT_LEVEL Then
  194. #If SUPPORT_LEVEL = 2 Then
  195.     Case 160
  196.  
  197.     '160 bit block size
  198.     Select Case KeyBits
  199.     Case 128
  200.         i = 4
  201.         CopyMemory fkey(0), pass(0), 4& * i
  202.         For j = 0 To 13
  203.             CopyMemory s(0), fkey(i - 1), 4&
  204.             fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
  205.                                   Xor (Te4(s(3)) And &HFF0000) _
  206.                                   Xor (Te4(s(2)) And &HFF00&) _
  207.                                   Xor (Te4(s(1)) And &HFF&) _
  208.                                   Xor rco(j)
  209.             fkey(i + 1) = fkey(i - 3) Xor fkey(i)
  210.             fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
  211.             fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
  212.             i = i + 4
  213.         Next j
  214.         Nr = 11
  215. 'Debug.Assert i = (Nr + 1) * 5
  216.     Case 160
  217.         i = 5
  218.         CopyMemory fkey(0), pass(0), 4& * i
  219.         For j = 0 To 10
  220.             CopyMemory s(0), fkey(i - 1), 4&
  221.             fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
  222.                                   Xor (Te4(s(3)) And &HFF0000) _
  223.                                   Xor (Te4(s(2)) And &HFF00&) _
  224.                                   Xor (Te4(s(1)) And &HFF&) _
  225.                                   Xor rco(j)
  226.             fkey(i + 1) = fkey(i - 4) Xor fkey(i)
  227.             fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
  228.             fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
  229.             fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
  230.             i = i + 5
  231.         Next j
  232.         Nr = 11
  233. 'Debug.Assert i = (Nr + 1) * 5
  234.     Case 192
  235.         i = 6
  236.         j = 0
  237.         CopyMemory fkey(0), pass(0), 4& * i
  238.         Do
  239.             CopyMemory s(0), fkey(i - 1), 4&
  240.             fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
  241.                                   Xor (Te4(s(3)) And &HFF0000) _
  242.                                   Xor (Te4(s(2)) And &HFF00&) _
  243.                                   Xor (Te4(s(1)) And &HFF&) _
  244.                                   Xor rco(j)
  245.             fkey(i + 1) = fkey(i - 5) Xor fkey(i)
  246.             fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
  247.             fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
  248.             fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
  249.             If j = 9 Then Exit Do
  250.             fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
  251.             i = i + 6
  252.             j = j + 1
  253.         Loop
  254.         Nr = 12
  255. 'Debug.Assert i + 5 = (Nr + 1) * 5
  256.     Case 224
  257.         i = 7
  258.         CopyMemory fkey(0), pass(0), 4& * i
  259.         For j = 0 To 8
  260.             CopyMemory s(0), fkey(i - 1), 4&
  261.             fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
  262.                                   Xor (Te4(s(3)) And &HFF0000) _
  263.                                   Xor (Te4(s(2)) And &HFF00&) _
  264.                                   Xor (Te4(s(1)) And &HFF&) _
  265.                                   Xor rco(j)
  266.             fkey(i + 1) = fkey(i - 6) Xor fkey(i)
  267.             fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
  268.             fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
  269.             CopyMemory s(0), fkey(i + 3), 4&
  270.             fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
  271.                                       Xor (Te4(s(2)) And &HFF0000) _
  272.                                       Xor (Te4(s(1)) And &HFF00&) _
  273.                                       Xor (Te4(s(0)) And &HFF&)
  274.             fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
  275.             fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
  276.             i = i + 7
  277.         Next j
  278.         Nr = 13
  279. 'Debug.Assert i = (Nr + 1) * 5
  280.     Case 256
  281.         i = 8
  282.         j = 0
  283.         CopyMemory fkey(0), pass(0), 4& * i
  284.         Do
  285.             CopyMemory s(0), fkey(i - 1), 4&
  286.             fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
  287.                                   Xor (Te4(s(3)) And &HFF0000) _
  288.                                   Xor (Te4(s(2)) And &HFF00&) _
  289.                                   Xor (Te4(s(1)) And &HFF&) _
  290.                                   Xor rco(j)
  291.             fkey(i + 1) = fkey(i - 7) Xor fkey(i)
  292.             fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
  293.             If j = 8 Then Exit Do
  294.             fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
  295.             CopyMemory s(0), fkey(i + 3), 4&
  296.             fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
  297.                                       Xor (Te4(s(2)) And &HFF0000) _
  298.                                       Xor (Te4(s(1)) And &HFF00&) _
  299.                                       Xor (Te4(s(0)) And &HFF&)
  300.             fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
  301.             fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
  302.             fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
  303.             i = i + 8
  304.             j = j + 1
  305.         Loop
  306.         Nr = 14
  307. 'Debug.Assert i + 3 = (Nr + 1) * 5
  308.     Case Else
  309.         err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
  310.         SetCipherKey = 1
  311.         Exit Function
  312.     End Select
  313.     CreateDecryptionKeys 5
  314. #End If
  315.     Case 192
  316.  
  317.     '192 bit block size
  318.     Select Case KeyBits
  319.     Case 128
  320.         i = 4
  321.         j = 0
  322.         CopyMemory fkey(0), pass(0), 4& * i
  323.         Do
  324.             CopyMemory s(0), fkey(i - 1), 4&
  325.             fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
  326.                                   Xor (Te4(s(3)) And &HFF0000) _
  327.                                   Xor (Te4(s(2)) And &HFF00&) _
  328.                                   Xor (Te4(s(1)) And &HFF&) _
  329.                                   Xor rco(j)
  330.             fkey(i + 1) = fkey(i - 3) Xor fkey(i)
  331.             If j = 18 Then Exit Do
  332.             fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
  333.             fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
  334.             i = i + 4
  335.             j = j + 1
  336.         Loop
  337.         Nr = 12
  338. 'Debug.Assert i + 2 = (Nr + 1) * 6
  339. #If SUPPORT_LEVEL = 2 Then
  340.     Case 160
  341.         i = 5
  342.         j = 0
  343.         CopyMemory fkey(0), pass(0), 4& * i
  344.         Do
  345.             CopyMemory s(0), fkey(i - 1), 4&
  346.             fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
  347.                                   Xor (Te4(s(3)) And &HFF0000) _
  348.                                   Xor (Te4(s(2)) And &HFF00&) _
  349.                                   Xor (Te4(s(1)) And &HFF&) _
  350.                                   Xor rco(j)
  351.             fkey(i + 1) = fkey(i - 4) Xor fkey(i)
  352.             fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
  353.             If j = 14 Then Exit Do
  354.             fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
  355.             fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
  356.             i = i + 5
  357.             j = j + 1
  358.         Loop
  359.         Nr = 12
  360. 'Debug.Assert i + 3 = (Nr + 1) * 6
  361. #End If
  362.     Case 192
  363.         i = 6
  364.         CopyMemory fkey(0), pass(0), 4& * i
  365.         For j = 0 To 11
  366.             CopyMemory s(0), fkey(i - 1), 4&
  367.             fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
  368.                                   Xor (Te4(s(3)) And &HFF0000) _
  369.                                   Xor (Te4(s(2)) And &HFF00&) _
  370.                                   Xor (Te4(s(1)) And &HFF&) _
  371.                                   Xor rco(j)
  372.             fkey(i + 1) = fkey(i - 5) Xor fkey(i)
  373.             fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
  374.             fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
  375.             fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
  376.             fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
  377.             i = i + 6
  378.         Next j
  379.         Nr = 12
  380. 'Debug.Assert i = (Nr + 1) * 6
  381. #If SUPPORT_LEVEL = 2 Then
  382.     Case 224 '(Nr+1)*Nb/Nk  (when to exit)
  383.         i = 7
  384.         CopyMemory fkey(0), pass(0), 4& * i
  385.         For j = 0 To 10
  386.             CopyMemory s(0), fkey(i - 1), 4&
  387.             fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
  388.                                   Xor (Te4(s(3)) And &HFF0000) _
  389.                                   Xor (Te4(s(2)) And &HFF00&) _
  390.                                   Xor (Te4(s(1)) And &HFF&) _
  391.                                   Xor rco(j)
  392.             fkey(i + 1) = fkey(i - 6) Xor fkey(i)
  393.             fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
  394.             fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
  395.             CopyMemory s(0), fkey(i + 3), 4&
  396.             fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
  397.                                       Xor (Te4(s(2)) And &HFF0000) _
  398.                                       Xor (Te4(s(1)) And &HFF00&) _
  399.                                       Xor (Te4(s(0)) And &HFF&)
  400.             fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
  401.             fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
  402.             i = i + 7
  403.         Next j
  404.         Nr = 13
  405. 'Debug.Assert i = (Nr + 1) * 6
  406. #End If
  407.     Case 256
  408.         i = 8
  409.         j = 0
  410.         CopyMemory fkey(0), pass(0), 4& * i
  411.         Do
  412.             CopyMemory s(0), fkey(i - 1), 4&
  413.             fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
  414.                                   Xor (Te4(s(3)) And &HFF0000) _
  415.                                   Xor (Te4(s(2)) And &HFF00&) _
  416.                                   Xor (Te4(s(1)) And &HFF&) _
  417.                                   Xor rco(j)
  418.             fkey(i + 1) = fkey(i - 7) Xor fkey(i)
  419.             If j = 10 Then Exit Do
  420.             fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
  421.             fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
  422.             CopyMemory s(0), fkey(i + 3), 4&
  423.             fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
  424.                                       Xor (Te4(s(2)) And &HFF0000) _
  425.                                       Xor (Te4(s(1)) And &HFF00&) _
  426.                                       Xor (Te4(s(0)) And &HFF&)
  427.             fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
  428.             fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
  429.             fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
  430.             i = i + 8
  431.             j = j + 1
  432.         Loop
  433.         Nr = 14
  434. 'Debug.Assert i + 2 = (Nr + 1) * 6
  435.     Case Else
  436.         err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
  437.         SetCipherKey = 1
  438.         Exit Function
  439.     End Select
  440.     CreateDecryptionKeys 6
  441.  
  442. #If SUPPORT_LEVEL = 2 Then
  443.     Case 224
  444.  
  445.     '224 bit block size
  446.     Select Case KeyBits
  447.     Case 128
  448.         i = 4
  449.         j = 0
  450.         CopyMemory fkey(0), pass(0), 4& * i
  451.         Do
  452.             CopyMemory s(0), fkey(i - 1), 4&
  453.             fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
  454.                                   Xor (Te4(s(3)) And &HFF0000) _
  455.                                   Xor (Te4(s(2)) And &HFF00&) _
  456.                                   Xor (Te4(s(1)) And &HFF&) _
  457.                                   Xor rco(j)
  458.             fkey(i + 1) = fkey(i - 3) Xor fkey(i)
  459.             If j = 23 Then Exit Do
  460.             fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
  461.             fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
  462.             i = i + 4
  463.             j = j + 1
  464.         Loop
  465.         Nr = 13
  466. 'Debug.Assert i + 2 = (Nr + 1) * 7
  467.     Case 160
  468.         i = 5
  469.         j = 0
  470.         CopyMemory fkey(0), pass(0), 4& * i
  471.         Do
  472.             CopyMemory s(0), fkey(i - 1), 4&
  473.             fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
  474.                                   Xor (Te4(s(3)) And &HFF0000) _
  475.                                   Xor (Te4(s(2)) And &HFF00&) _
  476.                                   Xor (Te4(s(1)) And &HFF&) _
  477.                                   Xor rco(j)
  478.             fkey(i + 1) = fkey(i - 4) Xor fkey(i)
  479.             fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
  480.             If j = 18 Then Exit Do
  481.             fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
  482.             fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
  483.             i = i + 5
  484.             j = j + 1
  485.         Loop
  486.         Nr = 13
  487. 'Debug.Assert i + 3 = (Nr + 1) * 7
  488.     Case 192
  489.         i = 6
  490.         j = 0
  491.         CopyMemory fkey(0), pass(0), 4& * i
  492.         Do
  493.             CopyMemory s(0), fkey(i - 1), 4&
  494.             fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
  495.                                   Xor (Te4(s(3)) And &HFF0000) _
  496.                                   Xor (Te4(s(2)) And &HFF00&) _
  497.                                   Xor (Te4(s(1)) And &HFF&) _
  498.                                   Xor rco(j)
  499.             fkey(i + 1) = fkey(i - 5) Xor fkey(i)
  500.             If j = 15 Then Exit Do
  501.             fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
  502.             fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
  503.             fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
  504.             fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
  505.             i = i + 6
  506.             j = j + 1
  507.         Loop
  508.         Nr = 13
  509. 'Debug.Assert i + 2 = (Nr + 1) * 7
  510.     Case 224
  511.         i = 7
  512.         CopyMemory fkey(0), pass(0), 4& * i
  513.         For j = 0 To 12
  514.             CopyMemory s(0), fkey(i - 1), 4&
  515.             fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
  516.                                   Xor (Te4(s(3)) And &HFF0000) _
  517.                                   Xor (Te4(s(2)) And &HFF00&) _
  518.                                   Xor (Te4(s(1)) And &HFF&) _
  519.                                   Xor rco(j)
  520.             fkey(i + 1) = fkey(i - 6) Xor fkey(i)
  521.             fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
  522.             fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
  523.             CopyMemory s(0), fkey(i + 3), 4&
  524.             fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
  525.                                       Xor (Te4(s(2)) And &HFF0000) _
  526.                                       Xor (Te4(s(1)) And &HFF00&) _
  527.                                       Xor (Te4(s(0)) And &HFF&)
  528.             fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
  529.             fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
  530.             i = i + 7
  531.         Next j
  532.         Nr = 13
  533. 'Debug.Assert i = (Nr + 1) * 7
  534.     Case 256
  535.         i = 8
  536.         j = 0
  537.         CopyMemory fkey(0), pass(0), 4& * i
  538.         Do
  539.             CopyMemory s(0), fkey(i - 1), 4&
  540.             fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
  541.                                   Xor (Te4(s(3)) And &HFF0000) _
  542.                                   Xor (Te4(s(2)) And &HFF00&) _
  543.                                   Xor (Te4(s(1)) And &HFF&) _
  544.                                   Xor rco(j)
  545.             If j = 12 Then Exit Do
  546.             fkey(i + 1) = fkey(i - 7) Xor fkey(i)
  547.             fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
  548.             fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
  549.             CopyMemory s(0), fkey(i + 3), 4&
  550.             fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
  551.                                       Xor (Te4(s(2)) And &HFF0000) _
  552.                                       Xor (Te4(s(1)) And &HFF00&) _
  553.                                       Xor (Te4(s(0)) And &HFF&)
  554.             fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
  555.             fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
  556.             fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
  557.             i = i + 8
  558.             j = j + 1
  559.         Loop
  560.         Nr = 14
  561. 'Debug.Assert i + 1 = (Nr + 1) * 7
  562.     Case Else
  563.         err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
  564.         SetCipherKey = 1
  565.         Exit Function
  566.     End Select
  567.     CreateDecryptionKeys 7
  568. #End If
  569.  
  570.     Case 256
  571.  
  572.     '256 bit block size
  573.     Select Case KeyBits
  574.     Case 128
  575.         i = 4
  576.         CopyMemory fkey(0), pass(0), 4& * i
  577.         For j = 0 To 28
  578.             CopyMemory s(0), fkey(i - 1), 4&
  579.             fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
  580.                                   Xor (Te4(s(3)) And &HFF0000) _
  581.                                   Xor (Te4(s(2)) And &HFF00&) _
  582.                                   Xor (Te4(s(1)) And &HFF&) _
  583.                                   Xor rco(j)
  584.             fkey(i + 1) = fkey(i - 3) Xor fkey(i)
  585.             fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
  586.             fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
  587.             i = i + 4
  588.         Next j
  589.         Nr = 14
  590. 'Debug.Assert i = (Nr + 1) * 8
  591. #If SUPPORT_LEVEL = 2 Then
  592.     Case 160
  593.         i = 5
  594.         CopyMemory fkey(0), pass(0), 4& * i
  595.         For j = 0 To 22
  596.             CopyMemory s(0), fkey(i - 1), 4&
  597.             fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
  598.                                   Xor (Te4(s(3)) And &HFF0000) _
  599.                                   Xor (Te4(s(2)) And &HFF00&) _
  600.                                   Xor (Te4(s(1)) And &HFF&) _
  601.                                   Xor rco(j)
  602.             fkey(i + 1) = fkey(i - 4) Xor fkey(i)
  603.             fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
  604.             fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
  605.             fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
  606.             i = i + 5
  607.         Next j
  608.         Nr = 14
  609. 'Debug.Assert i = (Nr + 1) * 8
  610. #End If
  611.     Case 192
  612.         i = 6
  613.         CopyMemory fkey(0), pass(0), 4& * i
  614.         For j = 0 To 18
  615.             CopyMemory s(0), fkey(i - 1), 4&
  616.             fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
  617.                                   Xor (Te4(s(3)) And &HFF0000) _
  618.                                   Xor (Te4(s(2)) And &HFF00&) _
  619.                                   Xor (Te4(s(1)) And &HFF&) _
  620.                                   Xor rco(j)
  621.             fkey(i + 1) = fkey(i - 5) Xor fkey(i)
  622.             fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
  623.             fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
  624.             fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
  625.             fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
  626.             i = i + 6
  627.         Next j
  628.         Nr = 14
  629. 'Debug.Assert i = (Nr + 1) * 8
  630. #If SUPPORT_LEVEL = 2 Then
  631.     Case 224
  632.         i = 7
  633.         j = 0
  634.         CopyMemory fkey(0), pass(0), 4& * i
  635.         Do
  636.             CopyMemory s(0), fkey(i - 1), 4&
  637.             fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
  638.                                   Xor (Te4(s(3)) And &HFF0000) _
  639.                                   Xor (Te4(s(2)) And &HFF00&) _
  640.                                   Xor (Te4(s(1)) And &HFF&) _
  641.                                   Xor rco(j)
  642.             If j = 16 Then Exit Do
  643.             fkey(i + 1) = fkey(i - 6) Xor fkey(i)
  644.             fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
  645.             fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
  646.             CopyMemory s(0), fkey(i + 3), 4&
  647.             fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
  648.                                       Xor (Te4(s(2)) And &HFF0000) _
  649.                                       Xor (Te4(s(1)) And &HFF00&) _
  650.                                       Xor (Te4(s(0)) And &HFF&)
  651.             fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
  652.             fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
  653.             i = i + 7
  654.             j = j + 1
  655.         Loop
  656.         Nr = 14
  657. 'Debug.Assert i + 1 = (Nr + 1) * 8
  658. #End If
  659.     Case 256
  660.         i = 8
  661.         CopyMemory fkey(0), pass(0), 4& * i
  662.         For j = 0 To 13
  663.             CopyMemory s(0), fkey(i - 1), 4&
  664.             fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
  665.                                   Xor (Te4(s(3)) And &HFF0000) _
  666.                                   Xor (Te4(s(2)) And &HFF00&) _
  667.                                   Xor (Te4(s(1)) And &HFF&) _
  668.                                   Xor rco(j)
  669.             fkey(i + 1) = fkey(i - 7) Xor fkey(i)
  670.             fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
  671.             fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
  672.             CopyMemory s(0), fkey(i + 3), 4&
  673.             fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
  674.                                       Xor (Te4(s(2)) And &HFF0000) _
  675.                                       Xor (Te4(s(1)) And &HFF00&) _
  676.                                       Xor (Te4(s(0)) And &HFF&)
  677.             fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
  678.             fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
  679.             fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
  680.             i = i + 8
  681.         Next j
  682.         Nr = 14
  683. 'Debug.Assert i = (Nr + 1) * 8
  684.     Case Else
  685.         err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
  686.         SetCipherKey = 1
  687.         Exit Function
  688.     End Select
  689.     CreateDecryptionKeys 8
  690.  
  691.     Case Else
  692.         err.Raise 1, , "cRijndael.SetCipherKey - Illegal BlockBits Value"
  693.         SetCipherKey = 1
  694.         Exit Function
  695.     End Select
  696. #End If
  697. End Function
  698.  
  699. #If SUPPORT_LEVEL Then
  700. Public Function SetCipherKeyString(PassPhrase As String, KeyBits As Long, BlockBits As Long) As Long
  701.     Dim pass() As Byte
  702.  
  703.     pass = StrConv(PassPhrase, vbFromUnicode)
  704.     ReDim Preserve pass(31)
  705.     SetCipherKeyString = SetCipherKey(pass, KeyBits, BlockBits)
  706. End Function
  707. #Else
  708. Public Function SetCipherKeyString(PassPhrase As String, KeyBits As Long) As Long
  709.     Dim pass() As Byte
  710.  
  711.     pass = StrConv(PassPhrase, vbFromUnicode)
  712.     ReDim Preserve pass(31)
  713.     SetCipherKeyString = SetCipherKey(pass, KeyBits)
  714. End Function
  715. #End If
  716. Public Sub BlockEncrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  717.     Dim i     As Long
  718.     Dim k     As Long
  719.     Dim t0    As Long
  720.     Dim t1    As Long
  721.     Dim t2    As Long
  722.     Dim t3    As Long
  723.     Dim s(15) As Byte
  724.  
  725.     CopyMemory t0, plaintext(p + 0), 4&
  726.     CopyMemory t1, plaintext(p + 4), 4&
  727.     CopyMemory t2, plaintext(p + 8), 4&
  728.     CopyMemory t3, plaintext(p + 12), 4&
  729.     t0 = t0 Xor fkey(0)
  730.     t1 = t1 Xor fkey(1)
  731.     t2 = t2 Xor fkey(2)
  732.     t3 = t3 Xor fkey(3)
  733.     k = 4
  734.  
  735.     For i = 1 To Nr - 1 'Nr is number of rounds
  736.         CopyMemory s(0), t0, 4&
  737.         CopyMemory s(4), t1, 4&
  738.         CopyMemory s(8), t2, 4&
  739.         CopyMemory s(12), t3, 4&
  740.         t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 0)
  741.         t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(3)) Xor fkey(k + 1)
  742.         t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 2)
  743.         t3 = Te0(s(12)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 3)
  744.         k = k + 4
  745.     Next i
  746.  
  747.     'Final round
  748.     CopyMemory s(0), t0, 4&
  749.     CopyMemory s(4), t1, 4&
  750.     CopyMemory s(8), t2, 4&
  751.     CopyMemory s(12), t3, 4&
  752.     t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 0)
  753.     t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 1)
  754.     t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 2)
  755.     t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 3)
  756.     CopyMemory ciphertext(q + 0), t0, 4&
  757.     CopyMemory ciphertext(q + 4), t1, 4&
  758.     CopyMemory ciphertext(q + 8), t2, 4&
  759.     CopyMemory ciphertext(q + 12), t3, 4&
  760. End Sub
  761. Public Sub BlockDecrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  762.     Dim i     As Long
  763.     Dim k     As Long
  764.     Dim t0    As Long
  765.     Dim t1    As Long
  766.     Dim t2    As Long
  767.     Dim t3    As Long
  768.     Dim s(15) As Byte
  769.  
  770.     CopyMemory t0, ciphertext(q + 0), 4&
  771.     CopyMemory t1, ciphertext(q + 4), 4&
  772.     CopyMemory t2, ciphertext(q + 8), 4&
  773.     CopyMemory t3, ciphertext(q + 12), 4&
  774.     t0 = t0 Xor rkey(0)
  775.     t1 = t1 Xor rkey(1)
  776.     t2 = t2 Xor rkey(2)
  777.     t3 = t3 Xor rkey(3)
  778.     k = 4
  779.  
  780.     For i = 1 To Nr - 1 'Nr is number of rounds
  781.         CopyMemory s(0), t0, 4&
  782.         CopyMemory s(4), t1, 4&
  783.         CopyMemory s(8), t2, 4&
  784.         CopyMemory s(12), t3, 4&
  785.         t0 = Td0(s(0)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 0)
  786.         t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 1)
  787.         t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(15)) Xor rkey(k + 2)
  788.         t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 3)
  789.         k = k + 4
  790.     Next i
  791.  
  792.     'Final round
  793.     CopyMemory s(0), t0, 4&
  794.     CopyMemory s(4), t1, 4&
  795.     CopyMemory s(8), t2, 4&
  796.     CopyMemory s(12), t3, 4&
  797.     t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 0)
  798.     t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 1)
  799.     t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 2)
  800.     t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 3)
  801.     CopyMemory plaintext(p + 0), t0, 4&
  802.     CopyMemory plaintext(p + 4), t1, 4&
  803.     CopyMemory plaintext(p + 8), t2, 4&
  804.     CopyMemory plaintext(p + 12), t3, 4&
  805. End Sub
  806. #If SUPPORT_LEVEL Then
  807. #If SUPPORT_LEVEL = 2 Then
  808. Public Sub Block160Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  809.     Dim i     As Long
  810.     Dim k     As Long
  811.     Dim t0    As Long
  812.     Dim t1    As Long
  813.     Dim t2    As Long
  814.     Dim t3    As Long
  815.     Dim t4    As Long
  816.     Dim s(19) As Byte
  817.  
  818.     CopyMemory t0, plaintext(p + 0), 4&
  819.     CopyMemory t1, plaintext(p + 4), 4&
  820.     CopyMemory t2, plaintext(p + 8), 4&
  821.     CopyMemory t3, plaintext(p + 12), 4&
  822.     CopyMemory t4, plaintext(p + 16), 4&
  823.     t0 = t0 Xor fkey(0)
  824.     t1 = t1 Xor fkey(1)
  825.     t2 = t2 Xor fkey(2)
  826.     t3 = t3 Xor fkey(3)
  827.     t4 = t4 Xor fkey(4)
  828.     k = 5
  829.  
  830.     For i = 1 To Nr - 1 'Nr is number of rounds
  831.         CopyMemory s(0), t0, 4&
  832.         CopyMemory s(4), t1, 4&
  833.         CopyMemory s(8), t2, 4&
  834.         CopyMemory s(12), t3, 4&
  835.         CopyMemory s(16), t4, 4&
  836.         t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 0)
  837.         t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(19)) Xor fkey(k + 1)
  838.         t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(18)) Xor Te3(s(3)) Xor fkey(k + 2)
  839.         t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 3)
  840.         t4 = Te0(s(16)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 4)
  841.         k = k + 5
  842.     Next i
  843.  
  844.     'Final round
  845.     CopyMemory s(0), t0, 4&
  846.     CopyMemory s(4), t1, 4&
  847.     CopyMemory s(8), t2, 4&
  848.     CopyMemory s(12), t3, 4&
  849.     CopyMemory s(16), t4, 4&
  850.     t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 0)
  851.     t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 1)
  852.     t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 2)
  853.     t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 3)
  854.     t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 4)
  855.     CopyMemory ciphertext(q + 0), t0, 4&
  856.     CopyMemory ciphertext(q + 4), t1, 4&
  857.     CopyMemory ciphertext(q + 8), t2, 4&
  858.     CopyMemory ciphertext(q + 12), t3, 4&
  859.     CopyMemory ciphertext(q + 16), t4, 4&
  860. End Sub
  861. Public Sub Block160Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  862.     Dim i     As Long
  863.     Dim k     As Long
  864.     Dim t0    As Long
  865.     Dim t1    As Long
  866.     Dim t2    As Long
  867.     Dim t3    As Long
  868.     Dim t4    As Long
  869.     Dim s(19) As Byte
  870.  
  871.     CopyMemory t0, ciphertext(q + 0), 4&
  872.     CopyMemory t1, ciphertext(q + 4), 4&
  873.     CopyMemory t2, ciphertext(q + 8), 4&
  874.     CopyMemory t3, ciphertext(q + 12), 4&
  875.     CopyMemory t4, ciphertext(q + 16), 4&
  876.     t0 = t0 Xor rkey(0)
  877.     t1 = t1 Xor rkey(1)
  878.     t2 = t2 Xor rkey(2)
  879.     t3 = t3 Xor rkey(3)
  880.     t4 = t4 Xor rkey(4)
  881.     k = 5
  882.  
  883.     For i = 1 To Nr - 1 'Nr is number of rounds
  884.         CopyMemory s(0), t0, 4&
  885.         CopyMemory s(4), t1, 4&
  886.         CopyMemory s(8), t2, 4&
  887.         CopyMemory s(12), t3, 4&
  888.         CopyMemory s(16), t4, 4&
  889.         t0 = Td0(s(0)) Xor Td1(s(17)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 0)
  890.         t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(18)) Xor Td3(s(15)) Xor rkey(k + 1)
  891.         t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(19)) Xor rkey(k + 2)
  892.         t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 3)
  893.         t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 4)
  894.         k = k + 5
  895.     Next i
  896.     CopyMemory s(0), t0, 4&
  897.     CopyMemory s(4), t1, 4&
  898.     CopyMemory s(8), t2, 4&
  899.     CopyMemory s(12), t3, 4&
  900.     CopyMemory s(16), t4, 4&
  901.     t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 0)
  902.     t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 1)
  903.     t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 2)
  904.     t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 3)
  905.     t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 4)
  906.     CopyMemory plaintext(p + 0), t0, 4&
  907.     CopyMemory plaintext(p + 4), t1, 4&
  908.     CopyMemory plaintext(p + 8), t2, 4&
  909.     CopyMemory plaintext(p + 12), t3, 4&
  910.     CopyMemory plaintext(p + 16), t4, 4&
  911. End Sub
  912. #End If
  913. Public Sub Block192Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  914.     Dim i     As Long
  915.     Dim k     As Long
  916.     Dim t0    As Long
  917.     Dim t1    As Long
  918.     Dim t2    As Long
  919.     Dim t3    As Long
  920.     Dim t4    As Long
  921.     Dim t5    As Long
  922.     Dim s(23) As Byte
  923.  
  924.     CopyMemory t0, plaintext(p + 0), 4&
  925.     CopyMemory t1, plaintext(p + 4), 4&
  926.     CopyMemory t2, plaintext(p + 8), 4&
  927.     CopyMemory t3, plaintext(p + 12), 4&
  928.     CopyMemory t4, plaintext(p + 16), 4&
  929.     CopyMemory t5, plaintext(p + 20), 4&
  930.     t0 = t0 Xor fkey(0)
  931.     t1 = t1 Xor fkey(1)
  932.     t2 = t2 Xor fkey(2)
  933.     t3 = t3 Xor fkey(3)
  934.     t4 = t4 Xor fkey(4)
  935.     t5 = t5 Xor fkey(5)
  936.     k = 6
  937.  
  938.     For i = 1 To Nr - 1 'Nr is number of rounds
  939.         CopyMemory s(0), t0, 4&
  940.         CopyMemory s(4), t1, 4&
  941.         CopyMemory s(8), t2, 4&
  942.         CopyMemory s(12), t3, 4&
  943.         CopyMemory s(16), t4, 4&
  944.         CopyMemory s(20), t5, 4&
  945.         t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 0)
  946.         t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(19)) Xor fkey(k + 1)
  947.         t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(18)) Xor Te3(s(23)) Xor fkey(k + 2)
  948.         t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(22)) Xor Te3(s(3)) Xor fkey(k + 3)
  949.         t4 = Te0(s(16)) Xor Te1(s(21)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 4)
  950.         t5 = Te0(s(20)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 5)
  951.         k = k + 6
  952.     Next i
  953.  
  954.     'Final round
  955.     CopyMemory s(0), t0, 4&
  956.     CopyMemory s(4), t1, 4&
  957.     CopyMemory s(8), t2, 4&
  958.     CopyMemory s(12), t3, 4&
  959.     CopyMemory s(16), t4, 4&
  960.     CopyMemory s(20), t5, 4&
  961.     t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 0)
  962.     t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 1)
  963.     t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(23)) And &HFF000000) Xor fkey(k + 2)
  964.     t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(22)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 3)
  965.     t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(21)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 4)
  966.     t5 = (Te4(s(20)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 5)
  967.  
  968.     CopyMemory ciphertext(q + 0), t0, 4&
  969.     CopyMemory ciphertext(q + 4), t1, 4&
  970.     CopyMemory ciphertext(q + 8), t2, 4&
  971.     CopyMemory ciphertext(q + 12), t3, 4&
  972.     CopyMemory ciphertext(q + 16), t4, 4&
  973.     CopyMemory ciphertext(q + 20), t5, 4&
  974. End Sub
  975. Public Sub Block192Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  976.     Dim i     As Long
  977.     Dim k     As Long
  978.     Dim t0    As Long
  979.     Dim t1    As Long
  980.     Dim t2    As Long
  981.     Dim t3    As Long
  982.     Dim t4    As Long
  983.     Dim t5    As Long
  984.     Dim s(23) As Byte
  985.  
  986.     CopyMemory t0, ciphertext(q + 0), 4&
  987.     CopyMemory t1, ciphertext(q + 4), 4&
  988.     CopyMemory t2, ciphertext(q + 8), 4&
  989.     CopyMemory t3, ciphertext(q + 12), 4&
  990.     CopyMemory t4, ciphertext(q + 16), 4&
  991.     CopyMemory t5, ciphertext(q + 20), 4&
  992.     t0 = t0 Xor rkey(0)
  993.     t1 = t1 Xor rkey(1)
  994.     t2 = t2 Xor rkey(2)
  995.     t3 = t3 Xor rkey(3)
  996.     t4 = t4 Xor rkey(4)
  997.     t5 = t5 Xor rkey(5)
  998.     k = 6
  999.  
  1000.     For i = 1 To Nr - 1 'Nr is number of rounds
  1001.         CopyMemory s(0), t0, 4&
  1002.         CopyMemory s(4), t1, 4&
  1003.         CopyMemory s(8), t2, 4&
  1004.         CopyMemory s(12), t3, 4&
  1005.         CopyMemory s(16), t4, 4&
  1006.         CopyMemory s(20), t5, 4&
  1007.         t0 = Td0(s(0)) Xor Td1(s(21)) Xor Td2(s(18)) Xor Td3(s(15)) Xor rkey(k + 0)
  1008.         t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(22)) Xor Td3(s(19)) Xor rkey(k + 1)
  1009.         t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(23)) Xor rkey(k + 2)
  1010.         t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 3)
  1011.         t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 4)
  1012.         t5 = Td0(s(20)) Xor Td1(s(17)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 5)
  1013.         k = k + 6
  1014.     Next i
  1015.  
  1016.     'Final round
  1017.     CopyMemory s(0), t0, 4&
  1018.     CopyMemory s(4), t1, 4&
  1019.     CopyMemory s(8), t2, 4&
  1020.     CopyMemory s(12), t3, 4&
  1021.     CopyMemory s(16), t4, 4&
  1022.     CopyMemory s(20), t5, 4&
  1023.     t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(21)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 0)
  1024.     t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(22)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 1)
  1025.     t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(23)) And &HFF000000) Xor rkey(k + 2)
  1026.     t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 3)
  1027.     t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 4)
  1028.     t5 = (Td4(s(20)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 5)
  1029.     CopyMemory plaintext(p + 0), t0, 4&
  1030.     CopyMemory plaintext(p + 4), t1, 4&
  1031.     CopyMemory plaintext(p + 8), t2, 4&
  1032.     CopyMemory plaintext(p + 12), t3, 4&
  1033.     CopyMemory plaintext(p + 16), t4, 4&
  1034.     CopyMemory plaintext(p + 20), t5, 4&
  1035. End Sub
  1036. #If SUPPORT_LEVEL = 2 Then
  1037. Public Sub Block224Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  1038.     Dim i     As Long
  1039.     Dim k     As Long
  1040.     Dim t0    As Long
  1041.     Dim t1    As Long
  1042.     Dim t2    As Long
  1043.     Dim t3    As Long
  1044.     Dim t4    As Long
  1045.     Dim t5    As Long
  1046.     Dim t6    As Long
  1047.     Dim s(27) As Byte
  1048.  
  1049.     CopyMemory t0, plaintext(p + 0), 4&
  1050.     CopyMemory t1, plaintext(p + 4), 4&
  1051.     CopyMemory t2, plaintext(p + 8), 4&
  1052.     CopyMemory t3, plaintext(p + 12), 4&
  1053.     CopyMemory t4, plaintext(p + 16), 4&
  1054.     CopyMemory t5, plaintext(p + 20), 4&
  1055.     CopyMemory t6, plaintext(p + 24), 4&
  1056.     t0 = t0 Xor fkey(0)
  1057.     t1 = t1 Xor fkey(1)
  1058.     t2 = t2 Xor fkey(2)
  1059.     t3 = t3 Xor fkey(3)
  1060.     t4 = t4 Xor fkey(4)
  1061.     t5 = t5 Xor fkey(5)
  1062.     t6 = t6 Xor fkey(6)
  1063.     k = 7
  1064.  
  1065.     For i = 1 To Nr - 1 'Nr is number of rounds
  1066.         CopyMemory s(0), t0, 4&
  1067.         CopyMemory s(4), t1, 4&
  1068.         CopyMemory s(8), t2, 4&
  1069.         CopyMemory s(12), t3, 4&
  1070.         CopyMemory s(16), t4, 4&
  1071.         CopyMemory s(20), t5, 4&
  1072.         CopyMemory s(24), t6, 4&
  1073.         t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(19)) Xor fkey(k + 0)
  1074.         t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(23)) Xor fkey(k + 1)
  1075.         t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(18)) Xor Te3(s(27)) Xor fkey(k + 2)
  1076.         t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(22)) Xor Te3(s(3)) Xor fkey(k + 3)
  1077.         t4 = Te0(s(16)) Xor Te1(s(21)) Xor Te2(s(26)) Xor Te3(s(7)) Xor fkey(k + 4)
  1078.         t5 = Te0(s(20)) Xor Te1(s(25)) Xor Te2(s(2)) Xor Te3(s(11)) Xor fkey(k + 5)
  1079.         t6 = Te0(s(24)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(15)) Xor fkey(k + 6)
  1080.         k = k + 7
  1081.     Next i
  1082.  
  1083.     'Final round
  1084.     CopyMemory s(0), t0, 4&
  1085.     CopyMemory s(4), t1, 4&
  1086.     CopyMemory s(8), t2, 4&
  1087.     CopyMemory s(12), t3, 4&
  1088.     CopyMemory s(16), t4, 4&
  1089.     CopyMemory s(20), t5, 4&
  1090.     CopyMemory s(24), t6, 4&
  1091.     t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 0)
  1092.     t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(23)) And &HFF000000) Xor fkey(k + 1)
  1093.     t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(27)) And &HFF000000) Xor fkey(k + 2)
  1094.     t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(22)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 3)
  1095.     t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(21)) And &HFF00&) Xor (Te4(s(26)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 4)
  1096.     t5 = (Te4(s(20)) And &HFF&) Xor (Te4(s(25)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 5)
  1097.     t6 = (Te4(s(24)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 6)
  1098.     CopyMemory ciphertext(q + 0), t0, 4&
  1099.     CopyMemory ciphertext(q + 4), t1, 4&
  1100.     CopyMemory ciphertext(q + 8), t2, 4&
  1101.     CopyMemory ciphertext(q + 12), t3, 4&
  1102.     CopyMemory ciphertext(q + 16), t4, 4&
  1103.     CopyMemory ciphertext(q + 20), t5, 4&
  1104.     CopyMemory ciphertext(q + 24), t6, 4&
  1105. End Sub
  1106. Public Sub Block224Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  1107.     Dim i     As Long
  1108.     Dim k     As Long
  1109.     Dim t0    As Long
  1110.     Dim t1    As Long
  1111.     Dim t2    As Long
  1112.     Dim t3    As Long
  1113.     Dim t4    As Long
  1114.     Dim t5    As Long
  1115.     Dim t6    As Long
  1116.     Dim s(27) As Byte
  1117.  
  1118.     CopyMemory t0, ciphertext(q + 0), 4&
  1119.     CopyMemory t1, ciphertext(q + 4), 4&
  1120.     CopyMemory t2, ciphertext(q + 8), 4&
  1121.     CopyMemory t3, ciphertext(q + 12), 4&
  1122.     CopyMemory t4, ciphertext(q + 16), 4&
  1123.     CopyMemory t5, ciphertext(q + 20), 4&
  1124.     CopyMemory t6, ciphertext(q + 24), 4&
  1125.     t0 = t0 Xor rkey(0)
  1126.     t1 = t1 Xor rkey(1)
  1127.     t2 = t2 Xor rkey(2)
  1128.     t3 = t3 Xor rkey(3)
  1129.     t4 = t4 Xor rkey(4)
  1130.     t5 = t5 Xor rkey(5)
  1131.     t6 = t6 Xor rkey(6)
  1132.     k = 7
  1133.  
  1134.     For i = 1 To Nr - 1 'Nr is number of rounds
  1135.         CopyMemory s(0), t0, 4&
  1136.         CopyMemory s(4), t1, 4&
  1137.         CopyMemory s(8), t2, 4&
  1138.         CopyMemory s(12), t3, 4&
  1139.         CopyMemory s(16), t4, 4&
  1140.         CopyMemory s(20), t5, 4&
  1141.         CopyMemory s(24), t6, 4&
  1142.         t0 = Td0(s(0)) Xor Td1(s(25)) Xor Td2(s(22)) Xor Td3(s(15)) Xor rkey(k + 0)
  1143.         t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(26)) Xor Td3(s(19)) Xor rkey(k + 1)
  1144.         t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(23)) Xor rkey(k + 2)
  1145.         t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(27)) Xor rkey(k + 3)
  1146.         t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(3)) Xor rkey(k + 4)
  1147.         t5 = Td0(s(20)) Xor Td1(s(17)) Xor Td2(s(14)) Xor Td3(s(7)) Xor rkey(k + 5)
  1148.         t6 = Td0(s(24)) Xor Td1(s(21)) Xor Td2(s(18)) Xor Td3(s(11)) Xor rkey(k + 6)
  1149.         k = k + 7
  1150.     Next i
  1151.  
  1152.     'Final round
  1153.     CopyMemory s(0), t0, 4&
  1154.     CopyMemory s(4), t1, 4&
  1155.     CopyMemory s(8), t2, 4&
  1156.     CopyMemory s(12), t3, 4&
  1157.     CopyMemory s(16), t4, 4&
  1158.     CopyMemory s(20), t5, 4&
  1159.     CopyMemory s(24), t6, 4&
  1160.     t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(25)) And &HFF00&) Xor (Td4(s(22)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 0)
  1161.     t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(26)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 1)
  1162.     t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(23)) And &HFF000000) Xor rkey(k + 2)
  1163.     t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(27)) And &HFF000000) Xor rkey(k + 3)
  1164.     t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 4)
  1165.     t5 = (Td4(s(20)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 5)
  1166.     t6 = (Td4(s(24)) And &HFF&) Xor (Td4(s(21)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 6)
  1167.     CopyMemory plaintext(p + 0), t0, 4&
  1168.     CopyMemory plaintext(p + 4), t1, 4&
  1169.     CopyMemory plaintext(p + 8), t2, 4&
  1170.     CopyMemory plaintext(p + 12), t3, 4&
  1171.     CopyMemory plaintext(p + 16), t4, 4&
  1172.     CopyMemory plaintext(p + 20), t5, 4&
  1173.     CopyMemory plaintext(p + 24), t6, 4&
  1174. End Sub
  1175. #End If
  1176. Public Sub Block256Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  1177.     Dim i     As Long
  1178.     Dim k     As Long
  1179.     Dim t0    As Long
  1180.     Dim t1    As Long
  1181.     Dim t2    As Long
  1182.     Dim t3    As Long
  1183.     Dim t4    As Long
  1184.     Dim t5    As Long
  1185.     Dim t6    As Long
  1186.     Dim t7    As Long
  1187.     Dim s(31) As Byte
  1188.  
  1189.     CopyMemory t0, plaintext(p + 0), 4&
  1190.     CopyMemory t1, plaintext(p + 4), 4&
  1191.     CopyMemory t2, plaintext(p + 8), 4&
  1192.     CopyMemory t3, plaintext(p + 12), 4&
  1193.     CopyMemory t4, plaintext(p + 16), 4&
  1194.     CopyMemory t5, plaintext(p + 20), 4&
  1195.     CopyMemory t6, plaintext(p + 24), 4&
  1196.     CopyMemory t7, plaintext(p + 28), 4&
  1197.     t0 = t0 Xor fkey(0)
  1198.     t1 = t1 Xor fkey(1)
  1199.     t2 = t2 Xor fkey(2)
  1200.     t3 = t3 Xor fkey(3)
  1201.     t4 = t4 Xor fkey(4)
  1202.     t5 = t5 Xor fkey(5)
  1203.     t6 = t6 Xor fkey(6)
  1204.     t7 = t7 Xor fkey(7)
  1205.     k = 8
  1206.  
  1207.     For i = 1 To Nr - 1 'Nr is number of rounds
  1208.         CopyMemory s(0), t0, 4&
  1209.         CopyMemory s(4), t1, 4&
  1210.         CopyMemory s(8), t2, 4&
  1211.         CopyMemory s(12), t3, 4&
  1212.         CopyMemory s(16), t4, 4&
  1213.         CopyMemory s(20), t5, 4&
  1214.         CopyMemory s(24), t6, 4&
  1215.         CopyMemory s(28), t7, 4&
  1216.         t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(14)) Xor Te3(s(19)) Xor fkey(k + 0)
  1217.         t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(18)) Xor Te3(s(23)) Xor fkey(k + 1)
  1218.         t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(22)) Xor Te3(s(27)) Xor fkey(k + 2)
  1219.         t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(26)) Xor Te3(s(31)) Xor fkey(k + 3)
  1220.         t4 = Te0(s(16)) Xor Te1(s(21)) Xor Te2(s(30)) Xor Te3(s(3)) Xor fkey(k + 4)
  1221.         t5 = Te0(s(20)) Xor Te1(s(25)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 5)
  1222.         t6 = Te0(s(24)) Xor Te1(s(29)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 6)
  1223.         t7 = Te0(s(28)) Xor Te1(s(1)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 7)
  1224.         k = k + 8
  1225.     Next i
  1226.  
  1227.     'Final round
  1228.     CopyMemory s(0), t0, 4&
  1229.     CopyMemory s(4), t1, 4&
  1230.     CopyMemory s(8), t2, 4&
  1231.     CopyMemory s(12), t3, 4&
  1232.     CopyMemory s(16), t4, 4&
  1233.     CopyMemory s(20), t5, 4&
  1234.     CopyMemory s(24), t6, 4&
  1235.     CopyMemory s(28), t7, 4&
  1236.     t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 0)
  1237.     t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(23)) And &HFF000000) Xor fkey(k + 1)
  1238.     t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(22)) And &HFF0000) Xor (Te4(s(27)) And &HFF000000) Xor fkey(k + 2)
  1239.     t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(26)) And &HFF0000) Xor (Te4(s(31)) And &HFF000000) Xor fkey(k + 3)
  1240.     t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(21)) And &HFF00&) Xor (Te4(s(30)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 4)
  1241.     t5 = (Te4(s(20)) And &HFF&) Xor (Te4(s(25)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 5)
  1242.     t6 = (Te4(s(24)) And &HFF&) Xor (Te4(s(29)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 6)
  1243.     t7 = (Te4(s(28)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 7)
  1244.     CopyMemory ciphertext(q + 0), t0, 4&
  1245.     CopyMemory ciphertext(q + 4), t1, 4&
  1246.     CopyMemory ciphertext(q + 8), t2, 4&
  1247.     CopyMemory ciphertext(q + 12), t3, 4&
  1248.     CopyMemory ciphertext(q + 16), t4, 4&
  1249.     CopyMemory ciphertext(q + 20), t5, 4&
  1250.     CopyMemory ciphertext(q + 24), t6, 4&
  1251.     CopyMemory ciphertext(q + 28), t7, 4&
  1252. End Sub
  1253. Public Sub Block256Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  1254.     Dim i     As Long
  1255.     Dim k     As Long
  1256.     Dim t0    As Long
  1257.     Dim t1    As Long
  1258.     Dim t2    As Long
  1259.     Dim t3    As Long
  1260.     Dim t4    As Long
  1261.     Dim t5    As Long
  1262.     Dim t6    As Long
  1263.     Dim t7    As Long
  1264.     Dim s(31) As Byte
  1265.  
  1266.     CopyMemory t0, ciphertext(q + 0), 4&
  1267.     CopyMemory t1, ciphertext(q + 4), 4&
  1268.     CopyMemory t2, ciphertext(q + 8), 4&
  1269.     CopyMemory t3, ciphertext(q + 12), 4&
  1270.     CopyMemory t4, ciphertext(q + 16), 4&
  1271.     CopyMemory t5, ciphertext(q + 20), 4&
  1272.     CopyMemory t6, ciphertext(q + 24), 4&
  1273.     CopyMemory t7, ciphertext(q + 28), 4&
  1274.     t0 = t0 Xor rkey(0)
  1275.     t1 = t1 Xor rkey(1)
  1276.     t2 = t2 Xor rkey(2)
  1277.     t3 = t3 Xor rkey(3)
  1278.     t4 = t4 Xor rkey(4)
  1279.     t5 = t5 Xor rkey(5)
  1280.     t6 = t6 Xor rkey(6)
  1281.     t7 = t7 Xor rkey(7)
  1282.     k = 8
  1283.  
  1284.     For i = 1 To Nr - 1 'Nr is number of rounds
  1285.         CopyMemory s(0), t0, 4&
  1286.         CopyMemory s(4), t1, 4&
  1287.         CopyMemory s(8), t2, 4&
  1288.         CopyMemory s(12), t3, 4&
  1289.         CopyMemory s(16), t4, 4&
  1290.         CopyMemory s(20), t5, 4&
  1291.         CopyMemory s(24), t6, 4&
  1292.         CopyMemory s(28), t7, 4&
  1293.         t0 = Td0(s(0)) Xor Td1(s(29)) Xor Td2(s(22)) Xor Td3(s(19)) Xor rkey(k + 0)
  1294.         t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(26)) Xor Td3(s(23)) Xor rkey(k + 1)
  1295.         t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(30)) Xor Td3(s(27)) Xor rkey(k + 2)
  1296.         t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(2)) Xor Td3(s(31)) Xor rkey(k + 3)
  1297.         t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 4)
  1298.         t5 = Td0(s(20)) Xor Td1(s(17)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 5)
  1299.         t6 = Td0(s(24)) Xor Td1(s(21)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 6)
  1300.         t7 = Td0(s(28)) Xor Td1(s(25)) Xor Td2(s(18)) Xor Td3(s(15)) Xor rkey(k + 7)
  1301.         k = k + 8
  1302.     Next i
  1303.  
  1304.     'Final round
  1305.     CopyMemory s(0), t0, 4&
  1306.     CopyMemory s(4), t1, 4&
  1307.     CopyMemory s(8), t2, 4&
  1308.     CopyMemory s(12), t3, 4&
  1309.     CopyMemory s(16), t4, 4&
  1310.     CopyMemory s(20), t5, 4&
  1311.     CopyMemory s(24), t6, 4&
  1312.     CopyMemory s(28), t7, 4&
  1313.     t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(29)) And &HFF00&) Xor (Td4(s(22)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 0)
  1314.     t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(26)) And &HFF0000) Xor (Td4(s(23)) And &HFF000000) Xor rkey(k + 1)
  1315.     t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(30)) And &HFF0000) Xor (Td4(s(27)) And &HFF000000) Xor rkey(k + 2)
  1316.     t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(31)) And &HFF000000) Xor rkey(k + 3)
  1317.     t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 4)
  1318.     t5 = (Td4(s(20)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 5)
  1319.     t6 = (Td4(s(24)) And &HFF&) Xor (Td4(s(21)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 6)
  1320.     t7 = (Td4(s(28)) And &HFF&) Xor (Td4(s(25)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 7)
  1321.     CopyMemory plaintext(p + 0), t0, 4&
  1322.     CopyMemory plaintext(p + 4), t1, 4&
  1323.     CopyMemory plaintext(p + 8), t2, 4&
  1324.     CopyMemory plaintext(p + 12), t3, 4&
  1325.     CopyMemory plaintext(p + 16), t4, 4&
  1326.     CopyMemory plaintext(p + 20), t5, 4&
  1327.     CopyMemory plaintext(p + 24), t6, 4&
  1328.     CopyMemory plaintext(p + 28), t7, 4&
  1329. End Sub
  1330. #End If
  1331.  
  1332. #If SUPPORT_LEVEL Then
  1333. Public Function ArrayEncrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long, BlockBits As Long) As Long
  1334. #Else
  1335. Public Function ArrayEncrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long) As Long
  1336. #End If
  1337.     Dim i           As Long
  1338.     Dim M           As Long
  1339.     Dim n           As Long
  1340. #If SUPPORT_LEVEL = 0 Then
  1341.     Const BlockSize As Long = 16 'bytes
  1342. #Else
  1343.     Dim BlockSize   As Long
  1344.  
  1345.     Select Case BlockBits
  1346.     Case 128:  BlockSize = 16
  1347.     Case 192:  BlockSize = 24
  1348.     Case 256:  BlockSize = 32
  1349. #If SUPPORT_LEVEL = 2 Then
  1350.     Case 160:  BlockSize = 20
  1351.     Case 224:  BlockSize = 28
  1352. #End If
  1353.     Case Else: err.Raise 1, , "cRijndael.ArrayEncrypt - Illegal BlockBits value"
  1354.     End Select
  1355. #End If
  1356.  
  1357.     If LBound(plaintext) <> 0 Then err.Raise 1, , "cRijndael.ArrayEncrypt - plaintext must be zero based array"
  1358.  
  1359.     n = UBound(plaintext) + 1
  1360.     If appendsize = 0 Then
  1361. #If SUPPORT_LEVEL Then
  1362.         M = ((n + BlockSize - 1)  BlockSize) * BlockSize
  1363. #Else
  1364.         M = (n + BlockSize - 1) And &HFFFFFFF0  'BlockSize=16 specific
  1365. #End If
  1366.         ReDim ciphertext(M - 1)
  1367.     Else
  1368. #If SUPPORT_LEVEL Then
  1369.         M = ((n + BlockSize)  BlockSize) * BlockSize
  1370. #Else
  1371.         M = (n + BlockSize) And &HFFFFFFF0      'BlockSize=16 specific
  1372. #End If
  1373.         ReDim ciphertext(M - 1)
  1374.         ciphertext(M - 1) = n Mod BlockSize
  1375.     End If
  1376.  
  1377. #If SUPPORT_LEVEL Then
  1378.     Select Case BlockBits
  1379.     Case 128
  1380. #End If
  1381.  
  1382.     For i = 0 To n - BlockSize Step BlockSize
  1383.         BlockEncrypt plaintext, ciphertext, i, i
  1384.     Next i
  1385.  
  1386. #If SUPPORT_LEVEL Then
  1387.     Case 192
  1388.     For i = 0 To n - BlockSize Step BlockSize
  1389.         Block192Encrypt plaintext, ciphertext, i, i
  1390.     Next i
  1391.     Case 256
  1392.     For i = 0 To n - BlockSize Step BlockSize
  1393.         Block256Encrypt plaintext, ciphertext, i, i
  1394.     Next i
  1395. #If SUPPORT_LEVEL = 2 Then
  1396.     Case 160
  1397.     For i = 0 To n - BlockSize Step BlockSize
  1398.         Block160Encrypt plaintext, ciphertext, i, i
  1399.     Next i
  1400.     Case 224
  1401.     For i = 0 To n - BlockSize Step BlockSize
  1402.         Block224Encrypt plaintext, ciphertext, i, i
  1403.     Next i
  1404. #End If
  1405.     End Select
  1406. #End If
  1407.  
  1408.     If (n Mod BlockSize) <> 0 Then CopyMemory ciphertext(i), plaintext(i), n Mod BlockSize
  1409.  
  1410. #If SUPPORT_LEVEL Then
  1411.     Select Case BlockBits
  1412.     Case 128
  1413. #End If
  1414.  
  1415.     If i <> M Then BlockEncrypt ciphertext, ciphertext, i, i
  1416.  
  1417. #If SUPPORT_LEVEL Then
  1418.     Case 192
  1419.     If i <> M Then Block192Encrypt ciphertext, ciphertext, i, i
  1420.     Case 256
  1421.     If i <> M Then Block256Encrypt ciphertext, ciphertext, i, i
  1422. #If SUPPORT_LEVEL = 2 Then
  1423.     Case 160
  1424.     If i <> M Then Block160Encrypt ciphertext, ciphertext, i, i
  1425.     Case 224
  1426.     If i <> M Then Block224Encrypt ciphertext, ciphertext, i, i
  1427. #End If
  1428.     End Select
  1429. #End If
  1430.  
  1431. End Function
  1432. #If SUPPORT_LEVEL Then
  1433. Public Function ArrayDecrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long, BlockBits As Long) As Long
  1434. #Else
  1435. Public Function ArrayDecrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long) As Long
  1436. #End If
  1437.     Dim i           As Long
  1438.     Dim M           As Long
  1439.     Dim n           As Long
  1440. #If SUPPORT_LEVEL = 0 Then
  1441.     Const BlockSize As Long = 16 'bytes
  1442. #Else
  1443.     Dim BlockSize   As Long
  1444.  
  1445.     Select Case BlockBits
  1446.     Case 128:  BlockSize = 16
  1447.     Case 192:  BlockSize = 24
  1448.     Case 256:  BlockSize = 32
  1449. #If SUPPORT_LEVEL = 2 Then
  1450.     Case 160:  BlockSize = 20
  1451.     Case 224:  BlockSize = 28
  1452. #End If
  1453.     Case Else: err.Raise 1, , "cRijndael.ArrayDecrypt - Illegal BlockBits value"
  1454.     End Select
  1455. #End If
  1456.  
  1457.     If LBound(ciphertext) <> 0 Then err.Raise 1, , "cRijndael.ArrayDecrypt - ciphertext must be zero based array"
  1458.  
  1459.     n = UBound(ciphertext) + 1
  1460.     If ((n Mod BlockSize) = 0) Then
  1461.         ReDim plaintext(n - 1)
  1462.  
  1463. #If SUPPORT_LEVEL Then
  1464.         Select Case BlockBits
  1465.         Case 128
  1466. #End If
  1467.  
  1468.         For i = 0 To n - BlockSize Step BlockSize
  1469.             BlockDecrypt plaintext, ciphertext, i, i
  1470.         Next i
  1471.  
  1472. #If SUPPORT_LEVEL Then
  1473.         Case 192
  1474.         For i = 0 To n - BlockSize Step BlockSize
  1475.             Block192Decrypt plaintext, ciphertext, i, i
  1476.         Next i
  1477.         Case 256
  1478.         For i = 0 To n - BlockSize Step BlockSize
  1479.             Block256Decrypt plaintext, ciphertext, i, i
  1480.         Next i
  1481. #If SUPPORT_LEVEL = 2 Then
  1482.         Case 160
  1483.         For i = 0 To n - BlockSize Step BlockSize
  1484.             Block160Decrypt plaintext, ciphertext, i, i
  1485.         Next i
  1486.         Case 224
  1487.         For i = 0 To n - BlockSize Step BlockSize
  1488.             Block224Decrypt plaintext, ciphertext, i, i
  1489.         Next i
  1490. #End If
  1491.         End Select
  1492. #End If
  1493.  
  1494.         If appendsize Then
  1495.             If plaintext(n - 1) < BlockSize Then
  1496.                 n = n - BlockSize + plaintext(n - 1)
  1497.                 If n > 0 Then ReDim Preserve plaintext(n - 1)
  1498.             Else
  1499.                 MsgBox "warning - incorrect length field"
  1500.                 ArrayDecrypt = 1
  1501.             End If
  1502.         End If
  1503.     Else
  1504.         MsgBox "ciphertext size not a multiple of block size"
  1505.         ArrayDecrypt = -1
  1506.     End If
  1507.  
  1508. End Function
  1509. #If SUPPORT_LEVEL Then
  1510. Public Function FileEncrypt(PlaintextFileName As String, CiphertextFileName As String, BlockBits As Long) As Long
  1511. #Else
  1512. Public Function FileEncrypt(PlaintextFileName As String, CiphertextFileName As String) As Long
  1513. #End If
  1514.     Dim FileNum     As Integer
  1515.     Dim FileNum2    As Integer
  1516.     Dim i           As Long
  1517.     Dim M           As Long 'ciphertext file size
  1518.     Dim n           As Long 'plaintext file size
  1519.     Dim data()      As Byte
  1520. #If SUPPORT_LEVEL = 0 Then
  1521.     Const BlockSize As Long = 16 'bytes
  1522.     Const MaxBlocks As Long = MaxFileChunkSize  BlockSize
  1523. #Else
  1524.     Dim BlockSize   As Long
  1525.     Dim MaxBlocks   As Long
  1526.  
  1527.     Select Case BlockBits
  1528.     Case 128:  BlockSize = 16
  1529.     Case 192:  BlockSize = 24
  1530.     Case 256:  BlockSize = 32
  1531. #If SUPPORT_LEVEL = 2 Then
  1532.     Case 160:  BlockSize = 20
  1533.     Case 224:  BlockSize = 28
  1534. #End If
  1535.     Case Else: err.Raise 1, , "cRijndael.FileEncrypt - Illegal BlockBits value"
  1536.     End Select
  1537.     MaxBlocks = MaxFileChunkSize  BlockSize
  1538. #End If
  1539.  
  1540.     n = FileLen(PlaintextFileName)
  1541. #If SUPPORT_LEVEL Then
  1542.     M = ((n + BlockSize)  BlockSize) * BlockSize
  1543. #Else
  1544.     M = (n + BlockSize) And (-BlockSize) 'BlockSize=16 specific
  1545. #End If
  1546.  
  1547.     FileNum = FreeFile
  1548.     Open PlaintextFileName For Binary Access Read As FileNum
  1549.     FileNum2 = FreeFile
  1550.     Open CiphertextFileName For Binary Access Write As FileNum2
  1551.  
  1552.     'For large files, encrypt in pieces no larger than MaxFileChunkSize
  1553.     If M > MaxBlocks * BlockSize Then
  1554.         ReDim data(MaxBlocks * BlockSize - 1)
  1555.         Do
  1556.             Get #FileNum, , data
  1557. #If SUPPORT_LEVEL Then
  1558.             Select Case BlockBits
  1559.             Case 128
  1560. #End If
  1561.             For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1562.                 BlockEncrypt data, data, i, i
  1563.             Next i
  1564. #If SUPPORT_LEVEL Then
  1565.             Case 192
  1566.             For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1567.                 Block192Encrypt data, data, i, i
  1568.             Next i
  1569.             Case 256
  1570.             For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1571.                 Block256Encrypt data, data, i, i
  1572.             Next i
  1573. #If SUPPORT_LEVEL = 2 Then
  1574.             Case 160
  1575.             For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1576.                 Block160Encrypt data, data, i, i
  1577.             Next i
  1578.             Case 224
  1579.             For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1580.                 Block224Encrypt data, data, i, i
  1581.             Next i
  1582. #End If
  1583.             End Select
  1584. #End If
  1585.             Put #FileNum2, , data
  1586.             M = M - MaxBlocks * BlockSize
  1587.         Loop While M > MaxBlocks * BlockSize
  1588.     End If
  1589.  
  1590.     'Encrypt the last piece of the file
  1591.     ReDim data(M - 1)
  1592.     Get #FileNum, , data
  1593.     data(M - 1) = n Mod BlockSize
  1594. #If SUPPORT_LEVEL Then
  1595.     Select Case BlockBits
  1596.     Case 128
  1597. #End If
  1598.     For i = 0 To M - BlockSize Step BlockSize
  1599.         BlockEncrypt data, data, i, i
  1600.     Next i
  1601. #If SUPPORT_LEVEL Then
  1602.     Case 192
  1603.     For i = 0 To M - BlockSize Step BlockSize
  1604.         Block192Encrypt data, data, i, i
  1605.     Next i
  1606.     Case 256
  1607.     For i = 0 To M - BlockSize Step BlockSize
  1608.         Block256Encrypt data, data, i, i
  1609.     Next i
  1610. #If SUPPORT_LEVEL = 2 Then
  1611.     Case 160
  1612.     For i = 0 To M - BlockSize Step BlockSize
  1613.         Block160Encrypt data, data, i, i
  1614.     Next i
  1615.     Case 224
  1616.     For i = 0 To M - BlockSize Step BlockSize
  1617.         Block224Encrypt data, data, i, i
  1618.     Next i
  1619. #End If
  1620.     End Select
  1621. #End If
  1622.     Put FileNum2, , data
  1623.  
  1624.     Close FileNum
  1625.     Close FileNum2
  1626. End Function
  1627.  
  1628. 'File decryption.
  1629. #If SUPPORT_LEVEL Then
  1630. Public Function FileDecrypt(PlaintextFileName As String, CiphertextFileName As String, BlockBits As Long) As Long
  1631. #Else
  1632. Public Function FileDecrypt(PlaintextFileName As String, CiphertextFileName As String) As Long
  1633. #End If
  1634.     Dim FileNum     As Integer
  1635.     Dim FileNum2    As Integer
  1636.     Dim i           As Long
  1637.     Dim M           As Long 'ciphertext file size
  1638.     Dim n           As Long 'plaintext file size
  1639.     Dim data()      As Byte
  1640.