--Clean up previous run  
IF EXISTS (SELECT * 
           FROM   SYS.TYPES 
           WHERE  NAME = 'FairPlayTable') 
  DROP TYPE FAIRPLAYTABLE 

--Set Types  
CREATE TYPE FAIRPLAYTABLE AS TABLE (LETTER VARCHAR(1), COLID INT, ROWID INT) 

GO 

--Configuration Variables  
DECLARE @KEYWORD VARCHAR(25) = 'CHARLES' --Keyword for encryption  
DECLARE @INPUT VARCHAR(MAX) = 'Testing Seeconqz' --Word to be encrypted  
DECLARE @Q INT = 0 -- Q removed?  
DECLARE @ENCRYPT INT = 1 --Encrypt?  
--Setup Variables  
DECLARE @WORDS TABLE 
  ( 
     WORD_PRE  VARCHAR(2), 
     WORD_POST VARCHAR(2) 
  ) 
DECLARE @T_TABLE FAIRPLAYTABLE 
DECLARE @NEXTLETTER CHAR(1) 
DECLARE @WORD VARCHAR(2), 
        @COL1 INT, 
        @COL2 INT, 
        @ROW1 INT, 
        @ROW2 INT, 
        @TMP  INT 
DECLARE @SQL     NVARCHAR(MAX) = '', 
        @COUNTER INT = 1, 
        @I       INT = 1 
DECLARE @COUNTER_2 INT = 1 

SET @INPUT = REPLACE(@INPUT, ' ', '') 
SET @KEYWORD = UPPER(@KEYWORD) 

DECLARE @USEDLETTERS VARCHAR(MAX) = '' 
DECLARE @TESTWORDS VARCHAR(2), 
        @A         INT = 0 

WHILE @COUNTER_2 <= 5 
  BEGIN 
      WHILE @COUNTER <= 5 
        BEGIN 
            IF LEN(@KEYWORD) > 0 
              BEGIN 
                  SET @NEXTLETTER = LEFT(@KEYWORD, 1) 
                  SET @KEYWORD = RIGHT(@KEYWORD, LEN(@KEYWORD) - 1) 

                  IF CHARINDEX(@NEXTLETTER, @USEDLETTERS) = 0 
                    BEGIN 
                        INSERT INTO @T_TABLE 
                        SELECT @NEXTLETTER, 
                               @COUNTER, 
                               @COUNTER_2 

                        SET @COUNTER = @COUNTER + 1 
                        SET @USEDLETTERS = @USEDLETTERS + @NEXTLETTER 
                    END 
              END 
            ELSE 
              BEGIN 
                  WHILE 1 = 1 
                    BEGIN 
                        IF CHARINDEX(CHAR(64 + @I), @USEDLETTERS) = 0 
                           AND NOT ( CHAR(64 + @I) = 'Q' 
                                     AND @Q = 1 ) 
                           AND NOT ( @Q = 0 
                                     AND CHAR(64 + @I) = 'J' ) 
                          BEGIN 
                              SET @NEXTLETTER = CHAR(64 + @I) 
                              SET @USEDLETTERS = @USEDLETTERS + CHAR(64 + @I) 
                              SET @I = @I + 1 

                              BREAK 
                          END 

                        SET @I = @I + 1 
                    END 

                  -- SELECT 1 AS [T] 
                  --BREAK 
                  INSERT INTO @T_TABLE 
                  SELECT @NEXTLETTER, 
                         @COUNTER, 
                         @COUNTER_2 

                  SET @COUNTER = @COUNTER + 1 
              END 
        END 

      SET @COUNTER_2 = @COUNTER_2 + 1 
      SET @COUNTER = 1 
  END 

--Split word into Digraphs  
WHILE @A < 1 
  BEGIN 
      SET @TESTWORDS = UPPER(LEFT(@INPUT, 2)) 

      IF LEN(@TESTWORDS) = 1 
        BEGIN 
            SET @TESTWORDS = @TESTWORDS + 'X' 
            SET @A = 1 
        END 
      ELSE IF RIGHT(@TESTWORDS, 1) = LEFT(@TESTWORDS, 1) 
        BEGIN 
            SET @TESTWORDS = RIGHT(@TESTWORDS, 1) + 'X' 
            SET @INPUT = RIGHT(@INPUT, LEN(@INPUT) - 1) 
        END 
      ELSE 
        SET @INPUT = RIGHT(@INPUT, LEN(@INPUT) - 2) 

      IF LEN(@INPUT) = 0 
        SET @A = 1 

      INSERT @WORDS 
      SELECT @TESTWORDS, 
             '' 
  END 

