MARS加密算法

MARS加密算法是IBM公司提供的一個(gè)候選加密算法。那么接下來(lái),我就給大家簡(jiǎn)單的介紹一下MARS加密算法。

一、MARS加密算法算法原理

密鑰增加作為預(yù)白化處理,經(jīng)8輪無(wú)密鑰的向前混合,8輪有密鑰的向前變換,8輪有密鑰的向后變換,8輪無(wú)密鑰的向后混合,以及作為后白化處理的密鑰減法。16輪有密鑰的轉(zhuǎn)換稱(chēng)為密碼核(cryptographic core),無(wú)密鑰的迭代使用兩個(gè)8x32 bit S-boxes、加、異或操作。此外,有密鑰的迭代使用32-bit密鑰乘法、數(shù)據(jù)相倚旋轉(zhuǎn)和密鑰加法?;旌吓c核心迭代都被修改為Feistel結(jié)構(gòu)的迭代,其中,1/4的數(shù)據(jù)塊用于標(biāo)識(shí)其它3/4的數(shù)據(jù)塊。

二、密鑰的生成

MARS加密算法支持128~448位變長(zhǎng)密鑰,定義一個(gè)臨時(shí)容器ULONG32 T用于存放用戶輸入的密鑰,

T[0,1…n] = K[0,1…n]

T[n] = n ;

T[n+1,…14] = 0 ;

其中n是用戶輸入密鑰的長(zhǎng)度(4字節(jié)為單位)。

然后按照下面的算法進(jìn)行操作:

