數(shù)據(jù)庫(kù)分組加密算法—R加密算法

R加密算法綜合了RC5、RC6加密算法的優(yōu)點(diǎn)并保持小的分組,使之更適合用于對(duì)數(shù)據(jù)庫(kù)文件加密。安全性比RC5、DES高,密鑰長(zhǎng)度可變,能抵抗密鑰窮舉攻擊。R加密算法加解密速度快,可滿足數(shù)據(jù)庫(kù)加密的要求。

一、R加密算法

1、 R加密算法的參數(shù)和運(yùn)算

R加密算法是對(duì)字操作的,所有的基本運(yùn)算都是以字為基本信息單位。每個(gè)字為w比特,這里取w=32,它是可變的,例如也可以取w=64或16。R加密算法有2-字(64比特)的輸入(明文)和輸出(密文)分組大小。

R加密算法使用一個(gè)源自用戶提供的密鑰的擴(kuò)展密鑰表S表,S的大小依賴于輪數(shù)r:S有t=2(r+2)個(gè)字。

所用的參數(shù)如下:

w:字長(zhǎng)。每個(gè)字有u=(w/8)個(gè)8比特字節(jié)。w的標(biāo)準(zhǔn)值為32,容許取16,32,64。明文和密文分組都是2w比特長(zhǎng)。

r:輪數(shù)。相應(yīng)的擴(kuò)展密鑰表S含有t=2(r+2)個(gè)字。r的取值范圍為12,13,…,255。

除了w和r外,R算法的密鑰長(zhǎng)度可變,可由b和K指定:b:密鑰K的字節(jié)數(shù)。b的取值范圍為16,17,…,255。K:b字節(jié)密鑰:K[0],K[1],…,K[b-1]。

因此R加密算法一般記為R-w/r/b。

算法中涉及到的運(yùn)算有:

lg(x) ? ? ? ?x的以2為底的對(duì)數(shù)

a+b ? ? ? ? 兩個(gè)字模w2加

a-b ? ? ? 兩個(gè)字模w2減

a⊕b ? ? ? 兩個(gè)字比特對(duì)位模2加(異或)

a×b ? ? ? ? 兩個(gè)字模w2乘

a<<<b ? ? ? ?w比特字a循環(huán)左移b位

a>>>b ? ? ? ?w比特字a循環(huán)右移b位

2、R加密算法介紹

R加密算法的明文輸入包含2個(gè)字,記為A和B。

算法用到一個(gè)包含t=2(r+2)個(gè)字的擴(kuò)展密鑰表S[0,…,t-1],由用戶提供的密鑰K得到。算法由3部分組成:密鑰擴(kuò)展算法,加密算法和解密算法。

(1)密鑰擴(kuò)展

密鑰擴(kuò)展算法用到兩個(gè)字長(zhǎng)的二進(jìn)制常量,Pw和Qw:

數(shù)據(jù)庫(kù)加密分組加密算法—R加密算法

數(shù)據(jù)庫(kù)加密分組加密算法—R加密算法

其中,e=2.718281828459…(自然對(duì)數(shù)的底),φ=1.618033988749…(黃金分割率),Odd(x)為大于等于x的最小奇數(shù)。當(dāng)w=32時(shí):

P32=b7e15163

Q32=9e3779b9

將密鑰由字節(jié)轉(zhuǎn)化為字

將密鑰K[0,…,b-1](字節(jié))放入L[0,…,c-1](字)中,其中c=[b/u](≥b/u的最小整數(shù),u=w/8為一個(gè)字的字節(jié)數(shù))。沒(méi)有填充的部分為0。

for ? i=b-1down ?to ? ? 0do

L[i/u]=(L[i/u]&lt;&lt;&lt;8)+K[i];

初始化數(shù)組S

S[0]=wP;

for ?i ?=1 ?to ?t ?-1 ?do ?S[i]=S[i-1] +wQ;

與密鑰混合

i=j=0;

temp ?a=temp ?b=0;

do ?3*max(t,c)times:

temp ?a=S[i]=(S[i]+temp ?a+temp ? b)<<<3;

temp ?b=L[j]=(L[j]+temp ?a+temp ?b)<<<(temp ?a+temp ?b);

i=(i+1)mod(t);

j=(j+1)mod(c);

該密鑰擴(kuò)展函數(shù)有一定的單向性:從S很難得到K。

(2)加密算法

我們假設(shè)輸入分組放在兩個(gè)w比特寄存器A和B中。并且假設(shè)密鑰擴(kuò)展已經(jīng)執(zhí)行。R-w/r/b算法的加密過(guò)程如圖1所示。

