-
/*이 수정으로 유니코드 지원이 추가되었지만 암호화 후에도 여전히 16진수 데이터로 표시됩니다. RSA 암호화 후 얻은 유니코드 인코딩을 표시할 수 없기 때문에 암호문은 여전히 16진수 데이터로 표시됩니다.
특별한 주의가 필요합니다. 중국어를 암호화하려면 선택한 두 소수의 점수가 유니코드의 최대 인코딩 값보다 큰 65536보다 커야 합니다.
*/
SQL SERVER(Second Edition)에서 RSA 암호화 알고리즘 구현
-- 소수인지 판단
object_id('f_primeNumTest')가 null이 아닌 경우
드롭 함수 f_primeNumTest
가다
함수 [dbo].[f_primeNumTest] 생성
(@p 정수)
비트를 반환
시작하다
@flg 비트,@i int 선언
@flg=1, @i=2를 선택하세요.
@i<sqrt(@p) 동안
시작하다
if(@p%@i=0 )
시작하다
@flg=0으로 설정
부서지다
끝
@i=@i+1로 설정
끝
@flg 반환
끝
가다
-- 두 숫자가 상대적으로 소수인지 확인
object_id('f_isNumsPrime')가 null이 아닌 경우
드롭 함수 f_isNumsPrime
가다
f_isNumsPrime 함수 생성
(@num1 정수,@num2 정수)
비트를 반환
시작하다
@tmp int,@flg 비트 선언
@flg=1로 설정
동안(@num2%@num1<>0)
시작하다
@tmp=@num1,@num1=@num2%@num1,@num2=@tmp를 선택하세요.
끝
@num1=1인 경우
@flg=0으로 설정
@flg 반환
끝
가다
--키 쌍 생성
object_id('p_createKey')가 null이 아닌 경우
프로세스 p_createKey 삭제
가다
proc p_createKey 생성
@p 정수,@q 정수
~처럼
시작하다
@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 동안
시작하다
if(@e*@d%@t=1)
인쇄 캐스트(@e를 varchar로)+space(5)+cast(@d를 varchar로)
@d=@d+1로 설정
끝
끝
@e=@e+1로 설정
끝
끝
/*암호화 함수 설명, @key는 이전 저장 프로시저에서 선택한 비밀번호 중 하나이고, @p, @q는 키 쌍 생성 시 선택한 두 개의 숫자입니다. 각 문자의 유니코드 값을 가져온 다음 암호화하여 3바이트의 16비트 데이터를 생성합니다*/
object_id('f_RSAEncry')가 null이 아닌 경우
드롭 함수 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) else Cast(@i%16 as varchar) end +@tmp,@i=@i/16
from (master.dbo.spt_values에서 유형이 'p'이고 숫자가 <10인 경우)에서 숫자 선택)K
번호순으로 주문
@crypt=@crypt+right(@tmp,6) 설정
@s=stuff(@s,1,1,'') 설정
끝
@crypt 반환
끝
--복호화: @key는 저장 프로시저에서 선택한 비밀번호 쌍의 또 다른 숫자입니다. @p, @q는 키 쌍을 생성할 때 선택한 두 숫자입니다.
object_id('f_RSADecry')가 null이 아닌 경우
드롭 함수 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)을 선택하세요.
from ( 케이스 선택 upper(substring(left(@s,6), number, 1)) 'A'인 경우 10
'B'이면 11
'C'이면 12
'D'이면 13
'E'이면 14
'F'이면 15
else 하위 문자열(왼쪽(@s,6), 숫자, 1)
end* power(16, len(left(@s,6)) - 숫자) data1
from(master.dbo.spt_values에서 번호 선택, 여기서 유형='p')K
여기서 숫자 <= len(left(@s,6))
) 엘
@k2 int,@j bigint 선언
@k2=@key/2,@j=1을 선택하세요.
@k2>0 동안
시작하다
@j=(cast(power(@leftchar,2)를 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')가 null이 아닌 경우
드롭 테이블 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에서 *를 선택하세요
ID 열
1 00359B00E6E000EAF5
2 01075300931B0010A4007EDC004B340074A6004B34
*를 선택하고, decryption=dbo.f_RSADecry(col,35039,1163,59) 후
결핵에서
복호화 후 ID 열
1 00359B00E6E000EAF5 중국어
2 01075300931B0010A4007EDC004B340074A6004B34 중국어
1 0 0
(기사를 평가해주세요)
-