一种轻量级分组密码SCS的实现方法与装置
技术领域
本发明属于信息安全领域,特别涉及一种轻量级分组密码SCS的实现方法与装置。
背景技术
近年来,随着网络、微电子和信息技术的飞跃性发展,物联网作为新一代信息化的典型代表,正在深入到人类生产和生活的各个方面,例如智能城市和交通、现代物流和环境监控等方面。而物联网领域的数据安全由于其自身资源受限、计算能力较弱和存储能力有限等问题不能由传统分组密码来解决,所以适应资源受限的轻量级分组密码算法应运而生。相关领域的学者也开始对轻量级密码进行大量研究,这些研究主要集中在轻量级密码的设计、安全性能的分析以及性能评估等方面。由于轻量级分组密码算法的研究刚刚起步,尚无统一标准与绝对领先地位的轻量级密码算法出现,同时,密码技术必须靠自主研发,针对我国信息安全实际情况,研发一种拥有自主知识产权的轻量级分组密码有着重要意义。
从2011年开始,国际学术界就陆续发表了一些有关轻量级分组密码算法论文,学术界研究的一个前沿热点问题就是轻量级分组密码算法。一系列轻量级分组密码算法相继被提出,我国学者吴文玲和张蕾在ACNS 2011上提出的LBIock,以及龚征在RFID Sec 2011提出的KLEIN,密码硬件与嵌入式系统国际会议提出的Piccolo和LED(CHES 2011),国际信息安全应用会议(IWISA 2013)提出的LEA,国际安全、隐私和应用密码学工程会议(SPACE2014)提出的Khudra等。适应资源约束环境下的轻量级分组加密算法正在受到全球密码研究人员和学者的广泛关注和研究。
目前轻量级分组密码算法存在的问题有以下几个方面:
(1)分组密码主要采用以下两种结构:一是Feistel结构,其结构高度对称,一定程度上能够保证其加/解密的相似性且消耗资源较少,但该结构密码算法扩散速度慢,一轮迭代只能改变一半的分组数据,尤其以超级计算机为代表的一系列计算能力优越的机器和方法的实现,被破解的可能性增加,安全性能低;二是SPN结构,其结构清晰,混淆和扩散效果优越,但是由于其结构不对称,加/解密不相似,所以其消耗资源较多,效率相比之下也要低。
(2)当前轻量级分组密码存在追求低资源消耗而损失安全性的问题,例如很多轻量级算法为了追求更小的资源消耗而将轮函数中运算和置换模块设计的过于单一和简单,这样导致算法根本不具备抵抗现有多种技术相结合的旁路攻击方法,从而带来安全隐患。
(3)现有的一些轻量级算法采用一种固定密钥的方式,在轮函数中采用固定位的密钥去参与运算,即使提供了不同位数的密钥,但是在加/解密过程中除了运算轮数不一样外运算和置换的模块还是相同的,这样不仅没有大幅提高安全性,反倒大幅降低了算法的性能和效率,同时还加大了硬件的资源消耗。
(4)在轻量级算法一些加密模式中,加密的过程和运算变换模块是高度确定的,这种高度的确定性会给算法带来安全隐患。比如一些轻量级算法的S盒替换模块直接用固定的S盒去参与运算变换,同时其他运算模块也是按照固定的方式运算或者变换,在一定程度上增加了被破解的可能性,降低了算法的安全性
发明内容
本发明提供了一种轻量级分组密码SCS的实现方法与装置,其目的在于,克服现有技术中Feistel网络结构算法一轮迭代运算只能改变部分分组数据,扩散和混淆程度不高;密钥参与模块运算的控制过程和方法过于简单,密钥不同位数间的实现过程或者加密轮数不一样导致资源消耗太大;扩散和混淆方式过于简单且步骤繁杂,效率不高;算法加密过程和运算变换模块固定,导致被攻击和分析的可能性增加,安全性不高的问题。
一种轻量级分组密码SCS的实现方法,包括以下步骤:
步骤1:利用高伪随机P1置换对密钥进行置换得到置换后的密钥,并从置换后的密钥中提取初始轮密钥、初始控制密钥和组合数据H1、H2;
步骤2:利用经过步骤1置换后的密钥的低64位对64位明文进行异或操作,得到第一中间结果数据,并将第一中间结果数据从高位至低位按16位一组分成4组,得到M0、M1、M2、M3;
步骤3:将第一中间结果数据的高32位和低32位按照Feistel结构分别进行r轮F1轮函数和F2轮函数运算;
F1轮函数:将M0作为参与F1轮函数运算的输入数据,进行F1轮函数运算,将得到的结果与M1进行异或,将得到的异或运算结果作为下一轮参与F1轮函数运算的输入数据M0,同时将前一轮参与F1轮函数运算的输入数据M0作为下一轮的M1;
F2轮函数:将M2作为参与F2轮函数运算的输入数据,进行F2轮函数运算,将得到的结果与M3进行异或,将得到的异或运算结果作为下一轮参与F2轮函数运算的输入数据M2,同时将前一轮参与F2轮函数运算的输入数据的M2作为下一轮的M3;
其中,所述F1轮函数依次包括利用F1轮函数运算的输入数据对每一轮的轮密钥进行异或操作、S1盒更新、P1置换、S1盒替换以及P2置换操作;
所述F2轮函数依次包括利用F2轮函数运算的输入数据对每一轮的轮密钥进行异或操作、S2盒更新、P2置换、S2盒替换以及P1置换操作;
所述S1盒更新和S2盒更新采用每一轮的控制密钥更新;
每一轮的轮密钥和控制密钥依据每一轮的轮函数运算输入数据分别对初始轮密钥和初始控制密钥进行更新获得;
步骤4:将经过r轮轮函数运算得到的M1、M0、M3、M2作为第二中间结果数据;
步骤5:把组合数据H1、H2分别放在第二中间结果数据的高32位的后面和低32位的后面,得到第三中间结果数据;
所述组合数据H1和H2从密钥中选取,且H1和H2均为32位;
步骤6:将第三中间结果数据依次进行行移位和列混淆操作,得到明文的加密结果。
进一步地,所述初始轮密钥、初始控制密钥和组合数据是从利用高伪随机P1置换对密钥进行置换后的密钥中提取:
将置换后的密钥的第32位至63位作为初始轮密钥;
将置换后的密钥的低32位作为初始控制密钥;
若密钥长度为96位,则将置换后的密钥高32位作为组合数据H1,H1的逆序作为组合数据H2;
若密钥长度为192位,则将置换后的密钥第96位至第159位的前半部分作为组合数据H1,后半部分作为组合数据H2;
将所述初始轮密钥的前半部分和后半部分分别作为第一初始轮密钥Lkey和第二初始轮密钥Rkey;
将所述初始控制密钥的前半部分和后半部分分别作为第一初始控制密钥wk和第二初始控制密钥vk;
每一轮F1轮函数的控制密钥W由第一初始控制密钥wk和参与每一轮F1轮函数运算的输入数据M0进行异或得到;
每一轮F2轮函数的控制密钥V由第二初始控制密钥vk和参与每一轮F2轮函数运算的输入数据M2进行异或得到;
每一轮F1轮函数的轮密钥K1由第一初始控制密钥wk、第一初始轮密钥Lkey以及参与每一轮F2轮函数运算的输入数据M2进行异或得到;
每一轮F2轮函数的轮密钥K2由第二初始控制密钥vk、第二初始轮密钥Rkey以及参与每一轮F1轮函数运算的输入数据M0进行异或得到。
进一步地,在每一轮F1轮函数和F2轮函数中S1盒更新和S2盒更新的过程由每一轮的控制密钥控制,S1盒替换和S2盒替换由每一轮的轮密钥控制;
所述S1盒更新和S2盒更新的过程相同,包括以下步骤:
步骤1.1:将每一轮的控制密钥的十进制数作为随机数种子,生成16个伪随机数;
步骤1.2:将得到的16个伪随机数相互异或,得到一个异或结果,记为dex;
步骤1.3:将得到的dex再次作为随机数种子,生成16个0到15之间的伪随机数,保存在数组d[i]中,0≤i≤15;
步骤1.4:依次比较i与d[i],若不相等,则交换初始S盒中i所在位置的值与d[i]所在位置值,i从0取值到15,直到完成所有交换,得到更新后的S盒;
所述S盒的初始值为S(i)=i,S1盒更新和S2盒更新使用的控制密钥分别为W和V;
所述S1盒替换和S2盒替换的过程相同,包括以下步骤:
步骤2.1:将待输入S盒的数据按从高位至低位,每组4位依次分为4组{statej},0≤j≤3;
步骤2.2:将每一轮的轮密钥按从高位至低位,每组4位依次分为4组{Kj},0≤j≤3;
步骤2.3:依次进行(statej+Kj)mod16运算,0≤j≤3,得到4个4位结果数据{sj};
步骤2.4:将步骤2.3得到的4个4位结果数据{sj}均输入S盒进行变换,将得到的变换结果按照从高位至低位进行合并,得到S盒替换结果。
进一步地,依据密钥长度,确定进行轮运算的轮数r;
若密钥长度为96位,轮数r为20;密钥长度为192位,轮数r为32。
进一步地,在对密文进行解密时,先将密文进行逆列混淆,再进行逆行移位,接着进行拆分操作,将得到的拆分结果采用广义Feistel结构进行相应轮数r的迭代,将迭代后结果利用经过P1置换后的密钥的低64位进行异或运算,得到解密后的明文;
所述迭代过程与加密过程中的轮函数运算相同;
所述逆列混淆和逆行移位与加密过程中的列混淆和行移位运算互逆;
所述拆分操作是指将经过逆行移位运算后的结果的第64位到第95位和低32位取出后,剩余数据按照从高位至低位,每组16位,拆分成4组,依次为C0、C1、C2、C3,将拆分得到的数据作为迭代过程中的输入数据。
一种轻量级分组密码SCS的实现装置,包括:
初始化单元,利用高伪随机P1置换对密钥进行置换得到置换后的密钥,并从置换后的密钥中提取初始轮密钥、初始控制密钥和组合数据H1、H2;
数据拆分单元,利用初始化单元中置换后的密钥的低64位对64位明文进行异或操作,得到第一中间结果数据,并将第一中间结果数据从高位至低位按16位一组分成4组,得到M0、M1、M2、M3;
轮函数迭代单元,采用上述的方法将第一中间结果数据的高32位和低32位按照Feistel结构分别进行r轮F1轮函数和F2轮函数运算;
F1轮函数模块:将M0作为参与F1轮函数运算的输入数据,进行F1轮函数运算,将得到的结果与M1进行异或,将得到的异或运算结果作为下一轮参与F1轮函数运算的输入数据M0,同时将前一轮参与F1轮函数运算的输入数据M0作为下一轮的M1;
F2轮函数:将M2作为参与F2轮函数运算的输入数据,进行F2轮函数运算,将得到的结果与M3进行异或,将得到的异或运算结果作为下一轮参与F2轮函数运算的输入数据M2,同时将前一轮参与F2轮函数运算的输入数据的M2作为下一轮的M3;
其中,所述F1轮函数依次包括利用F1轮函数运算的输入数据对每一轮的轮密钥进行异或操作、S1盒更新、P1置换、S1盒替换以及P2置换操作;
所述F2轮函数依次包括利用F2轮函数运算的输入数据对每一轮的轮密钥进行异或操作、S2盒更新、P2置换、S2盒替换以及P1置换操作;
所述S1盒更新和S2盒更新采用每一轮的控制密钥更新;
每一轮的轮密钥和控制密钥依据每一轮的轮函数运算输入数据分别对初始轮密钥和初始控制密钥进行更新获得;
合并单元:将经过r轮轮函数运算得到的M1、M0、M3、M2作为第二中间结果数据,把组合数据H1、H2分别放在第二中间结果数据的高32位的后面和低32位的后面,得到第三中间结果数据;
所述组合数据H1和H2从密钥中选取,且H1和H2均为32位;
行列操作单元:将合并单元输出的第三中间结果数据依次进行行移位和列混淆操作,得到明文的加密结果。
所述广义Feistel结构,在加密和解密过程中使用的结构相同。
算法采用广义Feistel结构,加解密相似,结构对称提高效率,并且解密不需要构造逆S盒,易于实现。解密只需要将拆分、逆行移位和逆列混淆放到广义Feistel结构位置之前。
有益效果
本发明提供了一种轻量级分组密码SCS的实现方法与装置,采用了一种新的加密模式,将密钥划分出轮密钥和控制密钥两种,轮密钥参与轮函数F1和F2中的运算,控制密钥对每轮S盒的生成进行控制;P置换的数据是通过梅森旋转算法生成高伪随机数据再进行筛选产生;列混淆对组合后128位数据采用伽罗瓦域下的乘法,加大扩散程度;F轮函数采用两个不同的函数F1和F2。算法的内部结构相比固定密码结构在消耗资源差别不大的情况下,大幅度提高了算法本身的安全性,能够在一定程度上增加对线性攻击、差分攻击等攻击的防御系数。SCS算法具有灵活性高、可扩展性强、低资源消耗和高随机性的特点,相比其他基于Feistel结构的轻量级算法安全和加密性能更优越。
该模式基于广义Feistel网络结构,明文长度为64位,根据密钥长度96位和192位,迭代轮数分为20轮和32轮。SCS算法包括三个部分:拆分组合部分、运算部分和控制部分。拆分部分,将明文与密钥进行拆分组合;运算部分,轮函数运算包括两种运算模式,每个模式包括五个基本运算模块:轮密钥加、S盒更新、P1置换、S盒替换、P2置换,轮函数运算结束后还有一个扩位变换的处理,将迭代结果结合部分密钥位扩展至128位,然后再通过行移位和列混淆变换运算后得到密文;控制部分,由高位至低位,从第0位计算,对于96位密钥,将第65位到第79位和第80位到第95位作为SCS算法的初始控制密钥wk和vk,对于192位密钥,将第160位到第175位和第176位到第191位作为SCS算法的初始控制密钥wk和vk,控制密钥(W、V)是由初始控制密钥(wk、vk)和每轮的运算结果(M0、M2)决定的,S盒在轮函数F1中称为S1盒,在轮函数F2中称为S2盒,S1盒与S2盒是由每轮的控制密钥进行更新和生成,而控制密钥和轮密钥的更新又与每轮的运算结果有关,这样一来不仅每轮的运算结果是随机的,控制密钥与轮密钥也变得随机化,由此使得加/解密过程进一步随机化,这是一种新的加密方式,能够有效提高密码算法的安全性。
利用本发明所述的SCS算法的广义Feistel结构设计可以节约很多硬件实现面积资源的开销,而且性能效率方面也比算法之间进行重构设计好很多。相比目前一些轻量级分组密码算法只是简单将轮函数中的置换模块进行顺序替换、使用单一S盒参与运算和变换、采用固定密钥参与轮函数中变换等方式去变换,SCS算法有如下优点:一是因其结构高度对称,加解密实现的资源相对较少;二是轮函数中S盒的设计采用的是每轮通过控制密钥控制其生成和更新,使每轮运算中的S盒不固定,控制密钥和轮密钥的更新与每轮的运算结果有关,这样一来每轮的运算结果是随机的,非线性变换程度大大提高,这是一种新的加密方式,安全性也进一步提升;三是不同轮函数里使用的P置换不同,完成20轮/32轮迭代后,把密文结合部分密钥位扩展为128位的密文进行行移位和列混淆变换,两种扩散方式结合密钥增加了扩散效果,提高了安全性。这种模式沿用Feistel结构实现资源少的优点,解密过程与加密相似,无需构造逆S盒,并且安全性也足以应对线性攻击和差分攻击等现有的一些攻击和分析手段。SCS密码算法是将现有算法暴露的一些缺点做了综合考虑和设计,从而在节约大量软硬件资源的基础上使得密码算法更有灵活性、可扩展性、随机性和安全性。
附图说明
图1为本发明所述方法的加密过程示意图;
图2为本发明所述轮密钥与控制密钥更新过程示意图;
图3为本发明所述方法的解密过程示意图;
图4为本发明所述方法的S1盒更新过程示意图;
图5为本发明所述方法的轮函数F1流程示意图;
具体实施方式
下面将结合附图和实例对本发明做进一步的说明。
一种新型高安全的轻量级SCS分组密码实现方法,SCS算法明文长度为64位,密钥长度分为96位和192位两种,分别进行20轮和32轮函数迭代。SCS算法基于广义Feistel网络结构,轮函数F包括F1、F2两种轮函数,如图1所示。
F1轮函数包含:轮密钥加(AddRoundKey)、S1盒更新(SubUpdata1)、P1置换(Permutation1)、S1盒替换(SubCells1)、P2置换(Permutation2)五个模块。
F2轮函数包含:轮密钥加(AddRoundKey)、S2盒更新(SubUpdata2)、P2置换(Permutation2)、S2盒替换(SubCells2)、P1置换(Permutation1)五个模块。
本发明所述的算法输入的密钥,经过高伪随机P1置换,再划分成初始控制密钥(wk、vk)和初始轮密钥(Lkey、Rkey)。SCS算法经过密钥划分,通过更新控制密钥和轮密钥实现对S盒的更新,进而控制加/解密运算。
在本发明所述的SCS密码算法中,先将明文与置换后的密钥后64位进行异或操作。再将每一轮值都分为4个单元,每个模块运算单元为16位,分别表示为M0(state0~state15)、M1(state16~state31)、M2(state32~state47)、M3(state48~state65)。将经高伪随机P1置换变换的密钥划分为6组,分别为wk,vk,Lkey,Rkey,H1,H2,其中wk和vk是初始控制密钥划分,各为16位,对于96位密钥长度,wk(key64~key79),vk(key80~key95);对于192位密钥长度,wk(key160~key175),vk(key176~key191)。初始轮密钥Lkey与Rkey,各为16位,其中F1轮函数的轮密钥为Lkey(key32~key47),F2轮函数的轮密钥为Rkey(key48~key63)。在完成迭代20轮/32轮后,对于96位密钥长度,取密钥部分H1(key0~key31)和H2(key31~key0),与经过迭代的64位数据组合成128位;对于192位密钥长度,取密钥部分H1(key96~key127)和H2(key128~key159),H1与H2各为32位。表1为密钥划分分组。轮密钥有两个作用部分,一个是参与F轮函数中轮密钥加模块的运算,另一个是在待加密数据进入S盒前先与轮密钥做相应的运算,得到结果再进入S盒进行替换,如图5所示;
表1密钥划分分组
SCS算法的加密流程如图1所示。SCS密码算法加密描述如下算法1所示。
SCS分组密码算法加密伪代码描述:
算法1:SCS算法加密过程,根据密钥长度96位或192位,NR为20轮或32轮;
输入:M(64),K;
输出:C(128);
以下对密钥进行置换、密钥划分和两部分轮函数中各个模块进行详细描述。
轮函数F1和F2分别采用P1-S1-P2和P2-S2-P1这两种不同方式分别进行变换运,在密钥进行置换所用的高伪随机P置换表为P1置换表,P1置换表为按位变换,每次置换16位数据,对于96位密钥,按由高位至低位,将96位分成6组,每组16位,分别进行P1置换;对于192位密钥,按由高位至低位,将192位分成12组,每组16位,分别进行P1置换。P1置换表数据如表5所示。
对于密钥的划分,所划分出的16位初始轮密钥(Lkey、Rkey)与16位初始控制密钥(wk、vk),需要进行各自的更新才能进入本轮的轮函数中,轮密钥与控制密钥更新过程如图2所示。划分密钥及轮密钥与控制密钥的更新具体如下:
密钥划分分组如表1。划分的轮密钥,其中(key32~key47),记为Lkey;(key48~key63),记为Rkey,关系如下公式(1)(2):
Lkeyi=key32+i(0≤i≤15) (1)
Rkeyi=key48+i(0≤i≤15) (2)
若96位密钥长度,划分的控制密钥,其中(key64~key79),记为wk;(key80~key95),记为vk,关系如下公式(3)(4):
wki=key(64+i)(0≤i≤15) (3)
vki=key(80+i)(0≤i≤15) (4)
若192位密钥长度,划分的控制密钥,其中(key160~key175),记为wk;(key176~key191),记为vk,关系如下公式(5)(6):
wki=key(160+i)(0≤i≤15) (5)
vki=key(176+i)(0≤i≤15) (6)
轮密钥更新(K1schedule、K2schedule):所划分的初始轮密钥在进入F轮函数之前需要进行密钥更新,将初始轮密钥Lkey与F2轮函数的M2异或,再与初始控制密钥wk异或,作为当前轮函数F1的轮密钥K1;将初始轮密钥Rkey与F1轮函数的右明文M0异或,再与初始控制密钥vk异或,作为当前轮函数F2的轮密钥K2。如图2所示。运算关系如下公式(7)(8):
控制密钥更新(Wschedule、Vschedule):将初始控制密钥wk与F1轮函数的右明文M0异或,得到的结果W作为当前轮函数F1的控制密钥;将初始控制密钥vk与F2轮函数的右明文M2异或,得到的结果V作为当前轮函数F2的控制密钥。如图2所示。运算关系如下公式(9)(10):
F1轮函数加密运算模块描述:F1轮函数将64位明文前半部分32位分为左右等长两半,左半16位记为M0,右半16位记为M1,轮函数F1的详细设计结构如图5所示:
轮密钥加(AddRoundKey):将16位的M0值与轮密钥K1值进行异或运算,运算关系如下公式(11):
S1盒更新(SubUpdata1):轮函数F1中的S盒称为S1盒,将控制密钥W的十进制数作为随机数的种子,先生成16个伪随机数,进行相互异或,得到一个运算结果dex,将该结果再作为随机数种子,生成16个0到15之间的伪随机数,保存在数组d[i](i<16)中,作为变换所需的数据,对初始S盒作用,初始S盒如公式(12)所示。分两次生成随机数目的是保证所生成的d[i]尽可能随机,不存在相关关系。在Feistel网络结构中,解密不需要额外写逆S1盒,加解密相似,模块高度复用。每一轮S1盒更新,通过控制密钥生成的16个数据d[i](i<16),对初始S盒进行更新。更新具体步骤:i从0开始,用下标i与下标所在位置的值d[i]比较,若不相等,则交换初始S盒中i所在位置的值与d[i]所在位置的值,直到完成所有交换。例如,对于16个伪随机数,从下标为0开始,d[0]与0对比,如果d[0]不等于0,则交换S1[0]与S1[d[0]]的值;接着到下标1,d[1]与1对比,如果d[1]不等于1,则交换S1[1]与S1[d[1]]的值,以此类推,直到变换完所有的数。如图4所示。通过控制密钥对初始S盒的更新进行生成新的S1盒,从而使加密过程S1盒随机化,不再是单一固定的一个S盒;
S1={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} (12)
密钥长度为96位时,经过两轮生成随机数运算生成的16个伪随机数,这里只列出前6轮如表2,以明文0000-0000-0000-0000,密钥0000-0000-0000-0000-0000-0000为例,生成对应的前6轮S1盒如表3。
表2经两轮生成随机数运算生成的16个伪随机数前6轮
| 轮数 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
| 1 |
13 |
11 |
1 |
14 |
8 |
7 |
3 |
4 |
3 |
6 |
10 |
5 |
15 |
2 |
8 |
10 |
| 2 |
7 |
15 |
13 |
13 |
15 |
3 |
12 |
6 |
13 |
8 |
4 |
10 |
12 |
10 |
0 |
10 |
| 3 |
0 |
7 |
12 |
2 |
11 |
13 |
3 |
3 |
13 |
11 |
10 |
7 |
7 |
2 |
1 |
14 |
| 4 |
11 |
4 |
10 |
10 |
5 |
14 |
5 |
14 |
6 |
4 |
6 |
9 |
6 |
14 |
11 |
4 |
| 5 |
5 |
15 |
4 |
6 |
12 |
8 |
14 |
15 |
2 |
5 |
6 |
6 |
3 |
3 |
11 |
13 |
| 6 |
0 |
10 |
8 |
10 |
6 |
13 |
4 |
6 |
9 |
9 |
3 |
6 |
9 |
15 |
0 |
3 |
表3 96位密钥对应生成的前6轮S1盒
| 轮数 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
| 1 |
d |
2 |
0 |
4 |
5 |
1 |
9 |
8 |
3 |
e |
c |
7 |
f |
b |
6 |
a |
| 2 |
e |
f |
d |
5 |
a |
2 |
0 |
c |
9 |
3 |
4 |
1 |
6 |
b |
7 |
8 |
| 3 |
0 |
e |
8 |
1 |
b |
d |
c |
2 |
5 |
4 |
a |
6 |
9 |
3 |
f |
7 |
| 4 |
b |
4 |
a |
2 |
f |
6 |
c |
1 |
e |
0 |
8 |
d |
3 |
7 |
5 |
9 |
| 5 |
5 |
f |
0 |
d |
c |
9 |
b |
1 |
4 |
8 |
e |
3 |
6 |
7 |
a |
2 |
| 6 |
e |
a |
8 |
5 |
4 |
d |
b |
6 |
9 |
c |
1 |
7 |
2 |
f |
0 |
3 |
密钥长度为192位时,以明文0000-0000-0000-0000,密钥0000-0000-0000-0000-0000-0000-0000-0000-0000-0000-0000-0000为例,只列出生成的前6轮S1盒如表4。
表4 192位密钥生成的前6轮S1盒
| 轮数 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
| 1 |
5 |
1 |
2 |
8 |
6 |
a |
e |
9 |
b |
7 |
c |
3 |
4 |
0 |
d |
f |
| 2 |
6 |
2 |
c |
1 |
7 |
0 |
3 |
5 |
e |
f |
d |
a |
4 |
9 |
8 |
b |
| 3 |
8 |
a |
4 |
7 |
6 |
c |
e |
1 |
b |
0 |
d |
3 |
2 |
f |
9 |
5 |
| 4 |
1 |
5 |
c |
7 |
a |
e |
9 |
4 |
2 |
3 |
6 |
d |
0 |
f |
8 |
b |
| 5 |
7 |
d |
5 |
3 |
1 |
f |
6 |
2 |
b |
4 |
a |
e |
8 |
0 |
c |
9 |
| 6 |
8 |
2 |
d |
b |
6 |
7 |
f |
4 |
1 |
5 |
9 |
e |
a |
2 |
c |
3 |
P1置换(Permutation1)与P2置换(Permutation2):P1、P2置换变换按照表5、表6所示位置规则,将每一比特位的位置进行交换。由表5、表6位置规则得知,将进行P置换的16位数据每一比特位P(i)移动变换到i所表示的位置。表5、表6的数据采用梅森旋转算法随机产生,梅森旋转算法是一种随机函数算法,随机函数产生的数具有高强度的伪随机性,且算法所产生的数不重复,通过限制其随机数生成的范围来获取大量数据,最后通过手动筛选的方法选取两组混淆性较高的两组数据作为P1、P2置换表,轮函数F1、F2使用的P1、P2置换表相同。
表5P1置换表数据
| i |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
| P<sub>1</sub>[i] |
4 |
10 |
2 |
12 |
6 |
0 |
9 |
3 |
| i |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
| P<sub>1</sub>[i] |
11 |
5 |
15 |
8 |
1 |
13 |
7 |
14 |
表6P2置换表数据
| i |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
| P<sub>2</sub>[i] |
9 |
3 |
11 |
5 |
13 |
4 |
15 |
1 |
| i |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
| P<sub>2</sub>[i] |
10 |
2 |
8 |
14 |
7 |
0 |
6 |
12 |
S1盒替换(SubCells1):在广义Feistel网络结构中,S1盒替换是最重要的部分之一,不同于传统的算法直接将待加密数据直接进入S盒中,而是将进行S1盒变换的16位待加密数据分为4组,记为state0、state1、state2、state3,每组4位;轮密钥K1的16位数据分成4组,每组4位,分别为分别与4组待加密数据进行十六进制加法运算,并对16取模,所得结果进入S1盒进行替换,如图5所示。通过轮密钥与待加密数据运算,大大增加算法的混淆程度。
P1、S1、P2模块之间的相互关系,根据图5,轮函数F1详细设计结构所示。
F2轮函数加密运算模块描述:F2轮函数将64位明文后半部分32位分为左右等长两半,左半16位记为M2,右半16位记为M3:
轮密钥加(AddRoundKey):将16位的M2值与轮密钥K2值进行异或运算,运算关系如下公式(13):
S2盒更新(SubUpdata2):S2盒的更新与S1盒更新相同,将控制密钥V作为随机数的种子,经过两轮生成随机数运算,生成16个伪随机数保存在d[i]中(i<16),i从0开始,若下标i与下标所在位置的值d[i]不相等,则交换初始化S盒中i所在位置的值与d[i]所在位置的值,直到完成所有交换,生成新的S2盒,通过控制密钥对S2盒的更新进行控制,从而使加密过程S2盒随机化,不再是单一固定的S盒;
S2盒替换(SubCells1):S2盒与S1盒的替换方式相同,数据不同,S2盒是通过控制密钥V,作为随机数种子,经两轮运算生成16个伪随机数,控制S2盒的更新,从而使每一轮有不同的S2盒。将进行S2盒变换的16位待加密数据分为4组,记为state0、state1、state2、state3,每组4位;轮密钥K2的16位数据分成4组,每组4位,分别为分别与4组待加密数据进行十六进制加法运算,并对16取模,所得结果进入S2盒进行替换。
组合(SplCom):将M0,M1,M2,M3,H1,H2'按一定顺序组合,获得128位数据,H1,H2取值如表1所示,其中96位长度的密钥,H2为H1的逆排列。组合顺序如下公式(14):
C128=M1||M0||H1||M3||M2||H2 (14)
行移位变换(ShiftRows):通过与部分密钥位组合成的128位加密数据,先分成16组,每组8位,即每组一个字节,形成一个4×4的矩阵,进行行移位变换,具体方法,第一行不变,第二行循环左移1个字节,第三行循环左移2个字节,第四行循环左移3个字节。
列混淆变换(MixColumns):可以通过改变公式(15)来改变生成的列变换的值,公式(16)可以通过改变GF(28)域上的多项式的系数,确定列混淆矩阵;
S′(x)=C(x)·S(x)mod(x4+1) (15)
C(x)={03}·x3+{02}·x2+{01}·x+{02} (16)
GF(28)域上的多项式:4个字节构成的向量可以表示为系数在GF(28)域上的次数小于4的多项式。规定多项式的乘法运算必须要取模M(x)=x4+1,这样使得次数小于4的多项式的乘积仍然是一个次数小于4的多项式,将多项式的模乘运算记为设如公式(17)(18)(19):
a(x)=a3x3+a2x2+a1x+a0 (17)
b(x)=b3x3+b2x2+b1x+b0 (18)
由于xj mod(x4+1)=xj mod 4,所以如公式(20):
可将上述计算表示为(21):
M(x)不是GF(28)上的不可约多项式,因此非零多项式的这种乘法不是群运算。对于多项式b(x),这种乘法运算只限于乘以一个固有的有逆元的多项式如(22)所示:
a(x)=a3x3+a2x2+a1x+a0 (22)
系数在GF(28)上的多项式a3x3+a2x2+a1x+a0是模x4+1可逆的,当且仅当矩阵如下在GF(28)上可逆如式(23)所示:
根据公式(23)所示,使得M(x)矩阵模x4+1可逆,SCS算法所使用的M(x)矩阵如公式(24)所示:
SCS算法的解密流程如图3所示。SCS密码算法解密描述如下算法2所示。
SCS分组密码算法解密伪代码描述:
算法2:SCS算法解密过程,根据密钥长度96位或192位,NR为20轮或32轮;
输入:C(128),K;
输出:M(64);
本发明所述的SCS算法解密过程中广义Feistel网络结构使用与加密过程相同的模块,只需要将部分模块的顺序稍微变换一下,即可完成解密操作;轮函数外增加了一个行移位和列混淆变换的逆变换,相对于加密函数的各个组件顺序,将明文与密钥的异或调整到末尾位置,逆行移位和逆列混淆变换调整到顺序首位置,其他不变,解密过程与加密过程使用相同的初始轮密钥与初始控制密钥。
逆行移位变换(InvShiftRow):将128位待解密数据,先分成16组,每组8位,即每组一个字节,形成一个4×4的矩阵,进行逆行移位变换,具体方法,第一行不变,第二行循环右移1个字节,第三行循环右移2个字节,第四行循环右移3个字节。
逆列混淆变换(InvMixColumns):逆列混淆变换的处理方法与列混淆变换类似,矩阵变换公式如公式(25):
SCS算法测试数据如表7和表8所示:
表7 SCS-96测试向量
表8 SCS-192测试向量
本发明所述的SCS-96密码算法在ModelSim SE 6.1f Evaluation上进行仿真;在Synopsys Design Compiler Version B-2008.09进行综合,其中综合工艺库为SMIC 0.18μm CMOS,在综合实验中,面积资源用等效门数GE来衡量。
SCS-96算法各组件硬件实现资源具体描述为:64位的明文保存在寄存器中需要344GE,密钥96位密钥保存在存放128位组合数据的寄存器中需要为688GE。密钥与明文的64位异或运算,需要64位异或单元,因此需要172GE。对F轮函数中的轮密钥加操作以及其他异或运算,均为16位异或操作,16位异或单元需要43GE。一个S盒替换模块占28GE,S盒的实现共需要28*(4+4)=224GE。P置换模块与行移位模块,采用连线方式实现,硬件实现不需要消耗资源。列混淆模块,将部分乘法运算转换为异或与移位运算,可以减少实现资源,从而只需要消耗资源为40GE。算法实现中,控制逻辑单元以及计数器共需要40GE。SCS算法硬件实现仅需要1551GE。表9是SCS算法ASIC资源面积列表。
表9SCS-96面积资源列表
| 算法模块 |
GE |
| 明文寄存器 |
344 |
| 密钥寄存器 |
688 |
| 64位异或单元 |
172 |
| 16位异或单元 |
43 |
| S盒替换层 |
224 |
| P置换层/行移位 |
0 |
| 列混淆层 |
40 |
| 控制逻辑单元与计数器 |
40 |
| 总和 |
1551 |
满足不同用户多层次的安全性需求,采用两种密钥长度,96位长度的密钥更适合资源受限的环境,而192位长度的密钥主要用于更考虑安全因素的环境。算法采用结构高度对称的Feistel结构,通过将密钥划分成不同功能密钥参与轮函数的运算和控制S盒的生成等,同时轮函数中采用P置换且数据由大量不重复高伪随机数据筛选产生,在轮函数迭代完最后一轮后再将数据扩为128位进行一次行移位和列混淆变换从而进一步提高扩散性等。综上使得算法具有灵活性高、可扩展性强、低资源消耗和高随机性的特点,相比其他基于Feistel结构的轻量级算法安全和加密性能更加优越。
表10为各轻量级分组密码算法ASIC硬件实现,通过表10的数据对比表明,SCS相比其他分组密码占用面积资源更小,适合于资源受限的环境。
表10各分组密码算法ASIC实现
一种轻量级分组密码SCS的实现装置,包括:
初始化单元,利用高伪随机P1置换对密钥进行置换得到置换后的密钥,并从置换后的密钥中提取初始轮密钥、初始控制密钥和组合数据H1、H2;
数据拆分单元,利用初始化单元中置换后的密钥的低64位对64位明文进行异或操作,得到第一中间结果数据,并将第一中间结果数据从高位至低位按16位一组分成4组,得到M0、M1、M2、M3;
轮函数迭代单元,采用上述的方法将第一中间结果数据的高32位和低32位按照Feistel结构分别进行r轮F1轮函数和F2轮函数运算;
F1轮函数模块:将M0作为参与F1轮函数运算的输入数据,进行F1轮函数运算,将得到的结果与M1进行异或,将得到的异或运算结果作为下一轮参与F1轮函数运算的输入数据M0,同时将前一轮参与F1轮函数运算的输入数据M0作为下一轮的M1;
F2轮函数:将M2作为参与F2轮函数运算的输入数据,进行F2轮函数运算,将得到的结果与M3进行异或,将得到的异或运算结果作为下一轮参与F2轮函数运算的输入数据M2,同时将前一轮参与F2轮函数运算的输入数据的M2作为下一轮的M3;
其中,所述F1轮函数依次包括利用F1轮函数运算的输入数据对每一轮的轮密钥进行异或操作、S1盒更新、P1置换、S1盒替换以及P2置换操作;
所述F2轮函数依次包括利用F2轮函数运算的输入数据对每一轮的轮密钥进行异或操作、S2盒更新、P2置换、S2盒替换以及P1置换操作;
所述S1盒更新和S2盒更新采用每一轮的控制密钥更新;
每一轮的轮密钥和控制密钥依据每一轮的轮函数运算输入数据分别对初始轮密钥和初始控制密钥进行更新获得;
合并单元:将经过r轮轮函数运算得到的M1、M0、M3、M2作为第二中间结果数据,把组合数据H1、H2分别放在第二中间结果数据的高32位和低32位的后面,得到第三中间结果数据;
所述32位组合数据H1和H2从密钥中选取;
行列操作单元:将合并单元输出第三中间结果数据依次进行行移位和列混淆操作,得到明文的加密结果。
以上结合具体实施例对本发明进行了详细的说明,这些并非构成对发明的限制。在不脱离本发明原理的情况下,本领域的技术人员还可以做出许多变形和改进,这些也应属于本发明的保护范围。