注册 登录
编程论坛 SQL Server论坛

转SQL2000中用MD5加密

mywisdom88 发布于 2016-12-29 14:38, 1714 次点击
/*****************************************************************************
* 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
select dbo.MD5('我会用MD5加密数据了') as 'MD5加密'
union all
select '736fa44c6a126dbd8aebb8a872725276'
2 回复
#2
mywisdom882017-01-06 16:43
2楼在VFP上创建版本
PARAMETERS Handle
LOCAL MD5_m_OnBits,MD5_m_OnBits_d,MD5_m_2Power,MD5_m_2Power_d,MD5_LShift,MD5_LShift_d,MD5_RShift,MD5_RShift_d,MD5_RotateLeft,MD5_RotateLeft_d
LOCAL MD5_AddUnsigned,MD5_AddUnsigned_d,MD5_F,MD5_F_d,MD5_G,MD5_G_d,MD5_H,MD5_H_d,MD5_I,MD5_I_d,MD5_FF,MD5_FF_d,MD5_GG,MD5_GG_d,MD5_HH,MD5_HH_d
LOCAL MD5_II,MD5_II_d,MD5_ConvertToWordArray,MD5_ConvertToWordArray_d,MD5_WordToHex,MD5_WordToHex_d,MD5,MD5_d

*****************************************************************************
 * 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
LOCAL MD5_m_OnBits,MD5_m_OnBits_d
TEXT TO MD5_m_OnBits_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_m_OnBits TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT

TEXT TO MD5_m_2Power_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_m_2Power TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT

TEXT TO MD5_LShift_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_LShift TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_RShift_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_RShift TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_RotateLeft_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_RotateLeft TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_AddUnsigned_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_AddUnsigned TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_F_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_F TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT

LOCAL MD5_m_OnBits,MD5_m_OnBits_d,MD5_m_2Power,MD5_m_2Power_d,MD5_LShift,MD5_LShift_d,MD5_RShift,MD5_RShift_d,MD5_RotateLeft,MD5_RotateLeft_d
LOCAL MD5_AddUnsigned,MD5_AddUnsigned_d,MD5_F,MD5_F_d,MD5_G,MD5_G_d

TEXT TO MD5_G_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_G TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_H_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_H TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_I_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_I TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_FF_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_FF TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_GG_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_GG TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_HH_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_HH TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_II_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_II TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_ConvertToWordArray_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_ConvertToWordArray TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_WordToHex_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5_WordToHex TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT


TEXT TO MD5_d TEXTMERGE NOSHOW
 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
ENDTEXT

TEXT TO MD5 TEXTMERGE NOSHOW
/*****************************************************************************
 * 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
ENDTEXT
#3
mywisdom882017-01-06 16:44
** 续上
CLEAR
LOCAL lcSql,lcServer,lcUid,lcPwd,lcPwd,lnHandle

lcServer = "atm8505"
lcUid = "sa"
lcPwd = "zjh123456"
lcDbs = "test"
lcSql=[driver=sql server;server=] + lcServer + [;uid=] + lcUid + [;pwd=] + lcPwd + [;database=] + lcDbs
lnHandle=sqlstringconnect(lcSql)
*SQLDISCONNECT(lnHandle)
 
IF lnHandle > 0
?SQLEXEC(lnHandle,MD5_m_OnBits_d)
?SQLEXEC(lnHandle,MD5_m_OnBits)
?SQLEXEC(lnHandle,MD5_m_2Power_d)
?SQLEXEC(lnHandle,MD5_m_2Power)
?SQLEXEC(lnHandle,MD5_LShift_d)
?SQLEXEC(lnHandle,MD5_LShift)
?SQLEXEC(lnHandle,MD5_RShift_d)
?SQLEXEC(lnHandle,MD5_RShift)
?SQLEXEC(lnHandle,MD5_RotateLeft_d)
?SQLEXEC(lnHandle,MD5_RotateLeft)
?SQLEXEC(lnHandle,MD5_AddUnsigned_d)
?SQLEXEC(lnHandle,MD5_AddUnsigned)
?SQLEXEC(lnHandle,MD5_F_d)
?SQLEXEC(lnHandle,MD5_F)
?SQLEXEC(lnHandle,MD5_G_d)
?SQLEXEC(lnHandle,MD5_G)
?SQLEXEC(lnHandle,MD5_H_d)
?SQLEXEC(lnHandle,MD5_H)
?SQLEXEC(lnHandle,MD5_I_d)
?SQLEXEC(lnHandle,MD5_I)
?SQLEXEC(lnHandle,MD5_FF_d)
?SQLEXEC(lnHandle,MD5_FF)
?SQLEXEC(lnHandle,MD5_GG_d)
?SQLEXEC(lnHandle,MD5_GG)
?SQLEXEC(lnHandle,MD5_HH_d)
?SQLEXEC(lnHandle,MD5_HH)
?SQLEXEC(lnHandle,MD5_II_d)
?SQLEXEC(lnHandle,MD5_II)
?SQLEXEC(lnHandle,MD5_ConvertToWordArray_d)
?SQLEXEC(lnHandle,MD5_ConvertToWordArray)
?SQLEXEC(lnHandle,MD5_WordToHex_d)
?SQLEXEC(lnHandle,MD5_WordToHex)
?SQLEXEC(lnHandle,MD5_d)
?SQLEXEC(lnHandle,MD5)

SQLEXEC(lnHandle,"select dbo.MD5('我会用MD5加密数据了') as 'MD5加密'")
?MD5加密

=SQLDISCONNECT(lnHandle)
ENDIF
1