-
/*Diese Änderung fügt Unicode-Unterstützung hinzu, wird jedoch nach der Verschlüsselung weiterhin als hexadezimale Daten angezeigt. Da die nach der RSA-Verschlüsselung erhaltene Unicode-Kodierung nicht angezeigt werden kann, wird der Chiffretext weiterhin als hexadezimale Daten angezeigt.
Besondere Aufmerksamkeit ist erforderlich: Wenn Sie Chinesisch verschlüsseln möchten, müssen die beiden ausgewählten Primzahlen größer sein. Die Punktzahlen der beiden Primzahlen sollten vorzugsweise größer als 65536 sein, was größer als der maximale Codierungswert von Unicode ist.
*/
Implementieren des RSA-Verschlüsselungsalgorithmus in SQL SERVER (Zweite Ausgabe)
-- Bestimmen Sie, ob es sich um eine Primzahl handelt
wenn object_id('f_primeNumTest') nicht null ist
Drop-Funktion f_primeNumTest
gehen
Funktion erstellen [dbo].[f_primeNumTest]
(@p int)
gibt Bit zurück
beginnen
deklariere @flg bit,@i int
wähle @flg=1, @i=2
while @i<sqrt(@p)
beginnen
if(@p%@i=0 )
beginnen
setze @flg=0
brechen
Ende
setze @i=@i+1
Ende
return @flg
Ende
gehen
– Bestimmen Sie, ob zwei Zahlen teilerfremd sind
wenn object_id('f_isNumsPrime') nicht null ist
Drop-Funktion f_isNumsPrime
gehen
Erstellen Sie die Funktion f_isNumsPrime
(@num1 int,@num2 int)
gibt Bit zurück
beginnen
deklariere @tmp int,@flg bit
setze @flg=1
while (@num2%@num1<>0)
beginnen
Wählen Sie @tmp=@num1,@num1=@num2%@num1,@num2=@tmp
Ende
wenn @num1=1
setze @flg=0
return @flg
Ende
gehen
--Schlüsselpaar generieren
wenn object_id('p_createKey') nicht null ist
proc p_createKey löschen
gehen
proc p_createKey erstellen
@p int,@q int
als
beginnen
deklariere @n bigint,@t bigint,@flag int,@d int
wenn dbo.f_primeNumTest(@p)=0
beginnen
print cast(@p as varchar)+'Keine Primzahl, bitte wählen Sie die Daten erneut aus'
zurückkehren
Ende
wenn dbo.f_primeNumTest(@q)=0
beginnen
print cast(@q as varchar)+'Keine Primzahl, bitte wählen Sie die Daten erneut aus'
zurückkehren
Ende
print 'Bitte wählen Sie ein Paar aus den folgenden Daten als Schlüssel aus'
wähle @n=@p*@q,@t=(@p-1)*(@q-1)
deklariere @e int
setze @e=2
während @e<@t
beginnen
wenn dbo.f_isNumsPrime(@e,@t)=0
beginnen
setze @d=2
während @d<@n
beginnen
if(@e*@d%@t=1)
print cast(@e als varchar)+Leertaste(5)+cast(@d als varchar)
setze @d=@d+1
Ende
Ende
setze @e=@e+1
Ende
Ende
/*Beschreibung der Verschlüsselungsfunktion, @key ist eines der in der vorherigen gespeicherten Prozedur ausgewählten Passwörter, @p, @q sind die beiden Zahlen, die beim Generieren des Schlüsselpaars ausgewählt wurden. Rufen Sie den Unicode-Wert jedes Zeichens ab und verschlüsseln Sie ihn dann, um 3 Bytes 16-Bit-Daten zu generieren*/
wenn object_id('f_RSAEncry') nicht null ist
Drop-Funktion f_RSAEncry
gehen
Erstellen Sie die Funktion f_RSAEncry
(@s varchar(100),@key int,@p int,@q int)
gibt nvarchar(4000) zurück
als
beginnen
@crypt varchar(8000) deklarieren
setze @crypt=''
während len(@s)>0
beginnen
deklarieren Sie @i bigint,@tmp varchar(10),@k2 int,@leftchar int
Wählen Sie @leftchar=unicode(left(@s,1)),@k2=@key/2,@i=1
während @k2>0
beginnen
set @i=(cast(power(@leftchar,2) as bigint)*@i)%(@p*@q)
setze @k2=@k2-1
Ende
set @i=(@leftchar*@i)%(@p*@q)
setze @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 (wählen Sie eine Nummer aus master.dbo.spt_values wobei type='p' und number<10 )K
Sortieren nach Nummer desc
set @crypt=@crypt+right(@tmp,6)
setze @s=stuff(@s,1,1,'')
Ende
gib @crypt zurück
Ende
--Entschlüsselung: @key ist eine weitere Zahl im Passwortpaar, das in einer gespeicherten Prozedur ausgewählt wurde, @p, @q sind die beiden Zahlen, die beim Generieren des Schlüsselpaars ausgewählt wurden
wenn object_id('f_RSADecry') nicht null ist
Drop-Funktion f_RSADecry
gehen
Erstellen Sie die Funktion f_RSADecry
(@s nvarchar(4000),@key int,@p int,@q int)
gibt nvarchar(4000) zurück
als
beginnen
@crypt varchar(8000) deklarieren
setze @crypt=''
während len(@s)>0
beginnen
deklariere @leftchar bigint
wähle @leftchar=sum(data1)
from ( select case Upper(substring(left(@s,6), number, 1)) when 'A' then 10
wenn 'B' dann 11
wenn 'C' dann 12
wenn 'D' dann 13
wenn 'E' dann 14
wenn 'F' dann 15
else substring(left(@s,6), number, 1)
end* power(16, len(left(@s,6)) - number) data1
from (wählen Sie eine Nummer aus master.dbo.spt_values wobei type='p')K
wobei Zahl <= len(left(@s,6))
) L
deklariere @k2 int,@j bigint
Wählen Sie @k2=@key/2,@j=1
während @k2>0
beginnen
set @j=(cast(power(@leftchar,2)as bigint)*@j)%(@p*@q)
setze @k2=@k2-1
Ende
set @j=(@leftchar*@j)%(@p*@q)
set @crypt=@crypt+nchar(@j)
setze @s=stuff(@s,1,6,'')
Ende
gib @crypt zurück
Ende
【prüfen】
wenn object_id('tb') nicht null ist
Drop-Tisch TB
gehen
Tabelle erstellen tb(id int Identity(1,1),col varchar(100))
gehen
In TB-Werte einfügen (dbo.f_RSAEncry('Chinese',779,1163,59))
In TB-Werte einfügen (dbo.f_RSAEncry('Chinese',779,1163,59))
Wählen Sie * aus der Tabelle aus
ID-Spalte
1 00359B00E6E000EAF5
2 01075300931B0010A4007EDC004B340074A6004B34
select *, after decryption=dbo.f_RSADecry(col,35039,1163,59)
aus TB
ID-Spalte nach der Entschlüsselung
1 00359B00E6E000EAF5 Chinesisch
2 01075300931B0010A4007EDC004B340074A6004B34 Chinesisch
1 0 0
(Bitte bewerten Sie den Artikel)
-