Technical Article

RC4 encryption/decryption with SQL Server

,

The first function is used to initialize the seed for the RC4 algorithm (second function), which does the encrypting/decrypting.

CREATE FUNCTION dbo.fnInitRc4
(
@Pwd VARCHAR(256)
)
RETURNS @Box TABLE (i TINYINT, v TINYINT)
AS

BEGIN
DECLARE@Key TABLE (i TINYINT, v TINYINT)

DECLARE@Index SMALLINT,
@PwdLen TINYINT

SELECT@Index = 0,
@PwdLen = LEN(@Pwd)

WHILE @Index <= 255
BEGIN
INSERT@Key
(
i,
v
)
VALUES(
@Index,
 ASCII(SUBSTRING(@Pwd, @Index % @PwdLen + 1, 1))
)

INSERT@Box
(
i,
v
)
VALUES(
@Index,
@Index
)

SELECT@Index = @Index + 1
END


DECLARE@t TINYINT,
@b SMALLINT

SELECT@Index = 0,
@b = 0

WHILE @Index <= 255
BEGIN
SELECT@b = (@b + b.v + k.v) % 256
FROM@Box AS b
INNER JOIN@Key AS k ON k.i = b.i
WHEREb.i = @Index

SELECT@t = v
FROM@Box
WHEREi = @Index

UPDATEb1
SETb1.v = (SELECT b2.v FROM @Box b2 WHERE b2.i = @b)
FROM@Box b1
WHEREb1.i = @Index

UPDATE@Box
SETv = @t
WHEREi = @b

SELECT@Index = @Index + 1
END

RETURN
END
GO
CREATE FUNCTION dbo.fnEncDecRc4
(
@Pwd VARCHAR(256),
@Text VARCHAR(8000)
)
RETURNSVARCHAR(8000)
AS

BEGIN
DECLARE@Box TABLE (i TINYINT, v TINYINT)

INSERT@Box
(
i,
v
)
SELECTi,
v
FROMdbo.fnInitRc4(@Pwd)

DECLARE@Index SMALLINT,
@i SMALLINT,
@j SMALLINT,
@t TINYINT,
@k SMALLINT,
      @CipherBy TINYINT,
      @Cipher VARCHAR(8000)

SELECT@Index = 1,
@i = 0,
@j = 0,
@Cipher = ''

WHILE @Index <= DATALENGTH(@Text)
BEGIN
SELECT@i = (@i + 1) % 256

SELECT@j = (@j + b.v) % 256
FROM@Box b
WHEREb.i = @i

SELECT@t = v
FROM@Box
WHEREi = @i

UPDATEb
SETb.v = (SELECT w.v FROM @Box w WHERE w.i = @j)
FROM@Box b
WHEREb.i = @i

UPDATE@Box
SETv = @t
WHEREi = @j

SELECT@k = v
FROM@Box
WHEREi = @i

SELECT@k = (@k + v) % 256
FROM@Box
WHEREi = @j

SELECT@k = v
FROM@Box
WHEREi = @k

SELECT@CipherBy = ASCII(SUBSTRING(@Text, @Index, 1)) ^ @k,
@Cipher = @Cipher + CHAR(@CipherBy)

SELECT@Index = @Index  +1
      END

RETURN@Cipher
END

Rate

5 (2)

You rated this post out of 5. Change rating

Share

Share

Rate

5 (2)

You rated this post out of 5. Change rating