下面是加密算法的偽代碼:

A=A+S[0];

B=B+S[1];

for ?i=1 to ?r ?do

temp ?b=B×(2B+1);

A=((A⊕B)<<<temp ?b)+S[2i];

temp ?a=A×(2A+1);

B=((B⊕A)<<<temp ?a)+S[2i+1];

A=A+S[2r+2];

B=B+S[2r+3];

輸出在寄存器A和B中。

(3)解密函數(shù)

解密函數(shù)與加密函數(shù)類似。

B=B-S[2r+3];

A=A-S[2r+2];

for ?i = r ?to ?1 ?do

temp ?a= A×(2A+1);

B=((B-S[2i+1])>>>temp ?a)⊕A;

temp ?b=B×(2B+1);

A=((A-S[2i])>>>temp ?b)⊕B;

B=B-S[1];

A=A-S[0];

二、R加密算法安全性分析

我們對(duì)R加密算法的安全性作了一定的分析,主要測(cè)試w=32的情況。

首先測(cè)試了輸入和輸出比特之間的相關(guān)性,發(fā)現(xiàn)當(dāng)輪數(shù)在4時(shí)輸入和輸出的單個(gè)比特間具有非常均勻的相關(guān)性。

其次分析了每個(gè)明文比特與可變循環(huán)移位個(gè)數(shù)之間的關(guān)系,就是看改變一個(gè)明文比特是否會(huì)引起循環(huán)移位個(gè)數(shù)的改變。發(fā)現(xiàn)到7輪時(shí)每個(gè)明文比特都會(huì)引起不同程度的循環(huán)移位個(gè)數(shù)的變化。

在實(shí)際使用中輪數(shù)一般應(yīng)大于等于這些簡(jiǎn)單測(cè)試中建議的輪數(shù)。建議用12輪或以上輪數(shù)。R算法中用到的變化的循環(huán)移位數(shù)可以抵抗差分攻擊和線性攻擊。

另外,R加密算法加解密速度快,對(duì)數(shù)據(jù)庫(kù)操作時(shí)延小,用戶基本上感覺(jué)不出來(lái)。

三、R加密算法在某“業(yè)務(wù)MIS”的數(shù)據(jù)庫(kù)加密系統(tǒng)中的應(yīng)用

除了采用身份驗(yàn)證、訪問(wèn)控制等安全機(jī)制外,開(kāi)發(fā)了用于該應(yīng)用系統(tǒng)的數(shù)據(jù)庫(kù)加密系統(tǒng)。本數(shù)據(jù)庫(kù)加密系統(tǒng)采用基于字段的加密方式,密文直接存儲(chǔ)在原數(shù)據(jù)表中,由于密文長(zhǎng)度可能會(huì)大于明文長(zhǎng)度,因此在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),需將加密字段的長(zhǎng)度設(shè)置大一些。為簡(jiǎn)化密鑰的管理和不影響數(shù)據(jù)庫(kù)操作的效率,密鑰的管理采用折衷的方法,每個(gè)記錄一個(gè)密鑰,因此在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)還需為每個(gè)表增加一存放密鑰的字段。

1、數(shù)據(jù)庫(kù)加密系統(tǒng)功能組成

數(shù)據(jù)庫(kù)加密系統(tǒng)主要分成兩部分:一個(gè)是加密字典表管理模塊;另一個(gè)是加解密處理模塊。

用戶對(duì)數(shù)據(jù)庫(kù)信息具體的加密要求記載在加密字典表中。加密字典管理模塊完成加密字典表的維護(hù)工作,提供了加密字典表維護(hù)、表加密、表解密等功能,它利用數(shù)據(jù)庫(kù)加解密處理模塊完成對(duì)已有數(shù)據(jù)的加密或解密處理。該模塊由系統(tǒng)管理員使用,普通用戶不必關(guān)心。

數(shù)據(jù)庫(kù)加解密處理模塊是數(shù)據(jù)庫(kù)加密系統(tǒng)的核心部分,負(fù)責(zé)完成數(shù)據(jù)庫(kù)信息的加解密處理。包括加密字典表的檢索、加密密鑰的生成、SQL語(yǔ)句的分析、加解密算法實(shí)現(xiàn)等功能,均以公共函數(shù)的形式給出。對(duì)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的用戶是透明的。

