SQL2000 MD5加密

原文:SQL2000 MD5加密

 

/***************************************************************************** 

* Name: T-SQL MD5算法实现 

* Author: Rambo Qian 

* Create Date: 2003-04-10 

* Last Modified by: Rambo Qian 

* Last Update Date: 2003-04-16 

* Version: V1.0.00 

*****************************************************************************/ 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_m_OnBits]') AND xtype IN(N'FN', N'IF', N'TF')) 

DROP FUNCTION [dbo].[MD5_m_OnBits] 

GO 

/***************************************************************************** 

* Name: MD5_m_OnBits 

* Description: 常数组 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_m_OnBits( 

@i TINYINT 

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN DECLARE @iRes INT 

SELECT @iRes = CASE @i

       WHEN 0  THEN 1-- 00000000000000000000000000000001 

WHEN 1  THEN 3-- 00000000000000000000000000000011 

WHEN 2 THEN 7-- 00000000000000000000000000000111 

WHEN 3 THEN 15-- 00000000000000000000000000001111 

WHEN 4 THEN 31-- 00000000000000000000000000011111 

WHEN 5 THEN 63-- 00000000000000000000000000111111 

WHEN 6 THEN 127-- 00000000000000000000000001111111 

WHEN 7 THEN 255-- 00000000000000000000000011111111 

WHEN 8 THEN 511-- 00000000000000000000000111111111 

WHEN 9 THEN 1023-- 00000000000000000000001111111111 

WHEN 10 THEN 2047-- 00000000000000000000011111111111 

WHEN 11 THEN 4095-- 00000000000000000000111111111111 

WHEN 12 THEN 8191-- 00000000000000000001111111111111 

WHEN 13 THEN 16383-- 00000000000000000011111111111111 

WHEN 14 THEN 32767-- 00000000000000000111111111111111 

WHEN 15 THEN 65535-- 00000000000000001111111111111111 

WHEN 16 THEN 131071-- 00000000000000011111111111111111 

WHEN 17 THEN 262143-- 00000000000000111111111111111111 

WHEN 18 THEN 524287-- 00000000000001111111111111111111 

WHEN 19 THEN 1048575-- 00000000000011111111111111111111 

WHEN 20 THEN 2097151-- 00000000000111111111111111111111 

WHEN 21 THEN 4194303-- 00000000001111111111111111111111 

WHEN 22 THEN 8388607-- 00000000011111111111111111111111 

WHEN 23 THEN 16777215-- 00000000111111111111111111111111 

WHEN 24 THEN 33554431-- 00000001111111111111111111111111 

WHEN 25 THEN 67108863-- 00000011111111111111111111111111 

WHEN 26 THEN 134217727-- 00000111111111111111111111111111 

WHEN 27 THEN 268435455-- 00001111111111111111111111111111 

WHEN 28 THEN 536870911-- 00011111111111111111111111111111 

WHEN 29 THEN 1073741823 -- 00111111111111111111111111111111 

WHEN 30 THEN 2147483647 -- 01111111111111111111111111111111 

    ELSE 0 

    END

    RETURN(@iRes)

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_m_2Power]') AND xtype IN(N'FN', N'IF', N'TF')) 

DROP FUNCTION [dbo].[MD5_m_2Power]

GO 

/***************************************************************************** 

* Name: MD5_m_2Power 

* Description: 常数组 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_m_2Power( 

@i TINYINT 

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

DECLARE @iRes INT

SELECT @iRes=

  CASE @i

WHEN 0 THEN 1-- 00000000000000000000000000000001 

WHEN 1 THEN 2-- 00000000000000000000000000000010 

    WHEN 2 THEN 4-- 00000000000000000000000000000100 

    WHEN 3 THEN 8-- 00000000000000000000000000001000 

    WHEN 4 THEN 16-- 00000000000000000000000000010000 

    WHEN 5 THEN 32-- 00000000000000000000000000100000 

    WHEN 6 THEN 64-- 00000000000000000000000001000000 

    WHEN 7 THEN 128-- 00000000000000000000000010000000 

    WHEN 8 THEN 256--00000000000000000000000100000000 

    WHEN 9 THEN 512-- 00000000000000000000001000000000 

    WHEN 10 THEN 1024-- 00000000000000000000010000000000 

    WHEN 11 THEN 2048-- 00000000000000000000100000000000 

    WHEN 12 THEN 4096-- 00000000000000000001000000000000 

    WHEN 13 THEN 8192-- 00000000000000000010000000000000 

    WHEN 14 THEN 16384-- 00000000000000000100000000000000 

    WHEN 15 THEN 32768-- 00000000000000001000000000000000 

    WHEN 16 THEN 65536-- 00000000000000010000000000000000 

    WHEN 17 THEN 131072-- 00000000000000100000000000000000 

    WHEN 18 THEN 262144-- 00000000000001000000000000000000 

    WHEN 19 THEN 524288-- 00000000000010000000000000000000 

    WHEN 20 THEN 1048576-- 00000000000100000000000000000000 

    WHEN 21 THEN 2097152-- 00000000001000000000000000000000 

    WHEN 22 THEN 4194304-- 00000000010000000000000000000000 

    WHEN 23 THEN 8388608-- 00000000100000000000000000000000 

    WHEN 24 THEN 16777216-- 00000001000000000000000000000000 

    WHEN 25 THEN 33554432-- 00000010000000000000000000000000 

    WHEN 26 THEN 67108864-- 00000100000000000000000000000000 

    WHEN 27 THEN 134217728-- 00001000000000000000000000000000 

    WHEN 28 THEN 268435456-- 00010000000000000000000000000000 

      WHEN 29 THEN 536870912-- 00100000000000000000000000000000 

    WHEN 30 THEN 1073741824 -- 01000000000000000000000000000000 

ELSE 0

END

RETURN(@iRes)

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_LShift]') AND xtype IN(N'FN', N'IF', N'TF')) 

DROP FUNCTION [dbo].[MD5_LShift]

GO 

/***************************************************************************** 

* Name: MD5_LShift 

* Description: MD5_LShift 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_LShift( 

@iValue INT 

,@iShiftBits TINYINT 

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

    DECLARE @iRes BIGINT

    SET @iRes=CAST(@iValue AS BINARY(8))

    SET @iRes=@iRes * dbo.MD5_m_2Power(@iShiftBits)

    RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4)))

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_RShift]') AND xtype IN(N'FN', N'IF', N'TF')) 

DROP FUNCTION [dbo].[MD5_RShift]

GO

/***************************************************************************** 

* Name: MD5_RShift 

* Description: MD5_RShift 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_RShift( 

     @iValue    INT 

    ,@iShiftBits    TINYINT 

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

    DECLARE    @iRes    BIGINT 

    SET @iRes = CAST(@iValue AS BINARY(8)) 

    SET @iRes = @iRes / dbo.MD5_m_2Power(@iShiftBits) 

    RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4))) 

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_RotateLeft]') AND xtype IN(N'FN', N'IF', N'TF')) 

    DROP FUNCTION [dbo].[MD5_RotateLeft] 

GO 

/***************************************************************************** 

* Name: MD5_RotateLeft 

* Description: MD5_RotateLeft 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_RotateLeft( 

@iValue    INT    

,@iShiftBits    TINYINT    

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

RETURN(dbo.MD5_LShift(@iValue, @iShiftBits) | dbo.MD5_RShift(@iValue, (32 - @iShiftBits))) 

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_AddUnsigned]') AND xtype IN(N'FN', N'IF', N'TF')) 

DROP FUNCTION [dbo].[MD5_AddUnsigned]

GO 

/***************************************************************************** 

* Name: MD5_AddUnsigned 

* Description: MD5_AddUnsigned 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_AddUnsigned( 

@iX    INT

,@iY    INT

) 

RETURNS INT 

WITH ENCRYPTION

AS 

BEGIN 

    DECLARE @iRes BIGINT 

    SET @iRes = CAST(CAST(@iX AS BINARY(8)) AS BIGINT) + CAST(CAST(@iY AS BINARY(8)) AS BIGINT) 

    RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4))) 

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_F]') AND xtype IN(N'FN', N'IF', N'TF')) 

    DROP FUNCTION [dbo].[MD5_F]    

GO 

/***************************************************************************** 

* Name: MD5_F 

* Description: MD5_F 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_F( 

    @x    INT

    ,@y    INT

    ,@z    INT

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

    RETURN((@x & @y) | ((~@x) & @z)) 

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_G]') AND xtype IN(N'FN', N'IF', N'TF')) 

    DROP FUNCTION [dbo].[MD5_G]

GO 

/***************************************************************************** 

* Name: MD5_G 

* Description: MD5_G 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_G( 

    @x    INT 

    ,@y    INT 

    ,@z    INT 

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

    RETURN((@x & @z) | (@y & (~@z)))

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_H]') AND xtype IN(N'FN', N'IF', N'TF')) 

    DROP FUNCTION [dbo].[MD5_H]

GO 

/***************************************************************************** 

* Name: MD5_H 

* Description: MD5_H 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_H( 

    @x    INT 

    ,@y    INT 

    ,@z    INT 

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

    RETURN(@x ^ @y ^ @z)

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_I]') AND xtype IN(N'FN', N'IF', N'TF')) 

    DROP FUNCTION [dbo].[MD5_I]

GO 

/***************************************************************************** 

* Name: MD5_I 

* Description: MD5_I 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_I( 

     @x    INT 

    ,@y    INT 

    ,@z    INT 

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

    RETURN(@y ^ (@x | (~@z)))    

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_FF]') AND xtype IN(N'FN', N'IF', N'TF')) 

    DROP FUNCTION [dbo].[MD5_FF]    

GO 

/***************************************************************************** 

* Name: MD5_FF 

* Description: MD5_FF 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_FF( 

    @a    INT 

    ,@b    INT 

    ,@c    INT 

    ,@d    INT 

    ,@x    INT 

    ,@s    INT    

    ,@ac    INT    

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

    SET @a=dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_F(@b, @c, @d), @x), @ac)) 

    SET @a=dbo.MD5_RotateLeft(@a, @s) 

    SET @a=dbo.MD5_AddUnsigned(@a, @b) 

    RETURN(@a) 

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_GG]') AND xtype IN(N'FN', N'IF', N'TF')) 

    DROP FUNCTION [dbo].[MD5_GG]    

GO 

/***************************************************************************** 

* Name: MD5_GG 

* Description: MD5_GG 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_GG( 

    @a    INT 

    ,@b    INT 

    ,@c    INT 

    ,@d    INT 

    ,@x    INT 

    ,@s    INT 

    ,@ac    INT 

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

    SET @a=dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_G(@b, @c, @d), @x), @ac)) 

    SET @a=dbo.MD5_RotateLeft(@a, @s) 

    SET @a=dbo.MD5_AddUnsigned(@a, @b) 

    RETURN(@a) 

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_HH]') AND xtype IN(N'FN', N'IF', N'TF')) 

    DROP FUNCTION [dbo].[MD5_HH]    

GO 

/***************************************************************************** 

* Name: MD5_HH 

* Description: MD5_HH 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_HH( 

    @a    INT 

    ,@b    INT 

    ,@c    INT 

    ,@d    INT 

    ,@x    INT 

    ,@s    INT 

    ,@ac    INT 

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

    SET    @a=dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_H(@b, @c, @d), @x), @ac)) 

    SET    @a=dbo.MD5_RotateLeft(@a, @s) 

    SET    @a=dbo.MD5_AddUnsigned(@a, @b) 

    RETURN(@a) 

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_II]') AND xtype IN(N'FN', N'IF', N'TF')) 

DROP FUNCTION [dbo].[MD5_II]

GO 

/***************************************************************************** 

* Name: MD5_II 

* Description: MD5_II 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_II( 

    @a    INT 

    ,@b    INT 

    ,@c    INT 

    ,@d    INT 

    ,@x    INT 

    ,@s    INT 

    ,@ac    INT 

) 

RETURNS INT 

WITH ENCRYPTION 

AS 

BEGIN 

    SET    @a=dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_I(@b, @c, @d), @x), @ac)) 

    SET    @a=dbo.MD5_RotateLeft(@a, @s) 

    SET    @a=dbo.MD5_AddUnsigned(@a, @b) 

    RETURN(@a) 

END 

GO







IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_ConvertToWordArray]') AND xtype IN(N'FN', N'IF', N'TF')) 

    DROP FUNCTION [dbo].[MD5_ConvertToWordArray]

GO 

/***************************************************************************** 

* Name: MD5_ConvertToWordArray 

* Description: MD5_ConvertToWordArray 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_ConvertToWordArray( 

@sOrigMess    VARCHAR(8000)= ''

) 

RETURNS @tWordArray TABLE([ID] INT    IDENTITY(0,1),[Word] INT) 

WITH ENCRYPTION 

AS 

BEGIN 

    IF @sOrigMess IS NULL 

    SET @sOrigMess= ''



    DECLARE @iLenOfMess    INT 

    DECLARE @iWordArrayLen    INT 

    DECLARE @iPosOfWord    INT 

    DECLARE @iPosOfMess    INT 

    DECLARE @iCountOfWord    INT 



    SET    @iLenOfMess=LEN(@sOrigMess) 

    SET    @iWordArrayLen=((@iLenOfMess + 8)/64 + 1)*16 

    SET    @iCountOfWord=0 

    WHILE(@iCountOfWord<@iWordArrayLen) 

    BEGIN 

    INSERT INTO @tWordArray([Word]) VALUES(0) 

    SET @iCountOfWord = @iCountOfWord + 1 

    END



    SELECT @iPosOfMess = 0, @iPosOfWord = 0, @iCountOfWord = 0 

    WHILE(@iPosOfMess < @iLenOfMess) 

     BEGIN 

    SELECT @iCountOfWord = @iPosOfMess / 4, @iPosOfWord = @iPosOfMess % 4 

    UPDATE @tWordArray 

    SET [Word] = [Word] | dbo.MD5_LShift(UNICODE(SUBSTRING(@sOrigMess,@iPosOfMess+1,1)),@iPosOfWord*8) 

    WHERE [ID] = @iCountOfWord 

    SET @iPosOfMess = @iPosOfMess + 1 

     END 



    SELECT @iCountOfWord = @iPosOfMess / 4, @iPosOfWord = @iPosOfMess % 4 

    UPDATE @tWordArray 

    SET [Word] = [Word] | dbo.MD5_LShift(0x80,@iPosOfWord*8) 

    WHERE [ID] = @iCountOfWord 



    UPDATE @tWordArray 

    SET [Word] = [Word] | dbo.MD5_LShift(@iLenOfMess,3) 

      WHERE [ID] = @iWordArrayLen - 2 

UPDATE @tWordArray 

    SET [Word] = [Word] | dbo.MD5_RShift(@iLenOfMess,29) 

    WHERE [ID] = @iWordArrayLen - 1 

    RETURN 

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_WordToHex]') AND xtype IN(N'FN', N'IF', N'TF')) 

DROP FUNCTION [dbo].[MD5_WordToHex]

GO 

/***************************************************************************** 

* Name: MD5_WordToHex 

* Description: MD5_WordToHex 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5_WordToHex( 

@iValue    INT    

) 

RETURNS CHAR(8) 

WITH ENCRYPTION 

AS 

BEGIN 

    DECLARE @sRes    VARCHAR(8) 

    DECLARE @iTmp    INT 

    DECLARE @iCount TINYINT 



    SELECT @sRes = '', @iCount = 0 

    WHILE(@iCount<4) 

    BEGIN 

    SET @iTmp = dbo.MD5_RShift(@iValue,@iCount*8) & 0x000000FF 

    SET @sRes = @sRes + CASE @iTmp / 16 WHEN 0 THEN '0'

                    WHEN 1 THEN '1' 

                    WHEN 2 THEN '2' 

                    WHEN 3 THEN '3' 

                    WHEN 4    THEN '4' 

                    WHEN 5 THEN '5' 

                    WHEN 6 THEN '6' 

                    WHEN 7 THEN '7' 

                    WHEN 8 THEN '8' 

                    WHEN 9 THEN '9' 

                    WHEN 10 THEN 'A' 

                    WHEN 11 THEN 'B' 

                    WHEN 12 THEN 'C' 

                    WHEN 13 THEN 'D' 

                    WHEN 14 THEN 'E' 

                    WHEN 15 THEN 'F' 

                    ELSE '' END 

                + CASE @iTmp % 16 WHEN 0 THEN '0' 

                    WHEN 1 THEN '1' 

                    WHEN 2    THEN '2' 

                    WHEN 3    THEN '3' 

                    WHEN 4    THEN '4' 

                    WHEN 5    THEN '5' 

                    WHEN 6    THEN '6' 

                    WHEN 7    THEN '7' 

                    WHEN 8    THEN '8' 

                    WHEN 9    THEN '9' 

                    WHEN 10    THEN 'A' 

                    WHEN 11 THEN 'B' 

                    WHEN 12 THEN 'C' 

                    WHEN 13 THEN 'D' 

                    WHEN 14 THEN 'E' 

                    WHEN 15 THEN 'F' 

                    ELSE '' END

    SET @iCount=@iCount + 1    

    END

    RETURN(@sRes)

END 

GO 



IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5]') AND xtype IN(N'FN', N'IF', N'TF')) 

DROP FUNCTION [dbo].[MD5] 

GO 

/***************************************************************************** 

* Name: MD5 

* Description: MD5 

*****************************************************************************/ 

