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:
其中,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]<;<;<;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实验室分析。它是参数可变的分组密码算法,三个可变的参数是:分组大小、密钥大小和加密轮数。在此算法中使用了三种运算:异或、加和循环。