for ( j = 0 ; j < 4 ; j++)
{
for ( i = 0; i < 15 ;i++)
{
/*T[i] ^= ((T[(i-7)%15]^T[(i-2)%15])<<<3)^(4*i+j);*/
}
for ( r = 0 ; r < 4 ; r++)
{
for ( i = 0; i < 15 ;i++)
{
/*T[i] = T[i]+ S[low 9 bits of T[(i-1)%15]])<<<9;*/
}
}
for ( i = 0 ; i < 10 ; i++)
{
/*T[10*j+i] = T[4*i%15];*/
}

最后我們需要修正那些在E-Fun操作中用作乘數(shù)的密鑰也就是子密鑰數(shù)組中的K[5],K[7],K[9],…K[35],要求他們的二進(jìn)制表示形式中沒(méi)有連續(xù)10個(gè)以上(含10個(gè))的0或1。

需要修正的密鑰為K[i] = K0K1K2…K30K31,保留K[i]的最低兩位的值 n = K[i]&0x3,把K[i]的最低兩位置1 w = K[i] | 0x3,產(chǎn)生掩碼M:

最低兩位置1后的K的二進(jìn)制表示中如果含有10以上連續(xù)的0或1,那么將這些連續(xù)位置1,其他的位置0,然后把最低的兩位和最高位置0,最后把連續(xù)位(1或0單獨(dú)算)的起始位和中止位置0。

例如:

產(chǎn)生掩碼后,我們利用n值作為s-box的索引取得一個(gè)替代值,這個(gè)s-box含有4個(gè)32位的元素,每個(gè)元素的二進(jìn)制表示不含7個(gè)(含7個(gè))連續(xù)的1或0,MARA加密算法推薦的s-box為:

ULONG32 B[4] = { 0xa4a8d57b , 0x5b5d193b , 0xc8a8309b , 0x73f9a978 }

然后利用如下算式得出K[i]:

K[i] = w ^ (( B[n] <<< ( low 5 bits of K[i-1]) & M)

三、明文加密

1、 第一步前向混合

輸入的128位明文分成四塊D[0],D[1],D[2],D[3],選取生成的40個(gè)密鑰的前四個(gè)分別與上述四塊數(shù)據(jù)進(jìn)行加操作。

D[0] += K[0];

D[1] += K[1];

D[2] += K[2];

D[3] += K[3];

果作為第一輪操作的輸入數(shù)據(jù)。

第一輪:

D[0]D[1]D[2]D[3]b0b1b2b3FirstTargetSecondTargetThirdTarget

輸入的四塊數(shù)據(jù)D[0],D[1],D[2],D[3],其中D[0]作為源數(shù)據(jù)(Source),剩下的3個(gè)作為目標(biāo)數(shù)據(jù),把32位的源數(shù)據(jù)D[0]分成8位的四塊b0,b1,b2,b3

b0和b2作為數(shù)組下標(biāo)從S0中尋找s-box替換數(shù):S0[b0],S0[b2]

b1和b3作為數(shù)組下標(biāo)從S1中尋找s-box替換數(shù):S1[b1],S1[b3]

對(duì)FirstTarget的操作:

FirstTarget按位異或S0[b0]后的加上S1[b1]的結(jié)果返回給FirstTarget。

對(duì)SecondTarget的操作:

SecondTarget加上S0[b2]的結(jié)果返回給SecondTarget。

對(duì)ThirdTarget的操作:

ThirdTarget按位異或S1[b3]的結(jié)果返回給ThirdTarget。

對(duì)Source的操作:

Source循環(huán)右移24位后的結(jié)果返回給Source。

把D[0],D[1],D[2],D[3]合并成128位的數(shù)據(jù),循環(huán)左移32位后作為下一輪的輸入。

2、第二步密碼核

把輸入的128位數(shù)據(jù)分成四塊D[0],D[1],D[2],D[3] ,其中D[0]作為源數(shù)據(jù)(Source),剩下的3個(gè)作為目標(biāo)數(shù)據(jù):

D[0]D[1]D[2]D[3]SourceFirstTargetSecondTargetThirdTarget

該步驟中有一個(gè)稱(chēng)為E-Fun(見(jiàn)下一節(jié))的操作,把Source和對(duì)應(yīng)兩個(gè)子密鑰(從第5個(gè)子密鑰開(kāi)始遞增,本輪的輸入子密鑰K[4],K[5]下一輪的子密鑰就是K[6],K[7])作為參數(shù)輸入,返回三個(gè)操作輸出L,M,R,然后把這三個(gè)輸出結(jié)果和三個(gè)目標(biāo)數(shù)進(jìn)行加法或異或操作,然后把Source循環(huán)左移13位,合并D[0],D[1],D[2],D[3]形成128位數(shù)據(jù),循環(huán)左移32位后作為下一輪的輸入。

本步驟共進(jìn)行16輪,假定E-Fun的第一個(gè)輸出數(shù)為L(zhǎng),第二個(gè)輸出數(shù)為M,第三個(gè)輸出數(shù)為R。

前8輪中,F(xiàn)irstTarget 和 L相加的結(jié)果返回給FirstTarget;SecondTarge和M相加的結(jié)果返回給SecondTarget;ThirdTarget和R按位異或的結(jié)果返回給ThirdTarget。

后8輪中,F(xiàn)irstTarget 和 R按位異或的結(jié)果返回給FirstTarget;SecondTarge和M相加的結(jié)果返回給SecondTarget;ThirdTarget和L相加的結(jié)果返回給ThirdTarget。

3、 E-Fun操作

該操作利用輸入的"種子"數(shù)據(jù)-D,和兩個(gè)加密子密鑰K1和K2生成3個(gè)輸出數(shù)據(jù)。

定義三個(gè)臨時(shí)變量L,M,R

◆ 把D(輸入的種子數(shù)據(jù))循環(huán)右移13位后的結(jié)果賦給R

◆ 把D和K1加操作的結(jié)果賦給M

◆ 取M的低9位作為s-box的索引找到替代數(shù)賦給L

◆ 把R和K2乘操作的結(jié)果作循環(huán)左移5位后的值返回給R

◆ 把L和R按位異或的結(jié)果返回給L

◆ 取R的低五位的值,把M循環(huán)左移這個(gè)值后的結(jié)果返回給M

◆ 把R循環(huán)左移5位后的結(jié)果返回給R

◆ 把L和R按位異或的結(jié)果返回給L

◆ 取R的低五位的值,把L循環(huán)左移這個(gè)值后的結(jié)果返回給L

把L,M,R作為E-Fun操作的第一,第二,第三輸出數(shù)返回.

4、第三步后向混合

把輸入的128位數(shù)據(jù)分成四塊D[0],D[1],D[2],D[3]第一輪:

D[0]D[1]D[2]D[3]b0b1b2b3FirstTargetSecondTargetThirdTarget

輸入的四塊數(shù)據(jù)D[0],D[1],D[2],D[3],其中D[0]作為源數(shù)據(jù)(Source),剩下的3個(gè)作為目標(biāo)數(shù)據(jù),把32位的源數(shù)據(jù)D[0]分成8位的四塊b0,b1,b2,b3。

b0和b2作為數(shù)組下標(biāo)從S1中尋找s-box替換數(shù):S1[b0],S1[b2]

b1和b3作為數(shù)組下標(biāo)從S0中尋找s-box替換數(shù):S0[b1],S0[b3]

對(duì)FirstTarget的操作:

FirstTarget按位異或S1[b0]后的結(jié)果返回給FirstTarget。

對(duì)SecondTarget的操作:

SecondTarget減去S0[b3]的結(jié)果返回給SecondTarget。

對(duì)ThirdTarget的操作:

ThirdTarget減去S1[b2]后與S0[b1]按位異或的結(jié)果返回給ThirdTarget。

對(duì)Source的操作:

Source循環(huán)左移24位后的結(jié)果返回給Source。

把D[0],D[1],D[2],D[3]合并成128位的數(shù)據(jù),循環(huán)左移32位后作為下一輪的輸入。

5、 密文的輸出

進(jìn)行完上述的操作后,對(duì)生成的密文D[0],D[1],D[2],D[3]與對(duì)應(yīng)的最后4個(gè)子密鑰進(jìn)行減法操作形成最終的密文。

D[0] -= K[36]; D[1] -= K[37];

D[2] -= K[38]; D[3] -= K[39];

四、密文解密

用于密文解密的40個(gè)子密鑰的生成和明文加密時(shí)的40個(gè)子密鑰的生成方法相同。

1、第一步前向混合

輸入的128位密文分成四塊D[0],D[1],D[2],D[3],選取生成的40個(gè)密鑰的最后四個(gè)分別與上述四塊數(shù)據(jù)進(jìn)行加操作。

D[0] += K[36];

D[1] += K[37];

D[2] += K[38];

D[3] += K[39];

結(jié)果作為第一輪操作的輸入數(shù)據(jù)。

第一輪:

D[0]D[1]D[2]D[3]b0b1b2b3FirstTargetSecondTargetThirdTarget

把D[0],D[1],D[2],D[3]合并成128位的數(shù)據(jù),循環(huán)左移32位后分成四塊D[0],D[1],D[2],D[3]其中D[0]作為源數(shù)據(jù)(Source),剩下的3個(gè)作為目標(biāo)數(shù)據(jù),把D[0]循環(huán)右移24位后的結(jié)果返回給D[0]。

把32位的源數(shù)據(jù)D[0]分成8位的四塊b0,b1,b2,b3

b0b1b2b3FirstTargetSecondTargetThirdTarget移動(dòng)前D[0]D[1]D[2]D[3]移動(dòng)后D[1]D[2]D[3]D[0]

b0和b2作為數(shù)組下標(biāo)從S1中尋找s-box替換數(shù):S1[b0],S1[b2]

b1和b3作為數(shù)組下標(biāo)從S0中尋找s-box替換數(shù):S0[b1],S0[b3]

對(duì)FirstTarget的操作:

FirstTarget按位異或S1[b0]的結(jié)果返回給FirstTarget。

對(duì)SecondTarget的操作:

SecondTarget加上S0[b3]的結(jié)果返回給SecondTarget。

對(duì)ThirdTarget的操作:

ThirdTarget按位異或S0[b1]后加上S1[b2]的結(jié)果返回給ThirdTarget。

本步驟共進(jìn)行8輪,在第一輪和第五輪中操作結(jié)尾處添加將Source加上FirstTarget的結(jié)果返回給Source的操作。在第二輪和第六輪中操作結(jié)尾處添加將Source加上ThirdTarget的結(jié)果返回給Source的操作。

2、第二步密碼核

把輸入的128位數(shù)據(jù)循環(huán)左移32位后分成四塊D[0],D[1],D[2],D[3],其中D[0]作為源數(shù)據(jù)(Source),剩下的3個(gè)作為目標(biāo)數(shù)據(jù),把Source循環(huán)右移13位的結(jié)果返回給Source,

D[0]D[1]D[2]D[3]SourceFirstTargetSecondTargetThirdTarget

把Source和對(duì)應(yīng)兩個(gè)子密鑰(從第34個(gè)子密鑰開(kāi)始遞減,本輪的輸入子密鑰K[34],K[35]下一輪的子密鑰就是K[32],K[33])作為E-Fun(同加密)操作的輸入?yún)?shù),返回三個(gè)操作輸出L,M,R,然后把這三個(gè)輸出結(jié)果和三個(gè)目標(biāo)數(shù)進(jìn)行減法或異或操作,然后,合并D[0],D[1],D[2],D[3]形成128位數(shù)據(jù)作為下一輪的輸入。

