UTF8编码的Base64解密 MSSQL实现
                        
                            时间:2021-07-01 10:21:17
                            帮助过:3人阅读
							                        
                     
                    
                    
                    
 
CREATE FUNCTION [dbo].
[c_GetUTF8Code]  
   (  
       @char Nchar
   )
RETURNS int
AS
 
--UTF8转码
BEGIN
 Declare @Code int
 Select @Code=Cast(
Unicode(
@char) 
as int)
 Declare @Utf8Code int
 Set @Utf8Code=0
 if(
@Code<128)
 begin
  --0-127
  --0000-007F
  --0xxxxxxx
  --01100010 Unocide
  --01100010 UTF-8
  Set @Utf8Code=@Code 
 end
 else if(
@Code>127 and @Code<2048)
 begin
  --128-2047
  --0080-07FF
  --110xxx xx10xx xxxx
  --110  7      F    F
  Declare @C1 int
  Declare @C2 int
  Declare @C3 int
  Select @C1=@Code/0x100 
  Select @C2=(
@Code%0x100)
/0x10
  Select @C3=@Code%0x10
  Select @Utf8Code=0xC080+0x400*@C1+0x100*(
@C2/4)
+0x10*(
@C2%4)
+@C3
 end
 else if(
@Code>2047 and @Code<65536)
 begin
  --2047-65535
  --0110 0010 0001 0001
  --1110 xxxx 10xx xxxx 10xx xxxx
  --1110 0110 1000 1000 1001 0001
  Declare @C11 int
  Declare @C12 int
  Declare @C13 int
  Declare @C14 int
  Select @C11=@Code/0x1000
  Select @C12=(
@Code%0x1000)
/0x100
  Select @C13=(
@Code%0x100)
/0x10
  Select @C14=@Code%0x10
  Select @Utf8Code=0xE08080+0x10000*@C11+0x400*@C12+0x100*(
@C13/4)
+0x10*(
@C13%4)
+@C14 
 end
 return @Utf8Code
End
 
  
 
  
 
GO
 
CREATE FUNCTION [dbo].
[base64_utf8encode]  
(  
 @plain_text varchar(
max)  
)  
RETURNS varchar(
max)  
AS BEGIN
 
--Base64解密
 DECLARE @output varchar(
max)
 DECLARE @block_start integer
 DECLARE @map char(
64)  
 SET @map=‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/‘ 
 SET @output=‘‘
 SET @block_start=0
 Declare @plain_textLength int
 Set @plain_textLength=Len(
@plain_text)
 Declare @RestTransfer int--转码数累积
 Declare @RestTransferLenth int
 Set @RestTransfer=0
 Set @RestTransferLenth=0
 Declare @CodeInt int
 Declare @block_val BINARY(
3)
 WHILE @block_start<@plain_textLength
 BEGIN 
  Set @CodeInt=0
  SELECT @CodeInt= [dbo].