--Start Encryption 
IF @ENCRYPT = 1 
  BEGIN 
      --Loop through Digraphs amd encrypt  
      DECLARE WORDS_LOOP CURSOR LOCAL FORWARD_ONLY FOR 
        SELECT WORD_PRE 
        FROM   @WORDS 
        FOR UPDATE OF WORD_POST 

      OPEN WORDS_LOOP 

      FETCH NEXT FROM WORDS_LOOP INTO @WORD 

      WHILE @@FETCH_STATUS = 0 
        BEGIN 
            --Find letter positions  
            SET @ROW1 = (SELECT ROWID 
                         FROM   @T_TABLE 
                         WHERE  LETTER = LEFT(@WORD, 1)) 
            SET @ROW2 = (SELECT ROWID 
                         FROM   @T_TABLE 
                         WHERE  LETTER = RIGHT(@WORD, 1)) 
            SET @COL1 = (SELECT COLID 
                         FROM   @T_TABLE 
                         WHERE  LETTER = LEFT(@WORD, 1)) 
            SET @COL2 = (SELECT COLID 
                         FROM   @T_TABLE 
                         WHERE  LETTER = RIGHT(@WORD, 1)) 

            --Move positions according to encryption rules  
            IF @COL1 = @COL2 
              BEGIN 
                  SET @ROW1 = @ROW1 + 1 
                  SET @ROW2 = @ROW2 + 1 
              --select 'row'  
              END 
            ELSE IF @ROW1 = @ROW2 
              BEGIN 
                  SET @COL1 = @COL1 + 1 
                  SET @COL2 = @COL2 + 1 
              --select 'col'  
              END 
            ELSE 
              BEGIN 
                  SET @TMP = @COL2 
                  SET @COL2 = @COL1 
                  SET @COL1 = @TMP 
              --select 'reg'  
              END 

            IF @ROW1 = 6 
              SET @ROW1 = 1 

            IF @ROW2 = 6 
              SET @ROW2 = 1 

            IF @COL1 = 6 
              SET @COL1 = 1 

            IF @COL2 = 6 
              SET @COL2 = 1 

            --Find encrypted letters by positions  
            UPDATE @WORDS 
            SET    WORD_POST = (SELECT (SELECT LETTER 
                                        FROM   @T_TABLE 
                                        WHERE  ROWID = @ROW1 
                                               AND COLID = @COL1) 
                                       + (SELECT LETTER 
                                          FROM   @T_TABLE 
                                          WHERE  COLID = @COL2 
                                                 AND ROWID = @ROW2)) 
            WHERE  WORD_PRE = @WORD 

            FETCH NEXT FROM WORDS_LOOP INTO @WORD 
        END 

      CLOSE WORDS_LOOP 

      DEALLOCATE WORDS_LOOP 
  END 
--Start Decryption 
ELSE 
  BEGIN 
      --Loop through Digraphs amd decrypt  
      DECLARE WORDS_LOOP CURSOR LOCAL FORWARD_ONLY FOR 
        SELECT WORD_PRE 
        FROM   @WORDS 
        FOR UPDATE OF WORD_POST 

      OPEN WORDS_LOOP 

      FETCH NEXT FROM WORDS_LOOP INTO @WORD 

      WHILE @@FETCH_STATUS = 0 
        BEGIN 
            --Find letter positions  
            SET @ROW1 = (SELECT ROWID 
                         FROM   @T_TABLE 
                         WHERE  LETTER = LEFT(@WORD, 1)) 
            SET @ROW2 = (SELECT ROWID 
                         FROM   @T_TABLE 
                         WHERE  LETTER = RIGHT(@WORD, 1)) 
            SET @COL1 = (SELECT COLID 
                         FROM   @T_TABLE 
                         WHERE  LETTER = LEFT(@WORD, 1)) 
            SET @COL2 = (SELECT COLID 
                         FROM   @T_TABLE 
                         WHERE  LETTER = RIGHT(@WORD, 1)) 

            --Move positions according to encryption rules  
            IF @COL1 = @COL2 
              BEGIN 
                  SET @ROW1 = @ROW1 - 1 
                  SET @ROW2 = @ROW2 - 1 
              --select 'row'  
              END 
            ELSE IF @ROW1 = @ROW2 
              BEGIN 
                  SET @COL1 = @COL1 - 1 
                  SET @COL2 = @COL2 - 1 
              --select 'col'  
              END 
            ELSE 
              BEGIN 
                  SET @TMP = @COL2 
                  SET @COL2 = @COL1 
                  SET @COL1 = @TMP 
              --select 'reg'  
              END 

            IF @ROW1 = 0 
              SET @ROW1 = 5 

            IF @ROW2 = 0 
              SET @ROW2 = 5 

            IF @COL1 = 0 
              SET @COL1 = 5 

            IF @COL2 = 0 
              SET @COL2 = 5 

            --Find decrypted letters by positions  
            UPDATE @WORDS 
            SET    WORD_POST = (SELECT (SELECT LETTER 
                                        FROM   @T_TABLE 
                                        WHERE  ROWID = @ROW1 
                                               AND COLID = @COL1) 
                                       + (SELECT LETTER 
                                          FROM   @T_TABLE 
                                          WHERE  COLID = @COL2 
                                                 AND ROWID = @ROW2)) 
            WHERE  WORD_PRE = @WORD 

            FETCH NEXT FROM WORDS_LOOP INTO @WORD 
        END 

      CLOSE WORDS_LOOP 

      DEALLOCATE WORDS_LOOP 
  END 

--Output 
DECLARE WORDS CURSOR LOCAL FAST_FORWARD FOR 
  SELECT WORD_POST 
  FROM   @WORDS 

OPEN WORDS 

FETCH NEXT FROM WORDS INTO @WORD 

WHILE @@FETCH_STATUS = 0 
  BEGIN 
      SET @SQL = @SQL + @WORD + ' '

      FETCH NEXT FROM WORDS INTO @WORD 
  END 

CLOSE WORDS 

DEALLOCATE WORDS 

SELECT @SQL 

--Cleanup  
IF EXISTS (SELECT * 
           FROM   SYS.TYPES 
           WHERE  NAME = 'FairPlayTable') 
  DROP TYPE FAIRPLAYTABLE