Put this into a module and uncomment the public sub main in the middle of the source file to see how it works.

VB Code:
  1. Attribute VB_Name = "modGost"
  2. '-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-
  3. 'Gosudarstvennyi Standard Soyuza SSR 28147-89
  4. '              (GOST 28147-89)
  5. '-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-
  6. Private S1, S2, S3, S4, S5, S6, S7, S8
  7. Private Function F(R As String, k As String) As String
  8. X = BigMod32Add(R, k)
  9. A = Val("&H" & mid(X, 1, 1))
  10. B = Val("&H" & mid(X, 2, 1))
  11. C = Val("&H" & mid(X, 3, 1))
  12. D = Val("&H" & mid(X, 4, 1))
  13. E = Val("&H" & mid(X, 5, 1))
  14. l = Val("&H" & mid(X, 6, 1))
  15. G = Val("&H" & mid(X, 7, 1))
  16. h = Val("&H" & mid(X, 8, 1))
  17.  
  18. A = S1(A)
  19. B = S2(B)
  20. C = S3(C)
  21. D = S4(D)
  22. E = S5(E)
  23. l = S6(l)
  24. G = S7(G)
  25. h = S8(h)
  26. X = A & B & C & D & E & l & G & h
  27. X = BigShiftLeft(CStr(X), 11)
  28. F = X
  29. End Function
  30. Public Sub InitGOST()
  31. S1 = Array(6, 5, 1, 7, 14, 0, 4, 10, 11, 9, 3, 13, 8, 12, 2, 15)
  32. S2 = Array(14, 13, 9, 0, 8, 10, 12, 4, 7, 15, 6, 11, 3, 1, 5, 2)
  33. S3 = Array(6, 5, 1, 7, 2, 4, 10, 0, 11, 13, 14, 3, 8, 12, 15, 9)
  34. S4 = Array(8, 7, 3, 9, 6, 4, 14, 5, 2, 13, 0, 12, 1, 11, 10, 15)
  35. S5 = Array(10, 9, 6, 11, 5, 1, 8, 4, 0, 13, 7, 2, 14, 3, 15, 12)
  36. S6 = Array(5, 3, 0, 6, 11, 13, 4, 14, 10, 7, 1, 12, 2, 8, 15, 9)
  37. S7 = Array(2, 1, 12, 3, 11, 13, 15, 7, 10, 6, 9, 14, 0, 8, 4, 5)
  38. S8 = Array(6, 5, 1, 7, 8, 9, 4, 2, 15, 3, 13, 12, 10, 14, 11, 0)
  39. End Sub
  40. Private Function Encrypt(ByVal inp As String, ByVal key As String) As String
  41. Dim k(1 To 8) As String
  42. Dim l As String
  43. Dim R As String
  44.  
  45. k(1) = mid(key, 1, 8)
  46. k(2) = mid(key, 8, 8)
  47. k(3) = mid(key, 16, 8)
  48. k(4) = mid(key, 24, 8)
  49. k(5) = mid(key, 32, 8)
  50. k(6) = mid(key, 40, 8)
  51. k(7) = mid(key, 48, 8)
  52. k(8) = mid(key, 56, 8)
  53. For j = 1 To Len(inp) Step 16
  54.     DoEvents
  55.     l = mid(inp, j, 8)
  56.     R = mid(inp, j + 8, 8)
  57.    
  58.     For i = 1 To 3
  59.         R = BigXOR(R, F(l, k(1)))
  60.         l = BigXOR(l, F(R, k(2)))
  61.         R = BigXOR(R, F(l, k(3)))
  62.         l = BigXOR(l, F(R, k(4)))
  63.         R = BigXOR(R, F(l, k(5)))
  64.         l = BigXOR(l, F(R, k(6)))
  65.         R = BigXOR(R, F(l, k(7)))
  66.         l = BigXOR(l, F(R, k(8)))
  67.     Next i
  68.     R = BigXOR(R, F(l, k(8)))
  69.     l = BigXOR(l, F(R, k(7)))
  70.     R = BigXOR(R, F(l, k(6)))
  71.     l = BigXOR(l, F(R, k(5)))
  72.     R = BigXOR(R, F(l, k(4)))
  73.     l = BigXOR(l, F(R, k(3)))
  74.     R = BigXOR(R, F(l, k(2)))
  75.     l = BigXOR(l, F(R, k(1)))
  76.    
  77.     Mid(inp, j, 8) = R
  78.     Mid(inp, j + 8, 8) = l
  79. Next j
  80. Encrypt = inp
  81.  
  82. End Function
  83.  
  84. Public Function EncryptGOST(ByVal inp As String, ByVal key As String) As String
  85.   Dim inpHex As String
  86.   inpHex = PadInp(EnHex(inp))
  87.   EncryptGOST = Encrypt(inpHex, key)
  88. End Function
  89.  
  90. Public Function DecryptGOST(ByVal inp As String, ByVal key As String) As String
  91. Dim k(1 To 8) As String
  92. Dim l As String
  93. Dim R As String
  94.  
  95. k(1) = mid(key, 1, 8)
  96. k(2) = mid(key, 8, 8)
  97. k(3) = mid(key, 16, 8)
  98. k(4) = mid(key, 24, 8)
  99. k(5) = mid(key, 32, 8)
  100. k(6) = mid(key, 40, 8)
  101. k(7) = mid(key, 48, 8)
  102. k(8) = mid(key, 56, 8)
  103. For j = 1 To Len(inp) Step 16
  104.     DoEvents
  105.     l = mid(inp, j, 8)
  106.     R = mid(inp, j + 8, 8)
  107.  
  108.     R = BigXOR(R, F(l, k(1)))
  109.     l = BigXOR(l, F(R, k(2)))
  110.     R = BigXOR(R, F(l, k(3)))
  111.     l = BigXOR(l, F(R, k(4)))
  112.     R = BigXOR(R, F(l, k(5)))
  113.     l = BigXOR(l, F(R, k(6)))
  114.     R = BigXOR(R, F(l, k(7)))
  115.     l = BigXOR(l, F(R, k(8)))
  116.     For i = 1 To 3
  117.         R = BigXOR(R, F(l, k(8)))
  118.         l = BigXOR(l, F(R, k(7)))
  119.         R = BigXOR(R, F(l, k(6)))
  120.         l = BigXOR(l, F(R, k(5)))
  121.         R = BigXOR(R, F(l, k(4)))
  122.         l = BigXOR(l, F(R, k(3)))
  123.         R = BigXOR(R, F(l, k(2)))
  124.         l = BigXOR(l, F(R, k(1)))
  125.     Next i
  126.    
  127.     Mid(inp, j, 8) = R
  128.     Mid(inp, j + 8, 8) = l
  129. Next j
  130. DecryptGOST = inp
  131. End Function
  132. Public Function GenKeyGOST() As String
  133. For i = 1 To 32
  134.     Randomize
  135.     dat = Hex(Rnd * 255)
  136.     If Len(dat) = 1 Then dat = "0" & dat
  137.     key = key & dat
  138. Next i
  139. GenKeyGOST = key
  140. End Function
  141. Public Function EnHex(X As String) As String
  142. For i = 1 To Len(X)
  143.     v = Hex(Asc(mid(X, i, 1)))
  144.     If Len(v) = 1 Then v = "0" & v
  145.     inp = inp & v
  146. Next i
  147. EnHex = inp
  148. End Function
  149. Public Function DeHex(inp As String) As String
  150. For i = 1 To Len(inp) Step 2
  151.     X = X & Chr(Val("&H" & mid(inp, i, 2)))
  152. Next i
  153. DeHex = X
  154. End Function
  155. Public Function PadInp(inp As String) As String
  156. check1:
  157. If Not (Len(inp) / 16) = (Len(inp) \ 16) Then
  158.     inp = inp & "0"
  159.     GoTo check1
  160. End If
  161. PadInp = inp
  162. End Function
  163. 'Public Sub main()
  164. 'Init
  165. 'key = GenKey
  166. 'x = PadInp(EnHex("Test This Encryption"))
  167. 'L = Encrypt(CStr(x), CStr(key))
  168. 'MsgBox DeHex(CStr(L))
  169. 'inp = Decrypt(CStr(L), CStr(key))
  170. 'x = DeHex(CStr(inp))
  171. 'MsgBox x
  172. 'End Sub
  173. Private Function BigXOR(ByVal value1 As String, ByVal value2 As String) As String
  174. Dim valueans As String
  175. Dim loopit As Integer, tempnum As Integer
  176.  
  177.     tempnum = Len(value1) - Len(value2)
  178.     If tempnum < 0 Then
  179.         valueans = Left$(value2, Abs(tempnum))
  180.         value2 = mid$(value2, Abs(tempnum) + 1)
  181.     ElseIf tempnum > 0 Then
  182.         valueans = Left$(value1, Abs(tempnum))
  183.         value1 = mid$(value1, tempnum + 1)
  184.     End If
  185.  
  186.     For loopit = 1 To Len(value1)
  187.         valueans = valueans + Hex$(Val("&H" + mid$(value1, loopit, 1)) Xor Val("&H" + mid$(value2, loopit, 1)))
  188.     Next loopit
  189.  
  190.     BigXOR = Right(valueans, 8)
  191. End Function
  192. Private Function BigMod32Add(ByVal value1 As String, ByVal value2 As String) As String
  193.     BigMod32Add = Right$(BigAdd(value1, value2), 8)
  194. End Function
  195. Private Function BigAdd(ByVal value1 As String, ByVal value2 As String) As String
  196. Dim valueans As String
  197. Dim loopit As Integer, tempnum As Integer
  198.  
  199.     tempnum = Len(value1) - Len(value2)
  200.     If tempnum < 0 Then
  201.         value1 = Space$(Abs(tempnum)) + value1
  202.     ElseIf tempnum > 0 Then
  203.         value2 = Space$(Abs(tempnum)) + value2
  204.     End If
  205.  
  206.     tempnum = 0
  207.     For loopit = Len(value1) To 1 Step -1
  208.         tempnum = tempnum + Val("&H" + mid$(value1, loopit, 1)) + Val("&H" + mid$(value2, loopit, 1))
  209.         valueans = Hex$(tempnum Mod 16) + valueans
  210.         tempnum = Int(tempnum / 16)
  211.     Next loopit
  212.  
  213.     If tempnum <> 0 Then
  214.         valueans = Hex$(tempnum) + valueans
  215.     End If
  216.  
  217.     BigAdd = Right(valueans, 8)
  218. End Function
  219. Private Function BigShiftLeft(value1 As String, shifts As Integer) As String
  220. Dim tempstr As String
  221. Dim loopit As Integer, loopinner As Integer
  222. Dim tempnum As Integer
  223.  
  224.     shifts = shifts Mod 32
  225.    
  226.     If shifts = 0 Then
  227.         BigShiftLeft = value1
  228.         Exit Function
  229.     End If
  230.  
  231.     value1 = Right$(value1, 8)
  232.     tempstr = String$(8 - Len(value1), "0") + value1
  233.     value1 = ""
  234.  
  235.     ' Convert to binary
  236.     For loopit = 1 To 8
  237.         tempnum = Val("&H" + mid$(tempstr, loopit, 1))
  238.         For loopinner = 3 To 0 Step -1
  239.             If tempnum And 2 ^ loopinner Then
  240.                 value1 = value1 + "1"
  241.             Else
  242.                 value1 = value1 + "0"
  243.             End If
  244.         Next loopinner
  245.     Next loopit
  246.    
  247.     For i = 1 To shifts
  248.         For j = 1 To 32
  249.             Mid(value1, j, 1) = mid(value1, j + 1, 1)
  250.             If Not mid(value1, 1, 1) = "0" Then Mid(value1, 1, 1) = "0"
  251.         Next j
  252.     Next i
  253.     tempstr = value1
  254.  
  255.     ' And convert back to hex
  256.     value1 = ""
  257.     For loopit = 0 To 7
  258.         tempnum = 0
  259.         For loopinner = 0 To 3
  260.             If Val(mid$(tempstr, 4 * loopit + loopinner + 1, 1)) Then
  261.                 tempnum = tempnum + 2 ^ (3 - loopinner)
  262.             End If
  263.         Next loopinner
  264.         value1 = value1 + Hex$(tempnum)
  265.     Next loopit
  266.  
  267.     BigShiftLeft = Right(value1, 8)
  268. End Function