歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java之Caesar與Vigenere實現

1  背景介紹

話說目前做所謂"企業"開發的語言基本就集中在運用.Net和J2EE上了。又話說,在下很不幸又和Java"同流合污"了一把。現在回想起來,真是感慨萬千啊~遙想公瑾當年,小喬初嫁了,雄姿英發,羽扇綸巾,談笑間,強虜灰飛煙滅。~ 額,下面插播一下正題。其實,目前國內用Java做真正的"企業級"得其實並不是很多,絕大多數都是用個SSH1就覺得這就是Java之企業級開發了,之後就開始沾沾自喜了。這你說讓Servlet和EJB3情何以堪啊~所以說,目前國內大多數Java的開發環境並不能說真正的武裝到牙齒。 基於這樣的原因,有些時候,我們在做一些"工程"的時候~,當然對於多數情況就是IDE菜單選擇"新建工程"這麼個選項出來的貨了,對於某些應用,需要用到一些加密算法,雖說Java自身帶有專門的加密庫,但是那個用起來的確有些麻煩,而且加密算法還是動態加載的,在本地測試的話問題還不是很大,痛苦的是萬一到服務器上一跑,這個加密算法加載失敗什麼的,這可就大條了。如果說是一個什麼認證系統之類的,那也就罷了。但如果只是一些對密碼強要求很低,但不加密又不行的情況,那的確是挺麻煩的一件事情。 那麼,處於對易用性,易實現性的考慮,那些什麼DES算法就暫時不考慮了。如果真有這個需求的話,相信找個健壯性很高的DES問題還不是很大的。而在那許多經典的加密算法中,要數Caesar加密比較經典了。所以,處於這樣的一個需求,就打算實現一個經典加密算法。

2  Caesar加密算法

Caesar加密算法算是經典加密算法中最簡單的了。對於標准的Caesar來說,就是把字母序列向後移動一定的數量,替換後得到密文,而這個數量為固定值3。也就是說,在都是由英文字母組成的文本裡,字母A將會被替換成D,B會被替換成E,以此類推。

對於Caesar加密算法,存在幾點問題。首先是這個作為密鑰的值是個固定的3,而且字母表又是按順序排列的,所以只要對方知道你是用Caesar加密的,就很容易的脫密成原文,雖然有些麻煩,但是這就和用原文是差不多的,即使對加密要求很低也不能低成這樣不是?然後是這個替換表,因為是基於字母表的,所以對於英文來說只能加密英文字母,這樣就不能被支持了。最後,因為替換是固定的,所以,對於同一個字母,http://www.linuxidc.com加密後的字母也是固定的。比如"AAA"這個文本加密後,就是"DDD",看起來還不夠迷惑人。

基於以上的原因,我這裡實現的Caesar做了一些修改,但是總的思路還是Caesar。

  1. public class Caesar {  
  2.     private String table;  
  3.     private int seedA = 1103515245;  
  4.     private int seedB = 12345;  
  5.       
  6.     public Caesar(String table, int seed) {  
  7.         this.table = chaos(table, seed, table.length());  
  8.     }  
  9.     public Caesar(String table) {  
  10.         this(table, 11);  
  11.     }  
  12.     public Caesar() {  
  13.         this(11);  
  14.     }  
  15.     public Caesar(int seed) {  
  16.         this("ABCDEFGHIJKLMNOPQRSTUVWXYZ", seed);  
  17.     }  
  18.     public char dict(int i, boolean reverse) {  
  19.         int s = table.length(), index = reverse ? s - i : i;  
  20.         return table.charAt(index);  
  21.     }  
  22.     public int dict(char c,  boolean reverse) {  
  23.         int s = table.length(), index = table.indexOf(c);  
  24.         return reverse ? s - index : index;  
  25.     }  
  26.     public int seed(int seed) {  
  27.         long temp = seed;  
  28.         return (int)((temp * seedA + seedB) & 0x7fffffffL);  
  29.     }  
  30.   
  31.     public String chaos(String data, int seed, int cnt) {  
  32.         StringBuffer buf = new StringBuffer(data);  
  33.         char tmp; int a, b, r = data.length();  
  34.         for (int i = 0; i < cnt; i += 1) {  
  35.             seed = seed(seed); a = seed % r;  
  36.             seed = seed(seed); b = seed % r;  
  37.             tmp = buf.charAt(a);  
  38.             buf.setCharAt(a, buf.charAt(b));  
  39.             buf.setCharAt(b, tmp);  
  40.         }  
  41.         return buf.toString();  
  42.     }  
  43.   
  44.     public String crypto(boolean reverse,  
  45.                          int key, String text) {  
  46.         String ret = null;  
  47.         StringBuilder buf = new StringBuilder();  
  48.         int m, s = table.length(), e = text.length();  
  49.   
  50.         for(int i = 0; i < e; i += 1) {  
  51.             m = dict(text.charAt(i), reverse);  
  52.             if (m < 0break;  
  53.             m = m + key + i;  
  54.             buf.append(dict(m % s, reverse));  
  55.         }  
  56.         if (buf.length() == e)  
  57.             ret = buf.toString();  
  58.         return ret;  
  59.     }  
  60.     public String encode(int key, String text) {  
  61.         return crypto(false, key, text);  
  62.           
  63.     }  
  64.     public String decode(int key, String text) {  
  65.         return crypto(true , key, text);  
  66.     }  
  67.       
  68.     public static void main(String[] args) {  
  69.         Caesar caesar = new Caesar();  
  70.         String data = caesar.encode(32"APPLE");  
  71.         caesar.decode(32, data);  
  72.     }  
  73. }  
在上面的Caesar實現中,我用一個整數替代了原來作為密鑰的固定值3。其次,可以通過傳入不同的字符集讓這個加密算法的適用性更廣泛。最後,算法類在初始化的時候,會對替換表做一次擾亂操作,這樣的話,即使是相同的替換表,因為初始化傳入的seed不同,加密出來的內容也會不同。至於程序的細節,我想源碼會更直觀的告訴你的。
Copyright © Linux教程網 All Rights Reserved