-
/*การแก้ไขนี้เพิ่มการรองรับ Unicode แต่ยังคงแสดงเป็นข้อมูลเลขฐานสิบหกหลังจากการเข้ารหัส เนื่องจากไม่สามารถแสดงการเข้ารหัส Unicode ที่ได้รับหลังจากการเข้ารหัส RSA ได้ ข้อความไซเฟอร์เท็กซ์จึงยังคงแสดงเป็นข้อมูลเลขฐานสิบหก
ต้องให้ความสนใจเป็นพิเศษ: หากคุณต้องการเข้ารหัสภาษาจีน จำนวนเฉพาะสองตัวที่เลือกจะต้องมีมากกว่า คะแนนของจำนวนเฉพาะสองตัวควรมากกว่า 65536 ซึ่งมากกว่าค่าการเข้ารหัสสูงสุดของ Unicode
-
การใช้อัลกอริทึมการเข้ารหัส RSA ใน SQL SERVER (ฉบับที่สอง)
-- พิจารณาว่าเป็นจำนวนเฉพาะหรือไม่
ถ้า object_id('f_primeNumTest') ไม่เป็นโมฆะ
วางฟังก์ชัน f_primeNumTest
ไป
สร้างฟังก์ชัน [dbo].[f_primeNumTest]
(@พีอินท์)
ส่งคืนบิต
เริ่ม
ประกาศ @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อินท์,@num2อินท์)
ส่งคืนบิต
เริ่ม
ประกาศ @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
เริ่ม
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
เริ่ม
ถ้า(@e*@d%@t=1)
พิมพ์หล่อ(@e as varchar)+space(5)+cast(@d as varchar)
ตั้ง @d=@d+1
จบ
จบ
ตั้ง @e=@e+1
จบ
จบ
/*คำอธิบายฟังก์ชันการเข้ารหัส @key คือหนึ่งในรหัสผ่านที่เลือกในขั้นตอนการจัดเก็บก่อนหน้า @p, @q คือตัวเลขสองตัวที่เลือกเมื่อสร้างคู่คีย์ รับค่ายูนิโค้ดของอักขระแต่ละตัว จากนั้นเข้ารหัสเพื่อสร้างข้อมูล 16 บิตขนาด 3 ไบต์*/
ถ้า object_id('f_RSAEncry') ไม่เป็นโมฆะ
วางฟังก์ชัน f_RSAEncry
ไป
สร้างฟังก์ชัน f_RSAEncry
(@s varchar(100),@key int,@p int,@q int)
ส่งคืน nvarchar (4000)
เช่น
เริ่ม
ประกาศ @crypt varchar (8000)
ตั้ง @crypt=''
ในขณะที่ len(@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) อย่างอื่นส่ง(@i%16 as varchar) end +@tmp,@i=@i/16
จาก (เลือกหมายเลขจาก master.dbo.spt_values โดยที่ type='p' และหมายเลข<10 )K
เรียงลำดับตามหมายเลข
ตั้งค่า @crypt=@crypt+right(@tmp,6)
ตั้ง @s=stuff(@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=''
ในขณะที่ len(@s)>0
เริ่ม
ประกาศ @leftchar bigint
เลือก @leftchar=sum(data1)
จาก ( เลือกตัวพิมพ์เล็กด้านบน(สตริงย่อย(ซ้าย(@s,6), หมายเลข, 1)) เมื่อ 'A' แล้ว 10
เมื่อ 'B' แล้ว 11
เมื่อ 'C' แล้ว 12
เมื่อ 'D' แล้ว 13
เมื่อ 'E' จากนั้น 14
เมื่อ 'F' แล้ว 15
สตริงย่อยอื่น (ซ้าย(@s,6), หมายเลข, 1)
end* power(16, len(left(@s,6)) - number) data1
จาก (เลือกหมายเลขจาก master.dbo.spt_values โดยที่ type='p')K
โดยที่หมายเลข <= len(ซ้าย(@s,6))
) ล
ประกาศ @k2 int,@j bigint
เลือก @k2=@key/2,@j=1
ในขณะที่ @k2>0
เริ่ม
set @j=(cast(power(@leftchar,2)as bigint)*@j)%(@p*@q)
ตั้ง @k2=@k2-1
จบ
ตั้ง @j=(@leftchar*@j)%(@p*@q)
ตั้ง @crypt=@crypt+nchar(@j)
ตั้ง @s=stuff(@s,1,6,'')
จบ
กลับ @crypt
จบ
【ทดสอบ】
ถ้า 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))
เลือก * จาก tb
หมายเลขประจำตัวประชาชน
1 00359B00E6E000EAF5
2 01075300931B0010A4007EDC004B340074A6004B34
เลือก * หลังจากถอดรหัส=dbo.f_RSADecry(col,35039,1163,59)
จากวัณโรค
id col หลังจากการถอดรหัส
1 00359B00E6E000EAF5 จีน
2 01075300931B0010A4007EDC004B340074A6004B34 จีน
1 0 0
(กรุณาให้คะแนนบทความ)
-