-
/*Esta modificación agrega soporte Unicode, pero aún se muestra como datos hexadecimales después del cifrado. Debido a que la codificación Unicode obtenida después del cifrado RSA no se puede mostrar, el texto cifrado aún se muestra en datos hexadecimales.
Se necesita atención especial: si desea cifrar chino, los dos números primos seleccionados deben ser mayores. Las puntuaciones de los dos números primos deben ser preferiblemente mayores que 65536, que es mayor que el valor de codificación máximo de Unicode.
*/
Implementación del algoritmo de cifrado RSA en SQL SERVER (segunda edición)
-- Determinar si es un número primo
si object_id('f_primeNumTest') no es nulo
función de caída f_primeNumTest
ir
crear función [dbo].[f_primeNumTest]
(@pint)
devuelve poco
comenzar
declarar @flg bit,@i int
seleccione @flg=1, @i=2
mientras @i<sqrt(@p)
comenzar
si (@p%@i=0)
comenzar
establecer @flg=0
romper
fin
establecer @i=@i+1
fin
volver @flg
fin
ir
-- Determinar si dos números son primos relativos
si object_id('f_isNumsPrime') no es nulo
función de caída f_isNumsPrime
ir
crear función f_isNumsPrime
(@num1int,@num2int)
devuelve poco
comenzar
declarar @tmp int, @flg bit
establecer @flg=1
mientras (@num2%@num1<>0)
comenzar
seleccione @tmp=@num1,@num1=@num2%@num1,@num2=@tmp
fin
si @num1=1
establecer @flg=0
volver @flg
fin
ir
--Generar par de claves
si object_id('p_createKey') no es nulo
soltar proc p_createKey
ir
crear proc p_createKey
@p int,@q int
como
comenzar
declarar @n bigint,@t bigint,@flag int,@d int
si dbo.f_primeNumTest(@p)=0
comenzar
print cast(@p as varchar)+'No es un número primo, vuelva a seleccionar los datos'
devolver
fin
si dbo.f_primeNumTest(@q)=0
comenzar
print cast(@q as varchar)+'No es un número primo, vuelva a seleccionar los datos'
devolver
fin
print 'Seleccione un par de los siguientes datos como clave'
seleccione @n=@p*@q,@t=(@p-1)*(@q-1)
declarar @e int
establecer @e=2
mientras @e<@t
comenzar
si dbo.f_isNumsPrime(@e,@t)=0
comenzar
establecer @d=2
mientras @d<@n
comenzar
si(@e*@d%@t=1)
imprimir elenco(@e como varchar)+espacio(5)+cast(@d como varchar)
establecer @d=@d+1
fin
fin
establecer @e=@e+1
fin
fin
/*Descripción de la función de cifrado, @key es una de las contraseñas seleccionadas en el procedimiento almacenado anterior, @p, @q son los dos números seleccionados al generar el par de claves. Obtenga el valor Unicode de cada carácter y luego cifrelo para generar 3 bytes de datos de 16 bits*/
si object_id('f_RSAEncry') no es nulo
función de caída f_RSAEncry
ir
crear función f_RSAEncry
(@s varchar(100),@key int,@p int,@q int)
devuelve nvarchar(4000)
como
comenzar
declarar @crypt varchar(8000)
establecer @cripta=''
mientras len(@s)>0
comenzar
declarar @i bigint,@tmp varchar(10),@k2 int,@leftchar int
seleccione @leftchar=unicode(left(@s,1)),@k2=@key/2,@i=1
mientras @k2>0
comenzar
establecer @i=(cast(power(@leftchar,2) as bigint)*@i)%(@p*@q)
establecer @k2=@k2-1
fin
establecer @i=(@leftchar*@i)%(@p*@q)
establecer @tmp=''
seleccione @tmp=case cuando @i%16 esté entre 10 y 15 y luego char( @i%16+55) else emita(@i%16 como varchar) finalice +@tmp,@i=@i/16
de (seleccione el número de master.dbo.spt_values donde tipo = 'p' y número <10) K
ordenar por número desc
establecer @cripta=@cripta+derecha(@tmp,6)
establecer @s=cosas(@s,1,1,'')
fin
volver @crypt
fin
--Descifrado: @key es otro número en el par de contraseñas seleccionado en un procedimiento almacenado, @p, @q son los dos números seleccionados al generar el par de claves
si object_id('f_RSADecry') no es nulo
función de caída f_RSADecry
ir
crear función f_RSADecry
(@s nvarchar(4000),@key int,@p int,@q int)
devuelve nvarchar(4000)
como
comenzar
declarar @crypt varchar(8000)
establecer @cripta=''
mientras len(@s)>0
comenzar
declarar @leftchar bigint
seleccione @leftchar=suma(datos1)
desde (seleccione mayúsculas y minúsculas (subcadena (izquierda(@s,6), número, 1)) cuando 'A' y luego 10
cuando 'B' entonces 11
cuando 'C' entonces 12
cuando 'D' entonces 13
cuando 'E' entonces 14
cuando 'F' entonces 15
else subcadena(izquierda(@s,6), número, 1)
fin* potencia(16, len(izquierda(@s,6)) - número) datos1
de (seleccione el número de master.dbo.spt_values donde tipo = 'p') K
donde número <= len(izquierda(@s,6))
) l
declarar @k2 int, @j bigint
seleccione @k2=@key/2,@j=1
mientras @k2>0
comenzar
establecer @j=(cast(power(@leftchar,2)as bigint)*@j)%(@p*@q)
establecer @k2=@k2-1
fin
conjunto @j=(@leftchar*@j)%(@p*@q)
establecer @cripta=@cripta+nchar(@j)
establecer @s=cosas(@s,1,6,'')
fin
volver @crypt
fin
【prueba】
si object_id('tb') no es nulo
mesa abatible tb
ir
crear tabla tb(id int identidad(1,1),col varchar(100))
ir
insertar en valores tb (dbo.f_RSAEncry('Chinese',779,1163,59))
insertar en valores tb (dbo.f_RSAEncry('Chinese',779,1163,59))
seleccione * de tb
columna de identificación
1 00359B00E6E000EAF5
2 01075300931B0010A4007EDC004B340074A6004B34
seleccione *, después de descifrar=dbo.f_RSADecry(col,35039,1163,59)
de tuberculosis
id col después del descifrado
1 00359B00E6E000EAF5 chino
2 01075300931B0010A4007EDC004B340074A6004B34 chino
1 0 0
(Por favor califica el artículo)
-