[c_GetUTF8Code](
SubString(
@plain_text,
@block_start+1,
1))
  Declare @CodeTransfer int
  Set @CodeTransfer=0
  --0-127 1位
  --128-2047 2位
  --2047-65535 3位
  if(
@CodeInt<128)
  begin
   --+1位
   if(
@RestTransferLenth=0 or @RestTransferLenth=1)
   begin
    Set @RestTransfer=@RestTransfer*0x100+@CodeInt
    Set @RestTransferLenth=@RestTransferLenth+1
   end
   else if(
@RestTransferLenth=2)
   begin
    Set @CodeTransfer=@RestTransfer*0x100+@CodeInt
    Set @RestTransfer=0
    Set @RestTransferLenth=0
   end
  end
  else if(
@CodeInt>127 and @CodeInt<2048)
  begin
   --+2位
   if(
@RestTransferLenth=0)
   begin
    Set @RestTransfer=@CodeInt
    Set @RestTransferLenth=2
   end
   else if(
@RestTransferLenth=1)
   begin
    Set @CodeTransfer=0x10000*@RestTransfer+@CodeInt
    Set @RestTransfer=0
    Set @RestTransferLenth=0
   end
   else if(
@RestTransferLenth=2)
   begin
    Set @CodeTransfer=0x100*@RestTransfer+@CodeInt/0x100
    Set @RestTransfer=@CodeInt%0x100
    Set @RestTransferLenth=1
   end
  end
  else if(
@CodeInt>2047)
  begin
   --+3位
   if(
@RestTransferLenth=0)
   begin
    Set @CodeTransfer=@CodeInt
    Set @RestTransfer=0
    Set @RestTransferLenth=0
   end
   else if(
@RestTransferLenth=1)
   begin
    Set @CodeTransfer=0x10000*@RestTransfer+@CodeInt/0x100
    Set @RestTransfer=@CodeInt%0x100
    Set @RestTransferLenth=1
   end
   else if(
@RestTransferLenth=2)
   begin
    --剩余部分十六进制右移两位与新数据前两位之和
    Set @CodeTransfer=0x100*@RestTransfer+@CodeInt/0x10000
    Set @RestTransfer=@CodeInt%0x10000
    Set @RestTransferLenth=2
   end
  end
  ---累积到3位,执行加密转换
  if(
@CodeTransfer>0x100000)
  begin
   SET @block_val = CAST(
@CodeTransfer AS BINARY(
3))  
   SET @output = @output
   + SUBSTRING(
@map , 
@block_val/262144  +1,
1)
   + SUBSTRING(
@map ,(
@block_val/4096&63)
+1,
1)
   + SUBSTRING(
@map ,(
@block_val/64  &63)
+1,
1)
   + SUBSTRING(
@map ,(
@block_val&63)     
+1,
1)
  end
  SET @block_start=@block_start+1  
 END 
 IF @RestTransferLenth>0  
  BEGIN 
   
  SET @block_val=Cast(
@RestTransfer*(
Case @RestTransferLenth When 1 Then 65536 Else 256 end) 
as BINARY(
3))
  SET @output=@output 
   +SUBSTRING(
@map , 
@block_val/262144+1,    
1)  
   +SUBSTRING(
@map ,(
@block_val/4096  &63)
+1,
1)  
   +CASE WHEN @RestTransferLenth =1
   THEN REPLACE(
SUBSTRING(
@map ,(
@block_val/64&63)
+1,
1),
‘A‘,
‘=‘)  
   ELSE SUBSTRING(
@map ,(
@block_val/64&63)
+1,
1)
    END
   +CASE WHEN @RestTransferLenth=1  
   THEN ‘=‘ 
   ELSE REPLACE(
SUBSTRING(
@map ,(
@block_val&63)
+1,
1),
‘A‘,
‘=‘)
    END 
  END
 RETURN @output 
END
 
  
 
  
 
  
 
 
 
 
 
 
GO
 
CREATE FUNCTION [dbo].
[base64_utf8decode]  
   (  
       @encoded_text varchar(
max)  
   )  
   RETURNS varchar(
max)  
   AS BEGIN
 
--BASE64加密
DECLARE @output varchar(
max)
DECLARE @block_start int
DECLARE @encoded_length int
DECLARE @decoded_length int
DECLARE @mapr binary(
122)  
SET @output = ‘‘ 
SET @mapr =  
  0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF    --    1-33  
  +0xFFFFFFFFFFFFFFFFFFFF3EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF    --    33-64  
  +0x000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF    --    65-96  
  +0x1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233--    97-122  
