Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
313
Task/Playfair-cipher/SQL/playfair-cipher.sql
Normal file
313
Task/Playfair-cipher/SQL/playfair-cipher.sql
Normal file
|
|
@ -0,0 +1,313 @@
|
|||
--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
|
||||
Loading…
Add table
Add a link
Reference in a new issue