`
yiyeqinghuasoon
  • 浏览: 644210 次
文章分类
社区版块
存档分类
最新评论

【叶子函数分享五十一】在SQL SERVER中实现RSA加解密函数(第一版)

 
阅读更多

/***************************************************

作者:herowang(让你望见影子的墙)

日期:2010.1.1

注: 转载请保留此信息

更多内容,请访问我的博客:blog.csdn.net/herowang

****************************************************/

一、RSA算法原理

RSA算法非常简单,概述如下:

找两素数pq

n=p*q

t=(p-1)*(q-1)

取任何一个数e,要求满足e<t并且et互素(就是最大公因数为)

d*e%t==1

这样最终得到三个数:n d e

设消息为数M (M <n)

c=(M**d)%n就得到了加密后的消息c

m=(c**e)%nm == M,从而完成对c的解密。

注:**表示次方,上面两式中的de可以互换。

在对称加密中:

n d两个数构成公钥,可以告诉别人;

n e两个数构成私钥,e自己保留,不让任何人知道。

给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。

别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法求得d

以上内容出自原文出处http://www.xfocus.net/articles/200503/778.html

二、使用T-SQL实现RSA算法

--判断是否为素数

if object_id('f_pnumtest') is not null

drop function f_isPrimeNum

go

create function [dbo].[f_isPrimeNum]

(@p int)

returns bit

begin

declare @flg bit,@i int

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

--判断两个数是否互素,首先要选取两个互素的数

if object_id('f_isNumsPrime') is not null

drop function f_isNumsPrime

go

create function f_isNumsPrime

(@num1 int,@num2 int)

returns bit

begin

declare @tmp int,@flg bit

set @flg=1

while (@num2%@num1<>0)

begin

select @tmp=@num1,@num1=@num2%@num1,@num2=@tmp

end

if @num1=1

set @flg=0

return @flg

end

--产生密钥对

if object_id('p_createKey1') is not null

drop proc p_createKey1

go

create proc p_createKey1

@p int,@q int

as

begin

declare @n bigint,@t bigint,@flag int,@d int

if dbo.f_pnumtest(@p)=0

begin

print cast(@p as varchar)+'不是素数,请重新选择数据'

return

end

if dbo.f_pnumtest(@q)=0

begin

print cast(@q as varchar)+'不是素数,请重新选择数据'

return

end

print '请从下列数据中选择其中一对,作为密钥'

select @n=@p*@q,@t=(@p-1)*(@q-1)

declare @e int

set @e=2

while @e<@t

begin

if dbo.f_isNUmsPrime(@e,@t)=0

begin

set @d=2

while @d<@n

begin

if(@e*@d%@t=1)

print cast(@e as varchar)+space(5)+cast(@d as varchar)

set @d=@d+1

end

end

set @e=@e+1

end

end

/*加密函数说明,@key 为上一个存储过程中选择的密码中的一个,@p ,@q 产生密钥对时选择的两个数。获取每一个字符的ascii值,然后进行加密,产生个字节的位数据*/

if object_id('f_RSAEncry') is not null

drop function f_RSAEncry

go

create function f_RSAEncry

(@s varchar(100),@key int ,@p int ,@q int)

returns varchar(8000)

as

begin

declare @crypt varchar(8000)

set @crypt=''

while len(@s)>0

begin

declare @i int,@tmp varchar(10),@k2 int,@leftchar int

select @leftchar=ascii(left(@s,1)),@k2=@key,@i=1

while @k2>0

begin

set @i=(@leftchar*@i)%(@p*@q)

set @k2=@k2-1

end

set @tmp=''

select @tmp=case when @i%16 between 10 and 15 then char( @i%16+55) else cast(@i%16 as varchar) end +@tmp,@i=@i/16

from (select number from master.dbo.spt_values where type='p' and number<10 )K

order by number desc

set @crypt=@crypt+right(@tmp,4)

set @s=stuff(@s,1,1,'')

end

return @crypt

end

--解密:@key 为一个存储过程中选择的密码对中另一个数字,@p ,@q 产生密钥对时选择的两个数

if object_id('f_RSADecry') is not null

drop function f_RSADecry

go

create function f_RSADecry

(@s varchar(100),@key int ,@p int ,@q int)

returns varchar(8000)

as

begin

declare @crypt varchar(8000)

set @crypt=''

while len(@s)>0

begin

declare @i int

select @i=sum(data1)

from ( select case upper(substring(left(@s,4), number, 1)) when 'A' then 10

when 'B' then 11

when 'C' then 12

when 'D' then 13

when 'E' then 14

when 'F' then 15

else substring(left(@s,4), number, 1)

end* power(16, len(left(@s,4)) - number) data1

from (select number from master.dbo.spt_values where type='p')K

where number <= len(left(@s,4))

) L

declare @k2 int,@j int

select @k2=@key,@j=1

while @k2>0

begin

set @j=(@i*@j)%(@p*@q)

set @k2=@k2-1

end

set @crypt=@crypt+char(@j)

set @s=stuff(@s,1,4,'')

end

return @crypt

end

三、在SQL SERVER中的使用

--【测试】

if object_id('tb') is not null

drop table tb

go

create table tb(id int identity(1,1),col varchar(100))

go

insert into tb values(dbo.f_RSAEncry('RSA',63,47,59))

select * from tb

--运行结果:

/*

id col

----------- ------------

1 069505EE02F3

*/

select id,col=dbo.f_RSADecry(col,847,47,59) from tb

--运行结果:

/*

id col

----------- -----------

1 RSA

*/

四、目前版本函数的缺点

1、目前只能对ascii符号进行加密,对unicode尚不支持。

2、在选取的素数都比较小,所以密钥空间比较小,而实际应用中选取的素数都会非常的大,不容易破解。但是对于一些基础的加密还能够使用。

3、如果一次加密觉得安全性不够的话,可以进行重复加密(即进行多次加密),两次的密钥最好不相同。

例如:insert into tb values(dbo.f_RSAEncry(dbo.f_RSAEncry('RSA',63,47,59),23,11,17))

那么解密的时候,按照加密的逆序进行解密:

select id,col=dbo.f_RSADecry(dbo.f_RSADecry(col,7,11,17),847,47,59)

from tb

4、如果选取的数字比较大,那么在进行加密的时候,生成的进制密文最好使用个字节或者更多。

分享到:
评论

相关推荐

    SQLSERVER加密解密函数(非对称密钥 证书加密 对称密钥)使用方法代码

    主要介绍了SQLSERVER加密解密函数使用方法,使用了非对称密钥、证书加密、对称密钥、通行短语(PassPhrase)加密,大家参考使用吧

    完全掌握加密解密实战超级手册.zip02

    41314.5.3 实现WinRAR自加密 41314.5.4 解除RAR文件密码 41414.6 加密解密EXE文件 41514.6.1 用ASPack加密EXE文件 41514.6.2 用tElock加密EXE文件 41714.6.3 为EXE文件加口令 41914.7 解密MS SQL Server保护 ...

    完全掌握加密解密实战超级手册.z01

    41314.5.3 实现WinRAR自加密 41314.5.4 解除RAR文件密码 41414.6 加密解密EXE文件 41514.6.1 用ASPack加密EXE文件 41514.6.2 用tElock加密EXE文件 41714.6.3 为EXE文件加口令 41914.7 解密MS SQL Server保护 ...

    加密函数(AES、DES、MD5)动态链接库

    该动态链接库提供Encrypt和DataContol接口,切每个加密和解密函数都可以进行重写。其中还提供ODBC、OLEDB、SQL数据库操作函数。加密方式主要与MD5、AES、DES集中加密方式,不过只能对字符串进行加密,后期将提供对...

    MyFll Microsoft Visual FoxPro设计的扩展库

    版本信息:由于不定期更新,请及时核对版本(右键属性),版本为X.X.X.X,第一位为主版本号,第二位为函数个数,第三位为发布的年份,第四位为日期。当前版本为:1.179.9.811 版权:你可以自由使用、散发此函数库及...

    pb扩充函数

    1.支持RSA加解密及验签 2.支持条码一维和二维条码 3.支持XML构建及解析 4.支持JSON检构及解析 5.支持FTP操作 6.支持SQL解析 7.支持PB菜单美观 8.支持list 9.支持map 10.支持vector对象 11.支持HTTP请求REST...

    mysql双向加密解密方式用法详解

    如果你使用的正是mysql数据库,那么你把密码或者其他敏感...在这里,一段数据通过一个密钥被加密,只能够由知道这个密钥的人来解密。MySQL有两个函数来支持这种类型的加密,分别叫做ENCODE()和DECODE()。下面是一个简

    java源码包---java 源码 大量 实例

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java源码包2

    第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时...

    asp.net知识库

    在 SQL Server 2005 中使用表值函数来实现空间数据库 SQL Server 2005的30个最重要特点 同时安装sql2000和sql2005的经验 类如何与界面绑定 在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 使用Relations建立...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java源码包3

    第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时...

    java源码包4

    第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时...

    JAVA上百实例源码以及开源项目

    第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...

    基于Python的二手房数据分析项目(前后端源码+数据库+文档).zip(高分优质项目)

    CAS单点登录机制使用RSA2和RSA进行数据加密和解密。 - utils:工具包,包含一些实用的函数,如从UA池中获取随机的User-Agent,和操作数据库的方法等。 - spider.py:爬虫主文件,根据城市和地区爬取相应的数据,并将...

Global site tag (gtag.js) - Google Analytics