在SQLSERVER中如何实现RSA加密算法
来源:优易学  2010-1-18 17:18:38   【优易学:中国教育考试门户网】   资料下载   IT书店

 

  begin
  declare @i bigint,@tmp varchar(10),@k2 int,@leftchar int
  select @leftchar=unicode(left(@s,1)),@k2=@key/2,@i=1
  while @k2>0
  begin
  set @i=(cast(power(@leftchar,2) as bigint)*@i)%(@p*@q)
  set @k2=@k2-1
  end 
  set @i=(@leftchar*@i)%(@p*@q)
  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,6)
  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 nvarchar(4000),@key int ,@p int ,@q int)
  returns nvarchar(4000)
  as
  begin
  declare @crypt varchar(8000)
  set @crypt=’’
  while len(@s)>0

  begin
  declare @leftchar bigint
  select @leftchar=sum(data1)
  from ( select case upper(substring(left(@s,6), 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,6), number, 1)
  end* power(16, len(left(@s,6)) - number) data1 
  from (select number from master.dbo.spt_values where type=’p’)K
  where number <= len(left(@s,6))
  ) L
  declare @k2 int,@j bigint
  select @k2=@key/2,@j=1
  while @k2>0
  begin
  set @j=(cast(power(@leftchar,2)as bigint)*@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
  【测试】
  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(’中国人’,779,1163,59))
  insert into tb values(dbo.f_RSAEncry(’Chinese’,779,1163,59))
  select * from tb
  id col
  1 00359B00E6E000EAF5
  2 01075300931B0010A4007EDC004B340074A6004B34
  select * ,解密后=dbo.f_RSADecry(col,35039,1163,59)
  from tb
  id col解密后
  1 00359B00E6E000EAF5中国人
  2 01075300931B0010A4007EDC004B340074A6004B34 Chinese

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
热门课程培训