-
/* يضيف هذا التعديل دعم Unicode، ولكن لا يزال يتم عرضه كبيانات سداسية عشرية بعد التشفير نظرًا لأنه لا يمكن عرض ترميز Unicode الذي تم الحصول عليه بعد تشفير RSA، فسيظل النص المشفر معروضًا في البيانات السداسية العشرية.
هناك حاجة إلى اهتمام خاص: إذا كنت تريد تشفير اللغة الصينية، فيجب أن يكون الرقمان الأوليان المحددان أكبر من 65536، وهو أكبر من الحد الأقصى لقيمة الترميز Unicode.
*/
تنفيذ خوارزمية تشفير RSA في SQL SERVER (الإصدار الثاني)
-تحديد ما إذا كان عددا أوليا
إذا لم تكن قيمة object_id('f_primeNumTest') فارغة
دالة الإسقاط f_primeNumTest
يذهب
إنشاء وظيفة [dbo].[f_primeNumTest]
(@p إنت)
يعود قليلا
يبدأ
أعلن @flg بت،@i int
حدد @flg=1، @i=2
بينما @i<sqrt(@p)
يبدأ
إذا (@p%@i=0 )
يبدأ
تعيين @flg=0
استراحة
نهاية
اضبط @i=@i+1
نهاية
العودة @flg
نهاية
يذهب
- تحديد ما إذا كان العددان أوليان نسبياً
إذا لم تكن قيمة object_id('f_isNumsPrime') فارغة
دالة الإسقاط f_isNumsPrime
يذهب
إنشاء وظيفة f_isNumsPrime
(@num1 int،@num2 int)
يعود قليلا
يبدأ
أعلن @tmp int,@flg bit
تعيين @flg=1
بينما (@num2%@num1<>0)
يبدأ
حدد @tmp=@num1,@num1=@num2%@num1,@num2=@tmp
نهاية
إذا @num1=1
تعيين @flg=0
العودة @flg
نهاية
يذهب
- إنشاء زوج المفاتيح
إذا لم يكن object_id('p_createKey') فارغًا
إسقاط proc p_createKey
يذهب
إنشاء proc p_createKey
@p int,@q int
مثل
يبدأ
أعلن @n bigint،@t bigint،@flag int،@d int
إذا كان dbo.f_primeNumTest(@p)=0
يبدأ
طباعة cast(@p as varchar)+"ليس رقمًا أوليًا، يرجى إعادة تحديد البيانات"
يعود
نهاية
إذا كان dbo.f_primeNumTest(@q)=0
يبدأ
طباعة cast(@q as varchar)+"ليس رقمًا أوليًا، يرجى إعادة تحديد البيانات"
يعود
نهاية
طباعة "يرجى اختيار زوج واحد من البيانات التالية كمفتاح"
حدد @n=@p*@q,@t=(@p-1)*(@q-1)
أعلن @e int
تعيين @e=2
بينما @e<@t
يبدأ
إذا dbo.f_isNumsPrime(@e,@t)=0
يبدأ
تعيين @ د = 2
بينما @d<@n
يبدأ
إذا (@e*@d%@t=1)
طباعة cast(@e as varchar)+space(5)+cast(@d as varchar)
اضبط @d=@d+1
نهاية
نهاية
اضبط @e=@e+1
نهاية
نهاية
/*وصف وظيفة التشفير، @key هي إحدى كلمات المرور المحددة في الإجراء المخزن السابق، @p، @q هما الرقمان المحددان عند إنشاء زوج المفاتيح. احصل على قيمة Unicode لكل حرف ثم قم بتشفيرها لإنشاء 3 بايت من بيانات 16 بت*/
إذا لم تكن object_id('f_RSAEncry') فارغة
وظيفة الإسقاط f_RSAEncry
يذهب
إنشاء وظيفة f_RSAEncry
(@s varchar(100)،@key int،@p int،@q int)
إرجاع nvarchar(4000)
مثل
يبدأ
أعلن @crypt varchar(8000)
تعيين @crypt=''
بينما لين(@s)>0
يبدأ
أعلن @i bigint،@tmp varchar(10)،@k2 int،@leftchar int
حدد @leftchar=unicode(left(@s,1)),@k2=@key/2,@i=1
بينما @k2>0
يبدأ
اضبط @i=(cast(power(@leftchar,2) كـ bigint)*@i)%(@p*@q)
تعيين @k2=@k2-1
نهاية
تعيين @i=(@leftchar*@i)%(@p*@q)
تعيين@tmp=''
حدد @tmp=case عندما يكون @i%16 بين 10 و15 ثم char( @i%16+55) else cast(@i%16 as varchar) end +@tmp,@i=@i/16
من (اختر رقمًا من master.dbo.spt_values حيث النوع='p' والرقم<10)K
الترتيب حسب الرقم تنازلي
تعيين @crypt=@crypt+right(@tmp,6)
تعيين @s=الأشياء(@s,1,1,'')
نهاية
العودة @crypt
نهاية
--فك التشفير: @key هو رقم آخر في زوج كلمة المرور المحدد في إجراء مخزن، @p و@q هما الرقمان المحددان عند إنشاء زوج المفاتيح
إذا لم يكن object_id('f_RSADecry') فارغًا
وظيفة الإسقاط f_RSADecry
يذهب
إنشاء وظيفة f_RSADecry
(@s nvarchar(4000)،@key int،@p int،@q int)
إرجاع nvarchar(4000)
مثل
يبدأ
أعلن @crypt varchar(8000)
تعيين @crypt=''
بينما لين(@s)>0
يبدأ
أعلن @leftchar bigint
حددleftchar=sum(data1)
من ( حدد الحالة العلوية(substring(left(@s,6), number, 1)) عندما يكون "A" ثم 10
عندما "ب" ثم 11
عندما "C" ثم 12
عندما "د" ثم 13
عندما يكون "E" ثم 14
عندما "F" ثم 15
سلسلة فرعية أخرى (يسار (@s،6)، رقم، 1)
end* power(16, len(left(@s,6)) - number) data1
من (اختر رقمًا من master.dbo.spt_values حيث النوع='p')K
حيث الرقم <= لين(يسار(@s,6))
) ل
أعلن @k2 int,@j bigint
حدد @k2=@key/2,@j=1
بينما @k2>0
يبدأ
اضبط @j=(cast(power(@leftchar,2)as bigint)*@j)%(@p*@q)
تعيين @k2=@k2-1
نهاية
تعيين @j=(@leftchar*@j)%(@p*@q)
تعيين @crypt=@crypt+nchar(@j)
تعيين @s=الأشياء(@s,1,6,'')
نهاية
العودة @crypt
نهاية
【امتحان】
إذا لم يكن object_id('tb') فارغًا
إسقاط الجدول السل
يذهب
إنشاء جدول جدول (معرف هوية int(1,1)،col varchar(100))
يذهب
أدخل في قيم السل (dbo.f_RSAEncry('Chinese',779,1163,59))
أدخل في قيم السل (dbo.f_RSAEncry('Chinese',779,1163,59))
حدد * من السل
رقم التعريف
1 00359B00E6E000EAF5
2 01075300931B0010A4007EDC004B340074A6004B34
حدد *، بعد فك التشفير=dbo.f_RSADecry(col,35039,1163,59)
من السل
معرف العمود بعد فك التشفير
1 00359B00E6E000EAF5 الصينية
2 01075300931B0010A4007EDC004B340074A6004B34 الصينية
1 0 0
(يرجى تقييم المقال)
-