本步驟共進(jìn)行16輪,假定E-Fun的第一個(gè)輸出數(shù)為L(zhǎng),第二個(gè)輸出數(shù)為M,第三個(gè)輸出數(shù)為R。

前8輪中:

FirstTarget 和 R按位異或的結(jié)果返回給FirstTarget;

SecondTarge和M相減的結(jié)果返回給SecondTarget;

ThirdTarget和L相減的結(jié)果返回給ThirdTarget。

后8輪中:

FirstTarget 和 L相減的結(jié)果返回給FirstTarget;

SecondTarge和M相減的結(jié)果返回給SecondTarget;

ThirdTarget和R按位異或的結(jié)果返回給ThirdTarget。

3、第三步后向混合

把輸入的128位的數(shù)據(jù),循環(huán)左移32位后分成四塊D[0],D[1],D[2],D[3]。

D[0]D[1]D[2]D[3]b0b1b2b3FirstTargetSecondTargetThirdTarget

其中D[0]作為源數(shù)據(jù)(Source),剩下的3個(gè)作為目標(biāo)數(shù)據(jù),把D[0]循環(huán)左移24位后的結(jié)果返回給D[0],把32位的源數(shù)據(jù)D[0]分成8位的四塊b0,b1,b2,b3。

b0b1b2b3FirstTargetSecondTargetThirdTarget移動(dòng)前D[0]D[1]D[2]D[3]移動(dòng)后D[1]D[2]D[3]D[0]

