-
/*Cette modification ajoute la prise en charge de l'Unicode, mais elle est toujours affichée sous forme de données hexadécimales après le cryptage. Étant donné que le codage Unicode obtenu après le cryptage RSA ne peut pas être affiché, le texte chiffré est toujours affiché sous forme de données hexadécimales.
Une attention particulière est nécessaire : si vous souhaitez chiffrer le chinois, les deux nombres premiers sélectionnés doivent être plus grands. Les scores des deux nombres premiers doivent de préférence être supérieurs à 65536, ce qui est supérieur à la valeur de codage maximale d'Unicode.
*/
Implémentation de l'algorithme de chiffrement RSA dans SQL SERVER (deuxième édition)
-- Déterminer s'il s'agit d'un nombre premier
si object_id('f_primeNumTest') n'est pas nul
supprimer la fonction f_primeNumTest
aller
créer une fonction [dbo].[f_primeNumTest]
(@p int)
renvoie un bit
commencer
déclarer @flg bit,@i int
sélectionnez @flg=1, @i=2
tandis que @i<sqrt (@p)
commencer
si (@p%@i=0 )
commencer
définir @flg=0
casser
fin
définir @i=@i+1
fin
retour @flg
fin
aller
-- Déterminer si deux nombres sont relativement premiers
si object_id('f_isNumsPrime') n'est pas nul
supprimer la fonction f_isNumsPrime
aller
créer la fonction f_isNumsPrime
(@num1 entier,@num2 entier)
renvoie un bit
commencer
déclarer @tmp int,@flg bit
définir @flg=1
tandis que (@num2%@num1<>0)
commencer
sélectionnez @tmp=@num1,@num1=@num2%@num1,@num2=@tmp
fin
si @num1=1
définir @flg=0
retour @flg
fin
aller
--Générer une paire de clés
si object_id('p_createKey') n'est pas nul
supprimer le proc p_createKey
aller
créer un proc p_createKey
@p int,@q int
comme
commencer
déclarer @n bigint,@t bigint,@flag int,@d int
si dbo.f_primeNumTest (@p)=0
commencer
print cast (@p as varchar)+'Pas un nombre premier, veuillez resélectionner les données'
retour
fin
si dbo.f_primeNumTest (@q)=0
commencer
print cast (@q as varchar)+'Pas un nombre premier, veuillez resélectionner les données'
retour
fin
print 'Veuillez sélectionner une paire parmi les données suivantes comme clé'
sélectionnez @n=@p*@q,@t=(@p-1)*(@q-1)
déclarer @e int
définir @e=2
tandis que @e<@t
commencer
si dbo.f_isNumsPrime (@e,@t)=0
commencer
définir @d=2
tandis que @d<@n
commencer
si (@e*@d%@t=1)
print cast (@e comme varchar) + espace (5) + cast (@d comme varchar)
définir @d=@d+1
fin
fin
définir @e=@e+1
fin
fin
/*Description de la fonction de chiffrement, @key est l'un des mots de passe sélectionnés dans la procédure stockée précédente, @p, @q sont les deux nombres sélectionnés lors de la génération de la bi-clé. Obtenez la valeur Unicode de chaque caractère, puis cryptez-la pour générer 3 octets de données 16 bits*/
si object_id('f_RSAEncry') n'est pas nul
supprimer la fonction f_RSAEncry
aller
créer la fonction f_RSAEncry
(@s varchar(100),@key int,@p int,@q int)
renvoie nvarchar (4000)
comme
commencer
déclarer @crypt varchar(8000)
définir @crypt=''
tandis que len (@s)>0
commencer
déclarer @i bigint,@tmp varchar(10),@k2 int,@leftchar int
sélectionnez @leftchar=unicode(left(@s,1)),@k2=@key/2,@i=1
tandis que @k2>0
commencer
définir @i=(cast(power(@leftchar,2) as bigint)*@i)%(@p*@q)
définir @k2=@k2-1
fin
set @i= (@leftchar*@i)% (@p*@q)
définir @tmp=''
select @tmp=case when @i%16 between 10 and 15 then char( @i%16+55) else cast (@i%16 as varchar) end +@tmp,@i=@i/16
from (sélectionnez le numéro dans master.dbo.spt_values où type='p' et number<10 )K
trier par numéro desc
définir @crypt=@crypt+right (@tmp,6)
définir @s=trucs (@s,1,1,'')
fin
retourner @crypt
fin
--Déchiffrement : @key est un autre numéro de la paire de mots de passe sélectionnée dans une procédure stockée, @p, @q sont les deux numéros sélectionnés lors de la génération de la paire de clés
si object_id('f_RSADecry') n'est pas nul
supprimer la fonction f_RSADecry
aller
créer la fonction f_RSADecry
(@s nvarchar(4000),@key int,@p int,@q int)
renvoie nvarchar (4000)
comme
commencer
déclarer @crypt varchar(8000)
définir @crypt=''
tandis que len (@s)>0
commencer
déclarer @leftchar bigint
sélectionnez @leftchar=sum(data1)
from (sélectionnez la casse supérieure (sous-chaîne (gauche (@s,6), numéro, 1)) lorsque 'A' puis 10
quand 'B' alors 11
quand 'C' alors 12
quand 'D' alors 13
quand 'E' alors 14
quand 'F' alors 15
sinon sous-chaîne (gauche (@s,6), nombre, 1)
fin* puissance (16, len (gauche (@s,6)) - nombre) data1
from (sélectionnez le numéro dans master.dbo.spt_values où type='p')K
où nombre <= len (gauche (@s,6))
)L
déclarer @k2 int,@j bigint
sélectionnez @k2=@key/2,@j=1
tandis que @k2>0
commencer
définir @j=(cast(power(@leftchar,2)as bigint)*@j)%(@p*@q)
définir @k2=@k2-1
fin
set @j= (@leftchar*@j)% (@p*@q)
set @crypt=@crypt+nchar (@j)
définir @s=trucs (@s,1,6,'')
fin
retourner @crypt
fin
【test】
si object_id('tb') n'est pas nul
supprimer la table tb
aller
créer une table tb (id int identité (1,1), col varchar (100))
aller
insérer dans les valeurs tb(dbo.f_RSAEncry('Chinese',779,1163,59))
insérer dans les valeurs tb(dbo.f_RSAEncry('Chinese',779,1163,59))
sélectionnez * dans la tuberculose
col d'identification
1 00359B00E6E000EAF5
2 01075300931B0010A4007EDC004B340074A6004B34
sélectionnez *, après décryptage=dbo.f_RSADecry(col,35039,1163,59)
de la tuberculose
id col après décryptage
1 00359B00E6E000EAF5 chinois
2 01075300931B0010A4007EDC004B340074A6004B34 chinois
1 0 0
(Veuillez noter l'article)
-