仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 966|回复: 7
打印 上一主题 下一主题

[学习教程] 公布在SQL SERVER中完成RSA加密算法

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 20:10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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并不是市场上最年轻的数据库,但是却有更多成熟的数据库可供我们选择。
蒙在股里 该用户已被删除
沙发
发表于 2015-1-18 05:42:53 来自手机 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
深爱那片海 该用户已被删除
板凳
发表于 2015-1-21 12:29:14 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
地板
发表于 2015-1-30 18:18:44 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-6 14:52:30 | 只看该作者
现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.
冷月葬花魂 该用户已被删除
6#
发表于 2015-3-5 08:35:48 | 只看该作者
代替了原来VB式的错误判断。比Oracle高级不少。
精灵巫婆 该用户已被删除
7#
发表于 2015-3-12 02:15:15 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
爱飞 该用户已被删除
8#
发表于 2015-3-19 17:36:44 | 只看该作者
备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 01:44

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表