這幾天看了一下DES加密,認真看的話這個演算法並不難,有時候覺得困難時因為自己看不下去。茫茫人海,和己者寡。
<!--[endif]-->
要學習DES密碼編譯演算法,我覺得有幾點是要先瞭解的,下面一一列出來:
<!--[if !supportLists]-->1. <!--[endif]-->模2加運算
這個是比較好理解的,就是兩個數相加然後除2取餘。
<!--[if !supportLists]-->2. <!--[endif]-->理解其中的置換
一開始的時候就會對明文進行置換,通過初始置換IP:
<!--[endif]-->
這個表的含義就是,第一個58就是你明文中的第58個元素,你要放到1的位置,然後把明文中第50個元素放到2的位置,以此類推。
<!--[if !supportLists]-->3. <!--[endif]-->子密鑰的產生
<!--[endif]-->
子密鑰產生分為三步走:
第一步,先把密鑰中的同位為去掉,然後根據選擇置換PC-1講剩下的密鑰分成兩塊C0和D0;
第二步,將C0和D0進行迴圈左移變換,變換後產生C1和D1,然後C1和D1合并,通過選擇置換PC-2產生子密鑰K1;
第三步,C1和D1再次經過迴圈左移變換,產生C2和D2,C2和D2合并,通過選擇置換PC-2產生子密鑰K2;
第四步,以此類推,需要注意其中迴圈左移的位元,一共是迴圈左移十六次,其中LS1(第一次),LS2(第二次),LS9,LS16是迴圈左移一位,其他的都是左移兩位。
<!--[if !supportLists]-->4. <!--[endif]-->DES的核心——加密函數 <!--[if !vml]--><!--[endif]-->
加密函數的加密過程也可以通過三步走:
第一步,將R0通過位選擇函數E置換,其實這是一個擴充的置換,因為R0本身是32位的(這點先記住就行了,後一篇文章會說),而產生的子密鑰是48位的,因此需要擴充一下,方能按位元運算。
第二步,將擴充完的R0和子密鑰K1進行模2加運算,得到48位的一個串,把這個串從左至右分為8組,每組6個字元。這裡設8組分別為B1,B2,B3,B4,B5,B6,B7,B8。其中Bj=b1b2b3b4b5b6。
第三步,通過S盒來收縮,把每組中的b1b6放一塊,換算為十進位,b2b3b4b5放一塊,也換算為十進位。b1b6代表S盒中的行標,b2b3b4b5代表列標。比如說B1=011111,那麼b1b6就等於十進位的1,b2b3b4b5等於十進位的15,也就是對應表中的S1塊中的第1行(注意不是0行),15列,也就是8,然後把8變為二進位1000。這就完成了S盒收縮變換,然後通過S盒輸出的就是32位的一個串。
<!--[endif]-->
第四步,把32位的串經過置換函數P的置換得到的結果就是這個核心函數的產物了。