R加密算法综合了RC5、RC6加密算法的优点并保持小的分组,使之更适合用于对数据库文件加密。安全性比RC5、DES高,密钥长度可变,能抵抗密钥穷举攻击。R加密算法加解密速度快,可满足数据库加密的要求。

一、R加密算法

1、 R加密算法的参数和运算

R加密算法是对字操作的,所有的基本运算都是以字为基本信息单位。每个字为w比特,这里取w=32,它是可变的,例如也可以取w=64或16。R加密算法有2-字(64比特)的输入(明文)和输出(密文)分组大小。

R加密算法使用一个源自用户提供的密钥的扩展密钥表S表,S的大小依赖于轮数r:S有t=2(r+2)个字。

所用的参数如下:

w:字长。每个字有u=(w/8)个8比特字节。w的标准值为32,容许取16,32,64。明文和密文分组都是2w比特长。

r:轮数。相应的扩展密钥表S含有t=2(r+2)个字。r的取值范围为12,13,…,255。

除了w和r外,R算法的密钥长度可变,可由b和K指定:b:密钥K的字节数。b的取值范围为16,17,…,255。K:b字节密钥:K[0],K[1],…,K[b-1]。

因此R加密算法一般记为R-w/r/b。

算法中涉及到的运算有:

lg(x)        x的以2为底的对数

a+b         两个字模w2加

a-b       两个字模w2减

a⊕b       两个字比特对位模2加(异或)

a×b         两个字模w2乘

a<<<b        w比特字a循环左移b位

a>>>b        w比特字a循环右移b位

2、R加密算法介绍

R加密算法的明文输入包含2个字,记为A和B。

算法用到一个包含t=2(r+2)个字的扩展密钥表S[0,…,t-1],由用户提供的密钥K得到。算法由3部分组成:密钥扩展算法,加密算法和解密算法。

(1)密钥扩展

密钥扩展算法用到两个字长的二进制常量,Pw和Qw:

数据库加密分组加密算法—R加密算法

数据库加密分组加密算法—R加密算法

其中,e=2.718281828459…(自然对数的底),φ=1.618033988749…(黄金分割率),Odd(x)为大于等于x的最小奇数。当w=32时:

P32=b7e15163

Q32=9e3779b9

将密钥由字节转化为字

将密钥K[0,…,b-1](字节)放入L[0,…,c-1](字)中,其中c=[b/u](≥b/u的最小整数,u=w/8为一个字的字节数)。没有填充的部分为0。

for   i=b-1down  to     0do

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

初始化数组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);

该密钥扩展函数有一定的单向性:从S很难得到K。

(2)加密算法

我们假设输入分组放在两个w比特寄存器A和B中。并且假设密钥扩展已经执行。R-w/r/b算法的加密过程如图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)解密函数

解密函数与加密函数类似。

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加密算法安全性分析

我们对R加密算法的安全性作了一定的分析,主要测试w=32的情况。

首先测试了输入和输出比特之间的相关性,发现当轮数在4时输入和输出的单个比特间具有非常均匀的相关性。

其次分析了每个明文比特与可变循环移位个数之间的关系,就是看改变一个明文比特是否会引起循环移位个数的改变。发现到7轮时每个明文比特都会引起不同程度的循环移位个数的变化。

在实际使用中轮数一般应大于等于这些简单测试中建议的轮数。建议用12轮或以上轮数。R算法中用到的变化的循环移位数可以抵抗差分攻击和线性攻击。

另外,R加密算法加解密速度快,对数据库操作时延小,用户基本上感觉不出来。

三、R加密算法在某“业务MIS”的数据库加密系统中的应用

除了采用身份验证、访问控制等安全机制外,开发了用于该应用系统的数据库加密系统。本数据库加密系统采用基于字段的加密方式,密文直接存储在原数据表中,由于密文长度可能会大于明文长度,因此在数据库设计时,需将加密字段的长度设置大一些。为简化密钥的管理和不影响数据库操作的效率,密钥的管理采用折衷的方法,每个记录一个密钥,因此在数据库设计时还需为每个表增加一存放密钥的字段。

1、数据库加密系统功能组成

数据库加密系统主要分成两部分:一个是加密字典表管理模块;另一个是加解密处理模块。

用户对数据库信息具体的加密要求记载在加密字典表中。加密字典管理模块完成加密字典表的维护工作,提供了加密字典表维护、表加密、表解密等功能,它利用数据库加解密处理模块完成对已有数据的加密或解密处理。该模块由系统管理员使用,普通用户不必关心。

数据库加解密处理模块是数据库加密系统的核心部分,负责完成数据库信息的加解密处理。包括加密字典表的检索、加密密钥的生成、SQL语句的分析、加解密算法实现等功能,均以公共函数的形式给出。对数据库应用系统的用户是透明的。

该数据库加密系统实行二级密钥管理。一级密钥为主密钥,二级密钥为工作密钥。整个系统一个主密钥,它负责对二级密钥信息加密。工作密钥用于对数据库数据的加解密。一个记录一个工作密钥,经一级密钥加密后存放在每个表的一个密钥字段中。工作密钥由每个记录的id字段内容和由第一次生成密钥时的当前时间生成的一随机数组成,长度不确定,最长为100B。id字段内容在用户录入数据时,系统自动生成,且每个记录的id字段内容都是唯一的。

本系统中,主密钥保护了工作密钥,工作密钥保护敏感信息,因而整个系统的安全依赖于主密钥的安全。主密钥在数据库加密系统设计时指定为一64位二进制数据,经加密后存放于安全区域内,使用时由系统自动获取并解密。

2、R加密算法在数据库加密系统中的实现

由于MIS应用系统选用的数据库平台为MS  SQL  Server7.0,开发工具为Delphi  7.0,而R加密加密算法是针对二进制位数据操作的,所采用的循环移位、异或等位操作用  C语言实现比较容易,因此R加密算法由C++实现,生成动态链接库.dll文件,Delphi应用程序编写调用程序调用.dll文件实现加解密操作。

(1)R加密算法动态链接库的生成

首先使用C++编写加密函数int  encryfunc(char  *s,char  *key)和解密函数int  decodefunc(char*s,char*key),然后将其生成动态链接库decode.dll和encry.dll。在制作.dll文件的多种方法中,选择使用关键字declspec(dllexport),另外使用Extern“C”使不同的编译器都能调用这个.dll文件。

代码如下:

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

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

(2)Delphi加解密调用函数

加密函数nowencry(miwen:string;key:string):string和解密函数nowdecode(miwen:string;key:string):string使用动态链接的方式分别调用decode.dll和encry.dll,实现对数据库表字段数据的加解密。

在Delphi中使用动态链接的方式调用.dll文件,使用函数Loadlibrary(),Getprocaddress(),freelibrary();在函数的声明部分使用stdcal和cdecl关键词。

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

cdecl;

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

cdecl;

在函数的执行部分加入如下语句:

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

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

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

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

freelibrary(h1);

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

小知识之RC5加密算法

RC5分组加密算法是1994由麻萨诸塞技术研究所的Ronald L. Rivest教授发明的,并由RSA实验室分析。它是参数可变的分组密码算法,三个可变的参数是:分组大小、密钥大小和加密轮数。在此算法中使用了三种运算:异或、加和循环。