-
/*この変更により Unicode サポートが追加されますが、暗号化後も 16 進数データとして表示されます。 RSA 暗号化後に取得された Unicode エンコーディングは表示できないため、暗号文は 16 進数データで表示されます。
特別な注意が必要です。中国語を暗号化する場合、選択する 2 つの素数のスコアは、Unicode の最大エンコード値よりも大きい 65536 より大きいことが望ましいです。
*/
SQL SERVER での RSA 暗号化アルゴリズムの実装 (第 2 版)
-- 素数かどうかを判定します
object_id('f_primeNumTest') が null でない場合
ドロップ関数 f_primeNumTest
行く
関数 [dbo].[f_primeNumTest] を作成します
(@p int)
ビットを返します
始める
@flg bit,@i intを宣言
@flg=1、@i=2を選択
while @i<sqrt(@p)
始める
if(@p%@i=0 )
始める
@flg=0 を設定します
壊す
終わり
@i=@i+1 を設定します
終わり
@flg を返す
終わり
行く
-- 2 つの数値が互いに素であるかどうかを判断します。
object_id('f_isNumsPrime') が null でない場合
ドロップ関数 f_isNumsPrime
行く
関数 f_isNumsPrime を作成する
(@num1 int,@num2 int)
ビットを返します
始める
@tmp int,@flg bit を宣言
@flg=1 を設定します
while (@num2%@num1<>0)
始める
select @tmp=@num1,@num1=@num2%@num1,@num2=@tmp
終わり
@num1=1 の場合
@flg=0 を設定します
@flg を返す
終わり
行く
-- キーペアの生成
object_id('p_createKey') が null でない場合
ドロッププロシージャ p_createKey
行く
プロシージャ p_createKey を作成します
@p int、@q int
として
始める
@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)+'素数ではありません。データを選択し直してください'
戻る
終わり
print 'キーとして次のデータから 1 つのペアを選択してください'
select @n=@p*@q,@t=(@p-1)*(@q-1)
@e int を宣言する
@e=2 を設定します
@e<@t の間
始める
if dbo.f_isNumsPrime(@e,@t)=0
始める
@d=2 を設定します
@d<@n の間
始める
if(@e*@d%@t=1)
print Cast(@e as varchar)+space(5)+cast(@d as varchar)
@d=@d+1 を設定します
終わり
終わり
@e=@e+1 を設定します
終わり
終わり
/*暗号化関数の説明。@key は前のストアド プロシージャで選択されたパスワードの 1 つです。@p、@q はキー ペアの生成時に選択された 2 つの数字です。各文字の Unicode 値を取得し、それを暗号化して 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='' を設定します
while len(@s)>0
始める
@i bigint、@tmp varchar(10)、@k2 int、@leftchar int を宣言します
select @leftchar=unicode(left(@s,1)),@k2=@key/2,@i=1
@k2>0 の間
始める
set @i=(cast(power(@leftchar,2) as bigint)*@i)%(@p*@q)
@k2=@k2-1 を設定します
終わり
set @i=(@leftchar*@i)%(@p*@q)
@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 (master.dbo.spt_values から数値を選択、ここで type='p' および数値 <10 )K
番号による順序の説明
set @crypt=@crypt+right(@tmp,6)
set @s=stuff(@s,1,1,'')
終わり
@crypt を返す
終わり
--復号化: @key はストアド プロシージャで選択されたパスワード ペアの別の番号です。@p、@q はキー ペアの生成時に選択された 2 つの番号です。
object_id('f_RSADecry') が null でない場合
ドロップ関数 f_RSADecry
行く
関数 f_RSADecry を作成する
(@s nvarchar(4000),@key int,@p int,@q int)
nvarchar(4000) を返します
として
始める
@crypt varchar(8000) を宣言します
@crypt='' を設定します
while len(@s)>0
始める
@leftchar bigint を宣言します
select @leftchar=sum(data1)
from ( select case upper(substring(left(@s,6),number,1)) when 'A' then 10
「B」の場合は 11
「C」の場合は12
「D」の場合は 13
「E」の場合は 14
「F」の場合は 15
else 部分文字列(left(@s,6), 数値, 1)
end* power(16, len(left(@s,6)) - number) data1
from (type='p' の master.dbo.spt_values から番号を選択)K
ここで、数値 <= len(left(@s,6))
)L
@k2 int,@j bigint を宣言します
@k2=@key/2,@j=1 を選択します
@k2>0 の間
始める
set @j=(cast(power(@leftchar,2)as bigint)*@j)%(@p*@q)
@k2=@k2-1 を設定します
終わり
set @j=(@leftchar*@j)%(@p*@q)
set @crypt=@crypt+nchar(@j)
set @s=stuff(@s,1,6,'')
終わり
@crypt を返す
終わり
【テスト】
object_id('tb') が null でない場合
ドロップテーブルTB
行く
テーブル作成 tb(id intidentity(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
select *, after decryption=dbo.f_RSADecry(col,35039,1163,59)
TBから
復号化後の ID 列
1 00359B00E6E000EAF5 中国語
2 01075300931B0010A4007EDC004B340074A6004B34 中国語
1 0 0
(記事を評価してください)
-