-
/*Modifikasi ini menambahkan dukungan unicode, tetapi masih ditampilkan sebagai data heksadesimal setelah enkripsi. Karena pengkodean unicode yang diperoleh setelah enkripsi RSA tidak dapat ditampilkan, teks tersandi masih ditampilkan dalam data heksadesimal.
Perhatian khusus diperlukan: Jika Anda ingin mengenkripsi bahasa Mandarin, dua bilangan prima yang dipilih harus lebih besar. Skor dari dua bilangan prima sebaiknya lebih besar dari 65536, yang lebih besar dari nilai pengkodean maksimum Unicode.
*/
Menerapkan Algoritma Enkripsi RSA di SQL SERVER (Edisi Kedua)
-- Tentukan apakah bilangan tersebut merupakan bilangan prima
jika object_id('f_primeNumTest') bukan nol
jatuhkan fungsi f_primeNumTest
pergi
buat fungsi [dbo].[f_primeNumTest]
(@p ke dalam)
mengembalikan sedikit
mulai
nyatakan @flg bit,@i int
pilih @flg=1, @i=2
sementara @i<sqrt(@p)
mulai
jika(@p%@i=0 )
mulai
atur @flg=0
merusak
akhir
atur @i=@i+1
akhir
kembalikan @flg
akhir
pergi
-- Tentukan apakah dua bilangan relatif prima
jika object_id('f_isNumsPrime') bukan nol
jatuhkan fungsi f_isNumsPrime
pergi
buat fungsi f_isNumsPrime
(@angka1 ke dalam,@angka2 ke dalam)
mengembalikan sedikit
mulai
nyatakan @tmp int,@flg bit
atur @flg=1
sementara (@num2%@num1<>0)
mulai
pilih @tmp=@num1,@num1=@num2%@num1,@num2=@tmp
akhir
jika @angka1=1
atur @flg=0
kembalikan @flg
akhir
pergi
--Hasilkan pasangan kunci
jika object_id('p_createKey') bukan nol
jatuhkan proc p_createKey
pergi
buat proc p_createKey
@p ke dalam,@q ke dalam
sebagai
mulai
nyatakan @n bigint,@t bigint,@flag int,@d int
jika dbo.f_primeNumTest(@p)=0
mulai
print cast(@p as varchar)+'Bukan bilangan prima, harap pilih ulang datanya'
kembali
akhir
jika dbo.f_primeNumTest(@q)=0
mulai
print cast(@q as varchar)+'Bukan bilangan prima, harap pilih ulang datanya'
kembali
akhir
print 'Silakan pilih satu pasang dari data berikut sebagai kuncinya'
pilih @n=@p*@q,@t=(@p-1)*(@q-1)
nyatakan @e int
atur @e=2
sementara @e<@t
mulai
jika dbo.f_isNumsPrime(@e,@t)=0
mulai
atur @d=2
sementara @d<@n
mulai
jika(@e*@d%@t=1)
cetak pemeran(@e sebagai varchar)+spasi(5)+pemeran(@d sebagai varchar)
atur @d=@d+1
akhir
akhir
atur @e=@e+1
akhir
akhir
/*Deskripsi fungsi enkripsi, @key adalah salah satu kata sandi yang dipilih dalam prosedur tersimpan sebelumnya, @p, @q adalah dua angka yang dipilih saat membuat pasangan kunci. Dapatkan nilai unicode setiap karakter lalu enkripsi untuk menghasilkan 3 byte data 16-bit*/
jika object_id('f_RSAEncry') bukan nol
jatuhkan fungsi f_RSAEncry
pergi
buat fungsi f_RSAEncry
(@s varchar(100),@kunci int,@p int,@q int)
mengembalikan nvarchar(4000)
sebagai
mulai
nyatakan @crypt varchar(8000)
atur @crypt=''
sementara len(@s)>0
mulai
nyatakan @i bigint,@tmp varchar(10),@k2 int,@leftchar int
pilih @leftchar=unicode(kiri(@s,1)),@k2=@kunci/2,@i=1
sementara @k2>0
mulai
setel @i=(cast(power(@leftchar,2) sebagai bigint)*@i)%(@p*@q)
atur @k2=@k2-1
akhir
set @i=(@leftchar*@i)%(@p*@q)
atur @tmp=''
pilih @tmp=case ketika @i%16 antara 10 dan 15 lalu char( @i%16+55) else cast(@i%16 as varchar) end +@tmp,@i=@i/16
dari (pilih nomor dari master.dbo.spt_values di mana type='p' dan nomor<10 )K
pesan berdasarkan nomor des
setel @crypt=@crypt+kanan(@tmp,6)
set @s=barang(@s,1,1,'')
akhir
kembalikan @crypt
akhir
--Dekripsi: @key adalah nomor lain dalam pasangan kata sandi yang dipilih dalam prosedur tersimpan, @p, @q adalah dua nomor yang dipilih saat membuat pasangan kunci
jika object_id('f_RSADecry') bukan nol
jatuhkan fungsi f_RSADecry
pergi
buat fungsi f_RSADecry
(@s nvarchar(4000),@kunci int,@p int,@q int)
mengembalikan nvarchar(4000)
sebagai
mulai
nyatakan @crypt varchar(8000)
atur @crypt=''
sementara len(@s)>0
mulai
nyatakan @leftchar bigint
pilih @leftchar=jumlah(data1)
dari ( pilih huruf besar/kecil(substring(kiri(@s,6), angka, 1)) ketika 'A' lalu 10
ketika 'B' lalu 11
ketika 'C' lalu 12
ketika 'D' lalu 13
ketika 'E' lalu 14
ketika 'F' lalu 15
else substring(kiri(@s,6), angka, 1)
akhir* daya(16, len(kiri(@s,6)) - angka) data1
dari (pilih nomor dari master.dbo.spt_values di mana type='p')K
dimana angka <= len(kiri(@s,6))
) L
nyatakan @k2 int,@j bigint
pilih @k2=@kunci/2,@j=1
sementara @k2>0
mulai
set @j=(pemeran(kekuatan(@leftchar,2) sebagai bigint)*@j)%(@p*@q)
atur @k2=@k2-1
akhir
set @j=(@leftchar*@j)%(@p*@q)
set @crypt=@crypt+nchar(@j)
set @s=barang(@s,1,6,'')
akhir
kembalikan @crypt
akhir
【tes】
jika object_id('tb') bukan nol
jatuhkan meja tb
pergi
buat tabel tb(id int identitas(1,1),col varchar(100))
pergi
masukkan ke dalam nilai tb(dbo.f_RSAEncry('Cina',779,1163,59))
masukkan ke dalam nilai tb(dbo.f_RSAEncry('Cina',779,1163,59))
pilih * dari tb
identitas kol
1 00359B00E6E000EAF5
2 01075300931B0010A4007EDC004B340074A6004B34
pilih *, setelah dekripsi=dbo.f_RSADecry(col,35039,1163,59)
dari tb
id col setelah dekripsi
1 00359B00E6E000EAF5 Cina
2 01075300931B0010A4007EDC004B340074A6004B34 Cina
1 0 0
(Silakan beri peringkat artikelnya)
-