Есть исходник на си шарпе... Но, мне кажется, там сложновато будет переделать под синклер-бейсик.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Shifr1
{
    public partial class Form1 : Form
    {
        char FirstLetter;
        int strok;
        int stolb;
        char [,]arrR = new char[12,12];
        string sR;   // Копируем строку без пробелов для передачи в функцию расшифровки
        int click = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            click = 0;
            if (textBox2.Text.Length < 1)
            {
                richTextBox1.Text = richTextBox2.Text = "мг...давай, до свидания...введи кодовое слово\n";
                return;
            }
            //---------------------------------------------------------
            string soob = textBox1.Text;
            string kodslovo = textBox2.Text;
            

            soob = BezProbelov(soob);
            kodslovo = BezProbelov(kodslovo);
            
            
            sR = kodslovo;
            int stolb = kodslovo.Length;
            double strok_double = Convert.ToDouble(soob.Length) / Convert.ToDouble(stolb);
            int strok = Convert.ToInt16(Math.Ceiling(strok_double)) + 1;
            char[,] arr = new char[12, 12];
            arr = TWOmermassiv(arr, strok, stolb, kodslovo);
            int ind = 0;
            int maxind = soob.Length;

            //---------------------------------------------------------
            for (int i = 1; i < strok; i++)          //// Записываем шифруемое слово в двухмерный массив
            {
                for (int j = 0; j < stolb; j++)
                {
                    arr[i,j] = soob[ind];
                    ind = ind + 1;
                    if (ind>=maxind) break;
                }
                if (ind >= maxind) break;
            }
            /// Шифруем сообщение
            Shifruet(arr);
            
            //------------------------------------------------------------
            for (int i = 0; i < stolb; i++)         //// Читаем из массива зашифрованное сообщение
            {
                for (int j = 1; j < strok; j++)
                {
                    richTextBox1.Text+=arr[j, i];
                }
            }
            richTextBox1.Text += "\n";
            
            //--------------------------------------------------------------
            for (int i = 0; i < strok; i++)         //// для расшифровки копируем зашифрованное сообщение
            {
                for (int j = 0; j < stolb; j++)
                {
                    arrR[i, j] = arr[i, j];
                }
            }
            //   этосообщениеследуетотправить 

        }
        private char[,] TWOmermassiv(char[,] arr,int Lstrok,int Lstolb, string s) // Создаётся массив шириной длины кодового слова
        {
            arr = new char[Lstrok, Lstolb];
            for (int i = 0; i < Lstolb; i++)
            {
                arr[0, i] = s[i];
            }
            strok = Lstrok;
            stolb = Lstolb;
            return arr;
        }
        private void Shifruet(char[,] arr)   // Шифруем сообщение перемещая все столбы
        {
            for (int j = 0; j < stolb; j++)
            {
                for (int i = 0; i < stolb; i++)
                {
                    if (arr[0, i] > arr[0, j])
                    {
                        for (int k = 0; k < strok; k++)
                        {
                            FirstLetter = arr[k, i];
                            arr[k, i] = arr[k, j];
                            arr[k, j] = FirstLetter;
                        }
                        i = 0;
                    }
                }

            }
        }

        private void Rashifr()
        {
            
            char[,] arr2 = new char[2, stolb];                //// Создаём 2мерный массив. 0-ая строка хранит кодовое слово, 1-ая индексы букв
            for (int z = 0; z < sR.Length; z++)
            {
                arr2[0, z] = sR[z];             ////    заполняем 0ую кодовым словом
            }
            for (int z = 0; z < sR.Length; z++)
            {
                arr2[1, z] = Convert.ToChar(z);         //// заполняем 1ую индексами
            }
            //---------------------------------------------------------------
            for (int j = 0; j < stolb; j++)             ////  сортируем по 0ой строке, то есть по буквам
            {
                for (int i = 0; i < stolb; i++)
                {
                    if (arr2[0, i] > arr2[0, j])
                    {
                        for (int k = 0; k < 2; k++)
                        {
                            FirstLetter = arr2[k, i];
                            arr2[k, i] = arr2[k, j];
                            arr2[k, j] = FirstLetter;
                        }
                        i = 0;
                    }
                }

            }

            if(click==0)
            {
                for (int i = 0; i < stolb; i++)         ///// заменяем 0ую строку закодированного сообщения на отсортированные индексы
                {
                    arrR[0, i] = arr2[1, i];
                }
                Shifruet(arrR);             /////  сортируем по новой, нулевой строке, по индексам закодированное сообщение
                click++;
            }

            for (int i = 1; i < strok; i++)        //// выводим во втрой ричьбокс
            {
                for (int j = 0; j < stolb; j++)
                {
                    richTextBox2.Text += arrR[i, j];
                }
            }
            richTextBox2.Text += "\n";
        }

        private string BezProbelov(string bezS)
        {
            string R;
            for (int f = 0; f < bezS.Length; f++)
            {
                if (bezS[f] == ' ')
                {
                    R = bezS.Substring(0, f);
                    R += bezS.Substring(f + 1, bezS.Length - f - 1);
                    bezS = R;
                    f = 0;
                }
            }
            return bezS;
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Rashifr();
        }
    }
}