淺析DES算法的C語言實(shí)現(xiàn)

DES是國際上商用保密通信和計(jì)算機(jī)通信的最常用的加密算法。美國國家標(biāo)準(zhǔn)局(NBS)于1977年公布了由IBM公司研制的一種加密算法,并批準(zhǔn)把它作為非機(jī)要部門使用的數(shù)據(jù)加密標(biāo)準(zhǔn)(Data Encryption Standard),簡稱DES。

程序結(jié)構(gòu)框架
該C程序有3個(gè)入口參數(shù),Data、Key和Mode。其中Key為8字節(jié)共64位,是DES算法的工作密鑰;Data也為8字節(jié)64位,是要被加密或解密的數(shù)據(jù);Mode為工作方式;等于1時(shí)為加密,等于0時(shí)為解密。

程序首先由密鑰Key通過密鑰擴(kuò)展算法得到16個(gè)子密鑰,存放在k[0]—k[15]中。然后判斷Mode的值,若Mode=0,即為解密,將子密鑰數(shù)組k反置,即k[0]與k[15]互換、k[1]與k[14]互換,依此類推。

得到16個(gè)子密鑰后,對Data作初始置換IP,再將置換后的Data分成兩部分,前32位為L,后32位為R。然后從i=0到i=14作15輪循環(huán),每次循環(huán)作如下工作:L=R;R=L⊕F(R,k[i])。共作15輪循環(huán)而非16輪,這是因?yàn)镈ES算法中作的16輪迭代,在最后一輪并不進(jìn)行左右交換,所以把第16輪迭代在循環(huán)外單獨(dú)實(shí)現(xiàn),即在循環(huán)結(jié)束時(shí)作L=L⊕F(R,k[i])。

最后合并L、R即得到64位輸出結(jié)果,Mode=1時(shí)輸出的是密文,Mode=0時(shí)輸出的是明文。

詳解程序的幾個(gè)關(guān)鍵部件
程序有幾個(gè)關(guān)鍵部件,分別是;子密鑰的生成,初始置換IP與其逆置換IP-1,F(xiàn)函數(shù)等。

1、子密鑰的生成
從用戶處得到的64位密鑰Key中,每8位為一組,每組第8位是校驗(yàn)位。在加/解密過程中,校驗(yàn)位是沒用的。所以首先將Key由縮減變換PC縮減到56位。具體實(shí)現(xiàn)過程如下:
把PC-1表存入數(shù)組pc1中,縮減時(shí)只需循環(huán)作K[i]=Key[pc1[i]]即可(56次)。

2、初始置換IP與其逆置換IP-1
初始置換IP與其逆置換IP-1的實(shí)現(xiàn)比較簡單,方法類似于生成子密鑰中的縮減變換PC-1和PC-2。也是把IP和IP-1表分別存入數(shù)組ip和fp中。然后通過查詢這兩個(gè)數(shù)組取得置換時(shí)輸入的數(shù)據(jù)的對應(yīng)位即可。

3、F函數(shù)的實(shí)現(xiàn)
F函數(shù)是DES算法的核心,DES算法執(zhí)行效率的高低主要看F函數(shù)的設(shè)計(jì)實(shí)現(xiàn),所以F函數(shù)的設(shè)計(jì)實(shí)現(xiàn)至關(guān)重要。

F函數(shù)的輸入是DES算法各輪迭代中的R(i)和子密鑰k(i),即程序中的R和k[i]。其中R為32比特?cái)?shù)據(jù),k[i]為48比特?cái)?shù)據(jù)。算法首先要通過擴(kuò)充變換E把R擴(kuò)充為48比特。但實(shí)際編程時(shí)并不這樣做,這是因?yàn)楦鶕?jù)擴(kuò)充變換E的自身特點(diǎn),可以巧妙的利用移位來達(dá)到擴(kuò)充的效果。在擴(kuò)充變換E(m)=c中,E(m)的下標(biāo)與m的下標(biāo)的對應(yīng)關(guān)系如表1所示。

把變換前的32比特?cái)?shù)據(jù)先循環(huán)左移一位。然后如果右移26位,那么移位后的32比特?cái)?shù)據(jù)的后6位正是按擴(kuò)充變換得到的48比特?cái)?shù)據(jù)的前6位;如果右移22位,那么移位后的后6位數(shù)據(jù)是按擴(kuò)充變換得到的48比特?cái)?shù)據(jù)的第7至第12位;以此類推,右移18位得到第13至18位,等等。這樣就得到了6位為一組的,共計(jì)8組的數(shù)據(jù)。而恰好,F(xiàn)函數(shù)還要經(jīng)8個(gè)S盒進(jìn)行縮減變換,于是可以方便的把48比特子密鑰也分成8組,分別與用R移位得到的8組數(shù)據(jù)作按位與運(yùn)算。再把得到的8組數(shù)據(jù)分別經(jīng)8個(gè)S盒作縮減變換。

最后F函數(shù)要經(jīng)P置換得到輸出結(jié)果,具體實(shí)現(xiàn)過程如下:
把P置換表存入數(shù)組p32中,然后求得P置換的逆置換放到數(shù)組pbox中。把S盒存儲(chǔ)在二維數(shù)組si中。然后根據(jù)si中數(shù)據(jù)特點(diǎn),通過數(shù)組pbox中數(shù)據(jù)把P置換和S盒縮減整合到一起,寫成數(shù)組sp。之后,將上面所介紹的8組數(shù)據(jù)分別通過sp查詢,就可直接得到輸出結(jié)果。F函數(shù)定義如下:
淺析DES算法的C語言實(shí)現(xiàn)