CREATE FUNCTION dbo.MD5( 

@sOrigMess    NVARCHAR(4000) 

) 

RETURNS CHAR(32) 

WITH ENCRYPTION 

AS 

BEGIN 

    --==================================== 

    DECLARE @S11 TINYINT 

    DECLARE @S12 TINYINT 

    DECLARE @S13 TINYINT 

    DECLARE @S14 TINYINT 

    DECLARE @S21 TINYINT 

    DECLARE @S22 TINYINT 

    DECLARE @S23 TINYINT 

    DECLARE @S24 TINYINT 

    DECLARE @S31 TINYINT 

    DECLARE @S32 TINYINT 

    DECLARE @S33 TINYINT 

    DECLARE @S34 TINYINT 

    DECLARE @S41 TINYINT 

    DECLARE @S42 TINYINT 

    DECLARE @S43 TINYINT 

    DECLARE @S44 TINYINT 



    SELECT @S11 = 7, @S12 = 12, @S13 = 17, @S14 = 22 

    SELECT @S21 = 5, @S22 = 9, @S23 = 14, @S24 = 20 

    SELECT @S31 = 4, @S32 = 11, @S33 = 16, @S34 = 23 

    SELECT @S41 = 6, @S42 = 10, @S43 = 15, @S44 = 21 

    --==================================== 

    DECLARE @a INT 

    DECLARE @b INT 

    DECLARE @c INT 

    DECLARE @d INT 

    DECLARE @AA    INT 

    DECLARE @BB    INT 

    DECLARE @CC    INT 

    DECLARE @DD    INT

    SELECT @a = 0x67452301 

    ,@b = 0xEFCDAB89 

    ,@c = 0x98BADCFE 

    ,@d = 0x10325476 

    --==================================== 

    DECLARE @sRes    VARCHAR(32) 

    SET @sRes = '' 

    DECLARE @iWordArrayLen    INT 

    DECLARE @iWordArrayCount    INT 



    DECLARE @tTmp TABLE([ID] INT, [Word] INT) 

    INSERT INTO @tTmp SELECT * FROM dbo.MD5_ConvertToWordArray(@sOrigMess) 

    SELECT @iWordArrayCount=0, @iWordArrayLen = COUNT(*) FROM @tTmp 



    WHILE(@iWordArrayCount < @iWordArrayLen) 

    BEGIN 

    SELECT @AA = @a, @BB = @b, @CC = @c, @DD = @d 



    SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S11, 0xD76AA478) 

    SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S12, 0xE8C7B756) 

    SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S13, 0x242070DB) 

    SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S14, 0xC1BDCEEE) 

    SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S11, 0xF57C0FAF) 

    SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S12, 0x4787C62A) 

    SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S13, 0xA8304613) 

    SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S14, 0xFD469501) 

    SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S11, 0x698098D8) 

    SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S12, 0x8B44F7AF) 

    SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S13, 0xFFFF5BB1) 

    SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S14, 0x895CD7BE) 

    SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S11, 0x6B901122) 

    SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S12, 0xFD987193) 

    SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S13, 0xA679438E) 

    SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S14, 0x49B40821) 



    SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S21, 0xF61E2562) 

    SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S22, 0xC040B340) 

    SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S23, 0x265E5A51) 

    SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S24, 0xE9B6C7AA) 

    SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S21, 0xD62F105D) 

    SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S22, 0x2441453) 

    SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S23, 0xD8A1E681) 

    SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S24, 0xE7D3FBC8) 

    SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S21, 0x21E1CDE6) 

    SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S22, 0xC33707D6) 

    SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S23, 0xF4D50D87) 

    SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S24, 0x455A14ED) 

    SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S21, 0xA9E3E905) 

    SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S22, 0xFCEFA3F8) 

    SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S23, 0x676F02D9) 

    SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S24, 0x8D2A4C8A) 



    SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S31, 0xFFFA3942) 

    SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S32, 0x8771F681) 

    SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S33, 0x6D9D6122) 

    SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S34, 0xFDE5380C) 

    SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S31, 0xA4BEEA44) 

    SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S32, 0x4BDECFA9) 

    SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S33, 0xF6BB4B60) 

    SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S34, 0xBEBFBC70) 

    SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S31, 0x289B7EC6) 

    SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S32, 0xEAA127FA) 

    SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S33, 0xD4EF3085) 

    SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S34, 0x4881D05) 

    SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S31, 0xD9D4D039) 

    SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S32, 0xE6DB99E5) 

    SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S33, 0x1FA27CF8) 

    SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S34, 0xC4AC5665) 



    SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S41, 0xF4292244) 

    SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S42, 0x432AFF97) 

    SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S43, 0xAB9423A7) 

    SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S44, 0xFC93A039) 

    SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S41, 0x655B59C3) 

    SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S42, 0x8F0CCC92) 

    SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S43, 0xFFEFF47D) 

    SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S44, 0x85845DD1) 

    SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S41, 0x6FA87E4F) 

    SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S42, 0xFE2CE6E0) 

    SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S43, 0xA3014314) 

    SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S44, 0x4E0811A1) 

    SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S41, 0xF7537E82) 

    SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S42, 0xBD3AF235) 

    SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S43, 0x2AD7D2BB) 

    SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S44, 0xEB86D391) 



    SET @a = dbo.MD5_AddUnsigned(@a, @AA) 

    SET @b = dbo.MD5_AddUnsigned(@b, @BB) 

    SET @c = dbo.MD5_AddUnsigned(@c, @CC) 

    SET @d = dbo.MD5_AddUnsigned(@d, @DD) 



    SET @iWordArrayCount = @iWordArrayCount + 16 

    END 



    SET @sRes = dbo.MD5_WordToHex(@a) + dbo.MD5_WordToHex(@b) + dbo.MD5_WordToHex(@c) + dbo.MD5_WordToHex(@d) 

    SET @sRes = LOWER(@sRes) 

    RETURN(@sRes) 

