-
/*Эта модификация добавляет поддержку Unicode, но она все еще отображается как шестнадцатеричные данные после шифрования.
Особое внимание необходимо: если вы хотите шифровать китайский, два выбранных числа должны быть больше.
*/
Реализация алгоритма шифрования RSA в SQL Server (второе издание)
- Определите, является ли это основным числом
if object_id ('f_primenumtest') не является нулевым
Функция сброса f_primenumtest
идти
Создать функцию [dbo]. [f_primenumtest]
(@p int)
возвращает бит
начинать
объявить @flg bit, @i int
Выберите @flg = 1, @i = 2
пока @i <sqrt (@p)
начинать
if (@p%@i = 0)
начинать
Установить @flg = 0
перерыв
конец
установить @i=@i+1
конец
вернуть @flg
конец
идти
- Определите, являются ли два числа относительно яркими
if object_id ('f_isnumsprime') не нулевой
Функция сброса F_ISNUMSPRIME
идти
Создать функцию f_isnumsprime
(@num1 int,@num2 int)
возвращает бит
начинать
объявить @tmp int, @flg bit
Установить @flg = 1
while (@num2%@num1 <> 0)
начинать
Выберите@tmp =@num1,@num1 =@num2%@num1,@num2 =@tmp
конец
Если @num1 = 1
Установить @flg = 0
вернуть @flg
конец
идти
-Генеральная пара ключей
if object_id ('p_createkey') не нулевой
Drop Proc P_Createkey
идти
Создать proc p_createkey
@p int,@Q Int
как
начинать
объявить @n bigint,@t bigint,@flag int,@d int
Если dbo.f_primenumtest (@p) = 0
начинать
Print Cast (@p as varchar)+'не простое число, пожалуйста, перепроизводите данные'
возвращаться
конец
Если dbo.f_primenumTest (@Q) = 0
начинать
Print Cast (@Q As varchar)+'не простое число, пожалуйста, задействуйте данные'
возвращаться
конец
Печать 'Пожалуйста, выберите одну пару из следующих данных в качестве ключа
Выберите@n =@p*@q,@t = (@p-1)*(@q-1)
объявить @e int
Установить @e = 2
пока @e <@t
начинать
Если dbo.f_isnumsprime (@e,@t) = 0
начинать
Установить @D = 2
пока @d <@n
начинать
if (@e*@d%@t = 1)
Print Cast (@e as varchar)+пространство (5)+Cast (@d as varchar)
Установите @D = @D+1
конец
конец
Установите @e = @e+1
конец
конец
/*Описание функции шифрования, @Key является одним из паролей, выбранных в предыдущей хранимой процедуре, @P, @Q - это два номера, выбранные при генерации пары клавиш. Получите значение Unicode каждого символа, а затем шифруйте его, чтобы генерировать 3 байта 16-битных данных*/
if object_id ('f_rsaencry') не является нулевым
Функция сброса f_rsaencry
идти
Создайте функцию f_rsaencry
(@S varchar (100),@key int,@p int,@q int)
Возвращает NVARCHAR (4000)
как
начинать
объявить @crypt varchar (8000)
set @crypt = ''
В то время как Лен (@S)> 0
начинать
Declare @i Bigint,@tmp varchar (10),@k2 int,@Leathar int
Выберите@LeatHar = Unicode (слева (@S, 1)),@k2 =@key/2,@i = 1
пока @k2> 0
начинать
SET@I = (CAST (Power (@Leathar, 2) как bigint)*@i)%(@p*@q)
Установить @k2 = @k2-1
конец
Установить @i = (@Leathar*@i)%(@P*@Q)
Установить @tmp = ''
Выберите@tmp = case, когда@i%16 между 10 и 15, затем char (@i%16 +55) else (@i%16 как varchar) end +@tmp,@i =@i/16
ОТ (Выберите номер из master.dbo.spt_values, где type = 'p' и номер <10) k
Порядок по номеру desc
set@crypt =@crypt+right (@tmp, 6)
Установить @S = материал ( @S, 1,1, '')
конец
вернуть @crypt
конец
-ДеКрифтировать: @Key-еще один номер в паре паролей, выбранной в хранимой процедуре, @P, @Q-два номера, выбранные при генерации пары клавиш
if object_id ('f_rsadecry') не является нулевым
Функция сброса f_rsadecry
идти
Создать функцию f_rsadecry
(@S nvarchar (4000),@key int,@p int,@q int)
Возвращает NVARCHAR (4000)
как
начинать
объявить @crypt varchar (8000)
set @crypt = ''
В то время как Лен (@S)> 0
начинать
объявить @leftchar bigint
Выберите @LeatHar = sum (data1)
В (выберите верхнюю часть корпуса (подстрока (слева (@S, 6), номер, 1)), когда «а» тогда 10
Когда «б» тогда 11
Когда 'c' тогда 12
Когда 'd' тогда 13
Когда «е» тогда 14
Когда «f» затем 15
else substring (слева (@s, 6), номер, 1)
End* Power (16, Len (слева (@S, 6)) - номер) data1
из (выберите номер из master.dbo.spt_values, где type = 'p') k
где число <= len (слева (@s, 6))
) L
объявить @k2 int, @j bigint
Выберите@k2 =@key/2,@j = 1
пока @k2> 0
начинать
SET@J = (CAST (POWER (@LEATHCHAR, 2) как BIGINT)*@J)%(@P*@Q)
Установить @k2 = @k2-1
конец
SET @J = (@LeatHar*@J)%(@P*@Q)
set@crypt =@crypt+nchar (@j)
Установить @S = материал ( @S, 1,6, '')
конец
вернуть @crypt
конец
【тест】
if object_id ('tb') не является нулевым
Стол сброса TB
идти
Создать таблицу TB (ID Int Identity (1,1), Col Varchar (100))
идти
Вставьте в значения TB (DBO.F_RSAENCRY («Китайский», 779,1163,59)))
Вставьте в значения TB (DBO.F_RSAENCRY («Китайский», 779,1163,59)))
Выберите * из туберкулеза
ID Col
1 00359B00E6E000EF5
2 01075300931B0010A4007EDC004B340074A6004B34
Выберите *, после расшифровки = dbo.f_rsadecry (col, 35039,1163,59)
от туберкулеза
ID Col после расшифровки
1 00359B00E6E000EF5 Китайский
2 01075300931B0010A4007EDC004B340074A6004B34 Китайский
1 0 0
(Пожалуйста, оцените статью)
-