該數(shù)據(jù)庫(kù)加密系統(tǒng)實(shí)行二級(jí)密鑰管理。一級(jí)密鑰為主密鑰,二級(jí)密鑰為工作密鑰。整個(gè)系統(tǒng)一個(gè)主密鑰,它負(fù)責(zé)對(duì)二級(jí)密鑰信息加密。工作密鑰用于對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的加解密。一個(gè)記錄一個(gè)工作密鑰,經(jīng)一級(jí)密鑰加密后存放在每個(gè)表的一個(gè)密鑰字段中。工作密鑰由每個(gè)記錄的id字段內(nèi)容和由第一次生成密鑰時(shí)的當(dāng)前時(shí)間生成的一隨機(jī)數(shù)組成,長(zhǎng)度不確定,最長(zhǎng)為100B。id字段內(nèi)容在用戶錄入數(shù)據(jù)時(shí),系統(tǒng)自動(dòng)生成,且每個(gè)記錄的id字段內(nèi)容都是唯一的。

本系統(tǒng)中,主密鑰保護(hù)了工作密鑰,工作密鑰保護(hù)敏感信息,因而整個(gè)系統(tǒng)的安全依賴于主密鑰的安全。主密鑰在數(shù)據(jù)庫(kù)加密系統(tǒng)設(shè)計(jì)時(shí)指定為一64位二進(jìn)制數(shù)據(jù),經(jīng)加密后存放于安全區(qū)域內(nèi),使用時(shí)由系統(tǒng)自動(dòng)獲取并解密。

2、R加密算法在數(shù)據(jù)庫(kù)加密系統(tǒng)中的實(shí)現(xiàn)

由于MIS應(yīng)用系統(tǒng)選用的數(shù)據(jù)庫(kù)平臺(tái)為MS ?SQL ?Server7.0,開(kāi)發(fā)工具為Delphi ?7.0,而R加密加密算法是針對(duì)二進(jìn)制位數(shù)據(jù)操作的,所采用的循環(huán)移位、異或等位操作用 ?C語(yǔ)言實(shí)現(xiàn)比較容易,因此R加密算法由C++實(shí)現(xiàn),生成動(dòng)態(tài)鏈接庫(kù).dll文件,Delphi應(yīng)用程序編寫(xiě)調(diào)用程序調(diào)用.dll文件實(shí)現(xiàn)加解密操作。

(1)R加密算法動(dòng)態(tài)鏈接庫(kù)的生成

首先使用C++編寫(xiě)加密函數(shù)int ?encryfunc(char ?*s,char ?*key)和解密函數(shù)int ?decodefunc(char*s,char*key),然后將其生成動(dòng)態(tài)鏈接庫(kù)decode.dll和encry.dll。在制作.dll文件的多種方法中,選擇使用關(guān)鍵字declspec(dllexport),另外使用Extern“C”使不同的編譯器都能調(diào)用這個(gè).dll文件。

代碼如下:

Extern“C”declspec(dllexport) ? int ?Encry(char*s,char ?*key);

Extern“C”declspec(dllexport) ?int ?Decode(char ?*s,char ?*key);

(2)Delphi加解密調(diào)用函數(shù)

加密函數(shù)nowencry(miwen:string;key:string):string和解密函數(shù)nowdecode(miwen:string;key:string):string使用動(dòng)態(tài)鏈接的方式分別調(diào)用decode.dll和encry.dll,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表字段數(shù)據(jù)的加解密。

在Delphi中使用動(dòng)態(tài)鏈接的方式調(diào)用.dll文件,使用函數(shù)Loadlibrary(),Getprocaddress(),freelibrary();在函數(shù)的聲明部分使用stdcal和cdecl關(guān)鍵詞。

@encry:function(s:string;key:string):integer;

cdecl;

@decode:function(s:string;key:string):integer;

cdecl;

在函數(shù)的執(zhí)行部分加入如下語(yǔ)句:

h1:=loadlibrary(‘encry.dll’);

h2:=loadlibrary(‘decode.dll’);

encry:=getprocaddress(h1,’encryfunc’);

decode:=getprocaddress(h2,’decodefunc’);

freelibrary(h1);

//釋放.dll文件freelibrary(h2);

小知識(shí)之RC5加密算法

RC5分組加密算法是1994由麻薩諸塞技術(shù)研究所的Ronald L. Rivest教授發(fā)明的,并由RSA實(shí)驗(yàn)室分析。它是參數(shù)可變的分組密碼算法,三個(gè)可變的參數(shù)是:分組大小、密鑰大小和加密輪數(shù)。在此算法中使用了三種運(yùn)算:異或、加和循環(huán)。