设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2071|回复: 3
打印 上一主题 下一主题

TSQL RC4 算法函数(转)

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2015-4-26 16:09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
This function is used to initialize the seed for the RC4 algorithm
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
                        WHERE                b.i = @Index

                        SELECT        @t = v
                        FROM        @Box
                        WHERE        i = @Index

                        UPDATE        b1
                        SET        b1.v = (SELECT b2.v FROM @Box b2 WHERE b2.i = @b)
                        FROM        @Box b1
                        WHERE        b1.i = @Index

                        UPDATE        @Box
                        SET        v = @t
                        WHERE        i = @b

                        SELECT        @Index = @Index + 1
                END

        RETURN
END
GO

--- And this function does the encrypt/decrypt part
CREATE FUNCTION dbo.fnEncDecRc4
(
        @Pwd VARCHAR(256),
        @Text VARCHAR(8000)
)
RETURNS        VARCHAR(8000)
AS

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

        INSERT        @Box
                (
                        i,
                        v
                )
        SELECT        i,
                v
        FROM        dbo.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
                        WHERE        b.i = @i

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

                        UPDATE        b
                        SET        b.v = (SELECT w.v FROM @Box w WHERE w.i = @j)
                        FROM        @Box b
                        WHERE        b.i = @i

                        UPDATE        @Box
                        SET        v = @t
                        WHERE        i = @j

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

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

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

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

                        SELECT        @Index = @Index  +1
                      END

        RETURN        @Cipher
END

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
 楼主| 发表于 2015-4-26 16:10:18 | 只看该作者
3#
发表于 2015-4-26 17:35:31 | 只看该作者
谢谢分享.仔细看看.rc4比md5体积小

点击这里给我发消息

4#
 楼主| 发表于 2015-4-30 12:52:32 | 只看该作者
好像运行结果不正确,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-12-1 18:19 , Processed in 0.089938 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表