SET @encoded_length=LEN(
@encoded_text)  
SET @decoded_length=@encoded_length/4*3
SET @block_start=1  
Declare @Code int
Set @Code=0
Declare @CodeLength int--累计连接数,1,2,3
Set @CodeLength =0
WHILE @block_start<@encoded_length
BEGIN
 Declare @Integer Integer
 Set @Integer=substring(
@mapr,
Unicode(
substring(
@encoded_text,
@block_start  ,
1)),
1)
*262144  
     + substring(
@mapr,
Unicode(
substring(
@encoded_text,
@block_start+1,
1)),
1)
*4096  
     + substring(
@mapr,
Unicode(
substring(
@encoded_text,
@block_start+2,
1)),
1)
*64  
     + substring(
@mapr,
Unicode(
substring(
@encoded_text,
@block_start+3,
1)),
1)
 Declare @C1 int
 Declare @C2 int
 Declare @C3 int
 --0xFF FF FF
 Set @C1=@Integer/0x10000
 Set @C2=(
@Integer/0x100)
%0x100
 Set @C3=@Integer%0x100
 -------------------------------------@C1
 if(
@C1<0x80)
 begin
  if(
@CodeLength=2)
  begin
   --128-2047
   --0080-07FF
   --110x xx xx 10xx xxxx
   Set @Code=((
@Code%0x2000)
/0x100)
*0x10+@Code%0x40
   SET @output=@output+NCHAR(
@Code)
   --print @Code 
   Set @Code=0
   Set @CodeLength=0
  end
  SET @output=@output+CAST(
Cast(
@C1 AS BINARY(
1))
AS VARCHAR(
1))
 end
 else
 begin
  --码字连接
  Set @Code=@Code*0x100+@C1
  SET @CodeLength=@CodeLength+1
  if(
@CodeLength=3)
  begin
   --0110 0010 0001 0001
   --1110 xxxx 10xx xxxx 10xx xxxx
   --1110 0110 1000 1000 1001 0001
   Set @Code=((
@Code%0x100000)
/0x10000)
*0x1000+((
@Code%0x4000)
/0x100)
*0x40+@Code%0x40
   SET @output=@output+NCHAR(
@Code)
   Set @Code=0
   Set @CodeLength=0
  end
 end
 -------------------------------------@C2
 if(
@C2<0x80)
 begin
  if(
@CodeLength=2)
  begin
   --128-2047
   --0080-07FF
   --110x xx xx 10xx xxxx
   Set @Code=((
@Code%0x2000)
/0x100)
*0x10+@Code%0x40
   SET @output=@output+NCHAR(
@Code)
   --print @Code 
   Set @Code=0
   Set @CodeLength=0
  end
  SET @output=@output+CAST(
Cast(
@C2 AS BINARY(
1))
AS VARCHAR(
1))
 end
 else
 begin
  --码字连接
  Set @Code=@Code*0x100+@C2
  SET @CodeLength=@CodeLength+1
  if(
@CodeLength=3)
  begin
   --0110 0010 0001 0001
   --1110 xxxx 10xx xxxx 10xx xxxx
   --1110 0110 1000 1000 1001 0001
   Set @Code=((
@Code%0x100000)
/0x10000)
*0x1000+((
@Code%0x4000)
/0x100)
*0x40+@Code%0x40
   SET @output=@output+NCHAR(
@Code)
   Set @Code=0
   Set @CodeLength=0
  end
 end
 -------------------------------------@C3
 if(
@C3<0x80)
 begin
  if(
@CodeLength=2)
  begin
   --128-2047
   --0080-07FF
   --110x xx xx 10xx xxxx
   Set @Code=((
@Code%0x2000)
/0x100)
*0x10+@Code%0x40
   SET @output=@output+NCHAR(
@Code)
   --print @Code 
   Set @Code=0
   Set @CodeLength=0
  end
  SET @output=@output+CAST(
Cast(
@C3 AS BINARY(
1))
AS VARCHAR(
1))
 end
 else
 begin
  --码字连接
  Set @Code=@Code*0x100+@C3
  SET @CodeLength=@CodeLength+1
  if(
@CodeLength=3)
  begin
   --0110 0010 0001 0001
   --1110 xxxx 10xx xxxx 10xx xxxx
   --1110 0110 1000 1000 1001 0001
   Set @Code=((
@Code%0x100000)
/0x10000)
*0x1000+((
@Code%0x4000)
/0x100)
*0x40+@Code%0x40
   SET @output=@output+NCHAR(
@Code)
   Set @Code=0
   Set @CodeLength=0
  end
 end
 SET @block_start = @block_start + 4  
END 
IF RIGHT(
@encoded_text,
2)
=‘==‘
 SET @decoded_length=@decoded_length-2
ELSE IF RIGHT(
@encoded_text,
1)
=‘=‘
 SET @decoded_length=@decoded_length-1
RETURN LEFT(
@output ,
@decoded_length)  
END

UTF8编码的Base64解密 MSSQL实现
标签: