|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQL的低成本来自于其简单性吗?它的普及性是由于其低成本吗?其实,在MySQL的最“好”与最“不好”的功能之间没有明显的分界线,但它们组合在一起就形成了一副让我们欣赏的作品。/*本次修正增添了unicode的撑持,可是加密后仍然显现为16进制数据,由于举行RSA加密后所失掉的unicode编码是没法显现的,以是密文仍然接纳16进制数据显现。
必要出格注重:假如要对中文举行加密,那末所拔取的两个素数要对照年夜,两个素数的成就最好要年夜于65536,即年夜于unicode的最年夜编码值
*/
在SQLSERVER中完成RSA加密算法(第二版)
--判别是不是为素数
ifobject_id(f_PRimeNumTest)isnotnull
dropfunctionf_primeNumTest
go
createfunction[dbo].[f_primeNumTest]
(@pint)
returnsbit
begin
declare@flgbit,@iint
select@flg=1,@i=2
while@i<sqrt(@p)
begin
if(@p%@i=0)
begin
set@flg=0
break
end
set@i=@i+1
end
return@flg
end
go
--判别两个数是不是互素
ifobject_id(f_isNumsPrime)isnotnull
dropfunctionf_isNumsPrime
go
createfunctionf_isNumsPrime
(@num1int,@num2int)
returnsbit
begin
declare@tmpint,@flgbit
set@flg=1
while(@num2%@num10)
begin
select@tmp=@num1,@num1=@num2%@num1,@num2=@tmp
end
if@num1=1
set@flg=0
return@flg
end
go
--发生密钥对
ifobject_id(p_createKey)isnotnull
dropprocp_createKey
go
createprocp_createKey
@pint,@qint
as
begin
declare@nbigint,@tbigint,@flagint,@dint
ifdbo.f_primeNumTest(@p)=0
begin
printcast(@pasvarchar)+不是素数,请从头选择数据
return
end
ifdbo.f_primeNumTest(@q)=0
begin
printcast(@qasvarchar)+不是素数,请从头选择数据
return
end
print请从以下数据当选择个中一对,作为密钥
select@n=@p*@q,@t=(@p-1)*(@q-1)
declare@eint
set@e=2
while@e<@t
begin
ifdbo.f_isNumsPrime(@e,@t)=0
begin
set@d=2
while@d<@n
begin
if(@e*@d%@t=1)
printcast(@easvarchar)+space(5)+cast(@dasvarchar)
set@d=@d+1
end
end
set@e=@e+1
end
end
/*加密函数申明,@key为上一个存储历程当选择的暗码中的一个,@p,@q发生密钥对时选择的两个数。猎取每个字符的unicode值,然落后行加密,发生3个字节的16位数据*/
ifobject_id(f_RSAEncry)isnotnull
dropfunctionf_RSAEncry
go
createfunctionf_RSAEncry
(@svarchar(100),@keyint,@pint,@qint)
returnsnvarchar(4000)
as
begin
declare@cryptvarchar(8000)
set@crypt=
whilelen(@s)>0
begin
declare@ibigint,@tmpvarchar(10),@k2int,@leftcharint
select@leftchar=unicode(left(@s,1)),@k2=@key/2,@i=1
while@k2>0
begin
set@i=(cast(power(@leftchar,2)asbigint)*@i)%(@p*@q)
set@k2=@k2-1
end
set@i=(@leftchar*@i)%(@p*@q)
set@tmp=
select@tmp=casewhen@i%16between10and15thenchar(@i%16+55)elsecast(@i%16asvarchar)end+@tmp,@i=@i/16
from(selectnumberfrommaster.dbo.spt_valueswheretype=pandnumber<10)K
orderbynumberdesc
set@crypt=@crypt+right(@tmp,6)
set@s=stuff(@s,1,1,)
end
return@crypt
end
--解密:@key为一个存储过程当中选择的暗码对中另外一个数字,@p,@q发生密钥对时选择的两个数
ifobject_id(f_RSADecry)isnotnull
dropfunctionf_RSADecry
go
createfunctionf_RSADecry
(@snvarchar(4000),@keyint,@pint,@qint)
returnsnvarchar(4000)
as
begin
declare@cryptvarchar(8000)
set@crypt=
whilelen(@s)>0
begin
declare@leftcharbigint
select@leftchar=sum(data1)
from(selectcaseupper(substring(left(@s,6),number,1))whenAthen10
whenBthen11
whenCthen12
whenDthen13
whenEthen14
whenFthen15
elsesubstring(left(@s,6),number,1)
end*power(16,len(left(@s,6))-number)data1
from(selectnumberfrommaster.dbo.spt_valueswheretype=p)K
wherenumber<=len(left(@s,6))
)L
declare@k2int,@jbigint
select@k2=@key/2,@j=1
while@k2>0
begin
set@j=(cast(power(@leftchar,2)asbigint)*@j)%(@p*@q)
set@k2=@k2-1
end
set@j=(@leftchar*@j)%(@p*@q)
set@crypt=@crypt+nchar(@j)
set@s=stuff(@s,1,6,)
end
return@crypt
end
【测试】
ifobject_id(tb)isnotnull
droptabletb
go
createtabletb(idintidentity(1,1),colvarchar(100))
go
insertintotbvalues(dbo.f_RSAEncry(中国人,779,1163,59))
insertintotbvalues(dbo.f_RSAEncry(Chinese,779,1163,59))
select*fromtb
idcol
100359B00E6E000EAF5
201075300931B0010A4007EDC004B340074A6004B34
select*,解密后=dbo.f_RSADecry(col,35039,1163,59)
fromtb
idcol解密后
100359B00E6E000EAF5中国人
201075300931B0010A4007EDC004B340074A6004B34Chinese
100
(请您对文章做出评价)那时候Sybase已经诞生了6年的时间。至于其他值得关注的开源数据库,PostgreSQL将在2009年达到20岁的生日。虽然MySQL并不是市场上最年轻的数据库,但是却有更多成熟的数据库可供我们选择。 |
|