END 

GO 



--Test 

set nocount on 

select dbo.MD5('') as 'MD5('''')' 

union 

select 'd41d8cd98f00b204e9800998ecf8427e' 



select dbo.MD5('a') as 'MD5(''a'')' 

union 

select '0cc175b9c0f1b6a831c399e269772661' 



select dbo.MD5('abc') as 'MD5(''abc'')' 

union 

select '900150983cd24fb0d6963f7d28e17f72' 



select dbo.MD5('message digest') as 'MD5(''message digest'')' 

union 

select 'f96b697d7cb7938d525a2f31aaf161d0' 



select dbo.MD5('abcdefghijklmnopqrstuvwxyz') as 'MD5(''abcdefghijklmnopqrstuvwxyz'')' 

union 

select 'c3fcd3d76192e4007dfb496cca67e13b' 



select dbo.MD5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') as 'MD5(''ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'')' 

union 

select 'd174ab98d277d9f5a5611c2c9f419d9f' 



select dbo.MD5('12345678901234567890123456789012345678901234567890123456789012345678901234567890') as 'MD5(''12345678901234567890123456789012345678901234567890123456789012345678901234567890'')' 

union 

select '57edf4a22be3c955ac49da2e2107b67a' 



select dbo.MD5('') as 'MD5('''')' 

union 

select 'a31d0f25367ebe046897f8a939ca4a9f'



SELECT    dbo.MD5('a31d0f25367ebe046897f8a939ca4a9f')



select dbo.MD5('') as 'MD5('''')' 

select dbo.MD5('') as 'MD5('''')' 

select dbo.MD5('') as 'MD5('''')' 



select dbo.MD5('') as 'MD5('''')'

select dbo.MD5('') as 'MD5('''')'

 

你可能感兴趣的:(sql2000)