DES密碼編譯演算法java實現(核心演算法+原始碼)

來源:互聯網
上載者:User

其實有了前一篇文章《DES密碼編譯演算法學習前奏》做為基礎之後,要實現DES演算法就是很容易的事了。
不過為了是自己不過於閉門造車,我還是從網上找了找原始碼,有用java寫的,有用C++寫的,不過所有代碼貌似都是一樣的。為啥說是一樣的呢?一開始寫一個類,然後把所有的方法往類裡面添,額,我猜測如果不是作者功力很高的話,很難一次就把這個給實現了。並且如果讀者功力不是很高的話(譬如說我這樣的),也是很難理解其中的調用關係的。還有一點值得一提的是網上流傳的方法似乎都是可以直接對文本加密的,所以對於想研究演算法的人來說,這無疑是個悲劇,你想呀,本來你想知道1+1=?,我告訴你說1+1+537674-637674+100000=2。這很糾結的。

由以上原因可以得出,我這裡只是簡單的把核心演算法寫了一下,如果大家要用它來加解密的話,需要自己擴充。當然,我也會繼續擴充的。
好了,說演算法,因為用的java實現,為了不至於寫的時候亂了手腳,先把類圖整理出來,然後就著圖來說:

可以看到,我一共是分了三個類,一個介面。IConst介面中放的都是置換表。DESFunction類其實就是前篇文章的一個實現,可以說是DES基礎方法類,裡麵包含DES實現的基本演算法。DES類就是簡單的調用了一下DESFunction類,組合其中的方法進行加密解密,其實DES中的兩個方法decryption()和encryp()完全可以寫成一個,因為其中的代碼幾乎是完全一樣,不過為了分析方便,我還是給分開了寫了。

關於這個貌似就這麼多要說的了,分析好了之後其實很容易。因為源碼太長了,所以直接打包上傳到空間了,大家自行下載,這裡只貼出DES類的源碼,因為這個應該是比較重要吧。

package mydes;</p><p>/**<br /> * DES類,用來加密位元據<br /> * @author the5fire<br /> * blog:http://www.the5fire.net<br /> *<br /> */<br />public class DES {</p><p> private DESFunction desFunction = new DESFunction();<br /> /**<br /> * 傳進二進位明文,返回DES加密後的密文<br /> * @param M<br /> * @return<br /> */<br /> public int[] encrypt(int[] M, int[] key) {<br /> int[] C = null;<br /> int[] M0 = new int[64];<br /> int[][] L0 = new int[17][32];<br /> int[][] R0 = new int[17][32];<br /> int[][] subkey = null;<br /> int[] result = new int[64];</p><p> subkey = desFunction.getSubkey(key);</p><p> M0 = desFunction.initReplace(M);</p><p> for (int j = 0; j < 32; j++) {<br /> L0[0][j] = M0[j]; // 明文左側的初始化<br /> R0[0][j] = M0[j + 32]; // 明文右側的初始化<br /> }</p><p> for (int i = 1; i < 17; i++) {<br /> int[] tmpR = desFunction.divPlus(L0[i-1], desFunction.coreFunction(R0[i-1], subkey[i-1]));<br /> for (int j = 0; j < 32; j++) {<br /> L0[i][j] = R0[i-1][j];<br /> R0[i][j] = tmpR[j];<br /> }</p><p> }</p><p> //進行賦值,R16放到左側,也就是前面32位;L16放到右側,也就是最後32位<br /> for (int i = 0; i < 32; i++) {<br /> result[i] = R0[16][i];<br /> }</p><p> for (int i = 0; i < 32; i++) {<br /> result[32+i] = L0[16][i];<br /> }</p><p> C = desFunction.endReplace(result);</p><p> return C;<br /> }</p><p> /**<br /> * 傳進DES加密後的密文,返回二進位明文<br /> * @param C<br /> * @return<br /> */<br /> public int[] decryption(int[] C, int[] K) {<br /> int[] M = null;<br /> int[] C0 = new int[64];<br /> int[][] L0 = new int[17][32];<br /> int[][] R0 = new int[17][32];<br /> int[][] subkey = null;<br /> int[] result = new int[64];</p><p> subkey = desFunction.getSubkey(K);</p><p> C0 = desFunction.initReplace(C);</p><p> for (int j = 0; j < 32; j++) {<br /> L0[0][j] = C0[j]; // 明文左側的初始化<br /> R0[0][j] = C0[j + 32]; // 明文右側的初始化<br /> }</p><p> for (int i = 1; i < 17; i++) {<br /> int[] tmpR = desFunction.divPlus(L0[i-1], desFunction.coreFunction(R0[i-1], subkey[16-i]));<br /> for (int j = 0; j < 32; j++) {<br /> L0[i][j] = R0[i-1][j];<br /> R0[i][j] = tmpR[j];<br /> }<br /> }</p><p> //進行賦值,R16放到左側,也就是前面32位;L16放到右側,也就是最後32位<br /> for (int i = 0; i < 32; i++) {<br /> result[i] = R0[16][i];<br /> }</p><p> for (int i = 0; i < 32; i++) {<br /> result[32+i] = L0[16][i];<br /> }</p><p> M = desFunction.endReplace(result);<br /> return M;<br /> }<br />}

這裡面L0[][]和R0[][]這個二維數組用的不太恰當,比較浪費空間,因為L0[i]和R0[i]只需要負責推匯出L0[i+1]和R[i+1]就可以了,後面就不會再用到L0[i]和R0[i]了,這裡用遞迴應該更好一點。不過這樣思考起來更直觀一點。

最後用書上的例子測試了一下,可以正常加解密。如果其中還有問題的話歡迎大家提醒。

原始碼地址:http://u.115.com/file/f465ac9bfe(有效期間30天,如果到期了你可以留言告訴我)

這是整個工程的打包,我用的是eclipse。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.