b0和b2作為數(shù)組下標(biāo)從S0中尋找s-box替換數(shù):S0[b0],S0[b2]

b1和b3作為數(shù)組下標(biāo)從S1中尋找s-box替換數(shù):S1[b1],S1[b3]

對(duì)FirstTarget的操作:

將FirstTarget減去S1[b1]后再按位異或S0[b0]的結(jié)果返回給FirstTarget。

對(duì)SecondTarget的操作:

SecondTarget減去S0[b2]的結(jié)果返回給SecondTarget。

對(duì)ThirdTarget的操作:

ThirdTarget按位異或S1[b3]的結(jié)果返回給ThirdTarget。

本步驟共進(jìn)行8輪,在第3輪和第7輪的128位數(shù)據(jù)循環(huán)左移32位操作之后添加將Source減去FirstTarget的結(jié)果返回給Source的操作,.在第4輪和第8輪128位數(shù)據(jù)循環(huán)左移32位操作之后添加將Source減去ThirdTarget的結(jié)果返回給Source的操作。

4、 明文的輸出

進(jìn)行完上述的操作后,對(duì)生成的D[0],D[1],D[2],D[3]與對(duì)應(yīng)的起始4個(gè)子密鑰進(jìn)行減法操作還原成明文。

D[0] -= K[0]; D[1] -= K[1];

D[2] -= K[2]; D[3] -= K[3]。

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

數(shù)據(jù)加密的基本過(guò)程就是對(duì)原來(lái)為明文的文件或數(shù)據(jù)按某種算法進(jìn)行處理,使其成為不可讀的一段代碼,通常稱(chēng)為“密文”,使其只能在輸入相應(yīng)的密鑰之后才能顯示出本來(lái)內(nèi)容,通過(guò)這樣的途徑來(lái)達(dá)到保護(hù)數(shù)據(jù)不被非法人竊取、閱讀的目的。 該過(guò)程的逆過(guò)程為解密,即將該編碼信息轉(zhuǎn)化為其原來(lái)數(shù)據(jù)的過(guò)程。