-
/*Esta modificação adiciona suporte a unicode, mas ainda é exibido como dados hexadecimais após a criptografia. Como a codificação unicode obtida após a criptografia RSA não pode ser exibida, o texto cifrado ainda é exibido em dados hexadecimais.
É necessária atenção especial: se você quiser criptografar o chinês, os dois números primos selecionados devem ser maiores. As pontuações dos dois números primos devem ser preferencialmente maiores que 65536, que é maior que o valor máximo de codificação do Unicode.
*/
Implementando algoritmo de criptografia RSA no SQL SERVER (segunda edição)
- Determine se é um número primo
se object_id('f_primeNumTest') não for nulo
eliminar função f_primeNumTest
ir
criar função [dbo].[f_primeNumTest]
(@pint)
retorna bit
começar
declare @flg bit,@i int
selecione @flg=1, @i=2
enquanto @i<sqrt(@p)
começar
se(@p%@i=0 )
começar
definir @flg=0
quebrar
fim
definir @i=@i+1
fim
retornar @flg
fim
ir
- Determinar se dois números são relativamente primos
se object_id('f_isNumsPrime') não for nulo
eliminar função f_isNumsPrime
ir
criar função f_isNumsPrime
(@num1 int,@num2 int)
retorna bit
começar
declare @tmp int,@flg bit
definir @flg=1
enquanto (@num2%@num1<>0)
começar
selecione @tmp=@num1,@num1=@num2%@num1,@num2=@tmp
fim
se @num1=1
definir @flg=0
retornar @flg
fim
ir
--Gerar par de chaves
se object_id('p_createKey') não for nulo
descartar proc p_createKey
ir
criar proc p_createKey
@p int,@q int
como
começar
declare @n bigint,@t bigint,@flag int,@d int
se dbo.f_primeNumTest(@p)=0
começar
print cast(@p as varchar)+'Não é um número primo, selecione novamente os dados'
retornar
fim
se dbo.f_primeNumTest(@q)=0
começar
print cast(@q as varchar)+'Não é um número primo, selecione novamente os dados'
retornar
fim
print 'Por favor, selecione um par dos seguintes dados como chave'
selecione @n=@p*@q,@t=(@p-1)*(@q-1)
declare @e int
definir @e=2
enquanto @e<@t
começar
se dbo.f_isNumsPrime(@e,@t)=0
começar
definir @d=2
enquanto @d<@n
começar
se(@e*@d%@t=1)
imprimir elenco(@e como varchar)+espaço(5)+cast(@d como varchar)
definir @d=@d+1
fim
fim
definir @e=@e+1
fim
fim
/*Descrição da função de criptografia, @key é uma das senhas selecionadas no procedimento armazenado anterior, @p, @q são os dois números selecionados ao gerar o par de chaves. Obtenha o valor Unicode de cada caractere e criptografe-o para gerar 3 bytes de dados de 16 bits*/
se object_id('f_RSAEncry') não for nulo
eliminar função f_RSAEncry
ir
criar função f_RSAEncry
(@s varchar(100),@key int,@p int,@q int)
retorna nvarchar(4000)
como
começar
declare @crypt varchar(8000)
definir @crypt=''
enquanto len(@s)>0
começar
declare @i bigint,@tmp varchar(10),@k2 int,@leftchar int
selecione @leftchar=unicode(left(@s,1)),@k2=@key/2,@i=1
enquanto @k2>0
começar
defina @i=(cast(power(@leftchar,2) como bigint)*@i)%(@p*@q)
definir @k2=@k2-1
fim
definir @i=(@leftchar*@i)%(@p*@q)
definir @tmp=''
selecione @tmp=case quando @i%16 entre 10 e 15 então char( @i%16+55) else cast(@i%16 as varchar) end +@tmp,@i=@i/16
de (selecione o número de master.dbo.spt_values onde type='p' e número<10 )K
ordenar por número desc
definir @crypt=@crypt+right(@tmp,6)
definir @s=coisas(@s,1,1,'')
fim
retornar @crypt
fim
--Decryption: @key é outro número no par de senhas selecionado em um procedimento armazenado, @p, @q são os dois números selecionados ao gerar o par de chaves
se object_id('f_RSADecry') não for nulo
eliminar função f_RSADecry
ir
criar função f_RSADecry
(@s nvarchar(4000),@key int,@p int,@q int)
retorna nvarchar(4000)
como
começar
declare @crypt varchar(8000)
definir @crypt=''
enquanto len(@s)>0
começar
declare @leftchar bigint
selecione @leftchar=soma(dados1)
from ( select case upper(substring(left(@s,6), number, 1)) quando 'A' então 10
quando 'B' então 11
quando 'C' então 12
quando 'D' então 13
quando 'E' então 14
quando 'F' então 15
senão substring(esquerda(@s,6), número, 1)
fim* potência(16, len(esquerda(@s,6)) - número) dados1
de (selecione o número de master.dbo.spt_values onde type='p')K
onde número <= len(esquerda(@s,6))
) eu
declare @k2 int,@j bigint
selecione @k2=@chave/2,@j=1
enquanto @k2>0
começar
definir @j=(cast(power(@leftchar,2)as bigint)*@j)%(@p*@q)
definir @k2=@k2-1
fim
definir @j=(@leftchar*@j)%(@p*@q)
definir @crypt=@crypt+nchar(@j)
definir @s=coisas(@s,1,6,'')
fim
retornar @crypt
fim
【teste】
se object_id('tb') não for nulo
mesa drop tb
ir
criar tabela tb(id int identidade(1,1),col varchar(100))
ir
inserir em valores tb(dbo.f_RSAEncry('Chinese',779,1163,59))
inserir em valores tb(dbo.f_RSAEncry('Chinese',779,1163,59))
selecione * de tb
coluna de identificação
100359B00E6E000EAF5
201075300931B0010A4007EDC004B340074A6004B34
selecione *, após descriptografia=dbo.f_RSADecry(col,35039,1163,59)
de tb
id col após descriptografia
1 00359B00E6E000EAF5 Chinês
2 01075300931B0010A4007EDC004B340074A6004B34 Chinês
1 0 0
(Por favor, avalie o artigo)
-